GamepadPlatformDataFetcherTizenTV::GamepadPlatformDataFetcherTizenTV() {
gamepad_manager_ = nullptr;
- if (Gamepad_Create()) {
-#if TIZEN_VERSION_AT_LEAST(8, 0, 0)
- // initialize autoinput
- VirtualKey_Initialize("gamepad-service");
-#endif
- Initialize();
- } else {
- LOG(ERROR) << "[Gamepad_LOG] "
- "GamepadPlatformDataFetcherTizenTV::"
- "GamepadPlatformDataFetcherTizenTV() Gamepad_Create() ERROR "
- "!!!";
- }
+ polling_runner_ = nullptr;
}
+// invoked in polling thread
GamepadPlatformDataFetcherTizenTV::~GamepadPlatformDataFetcherTizenTV() {
CHECK(gamepad_manager_ != nullptr);
gamepad_manager_->UnregisterCallback(this);
}
}
+// OnAddedToProvider is called in polling thread in initialize time
+// gamepad initialize should be done here instead of constructor.
+void GamepadPlatformDataFetcherTizenTV::OnAddedToProvider() {
+ polling_runner_ = base::SingleThreadTaskRunner::GetCurrentDefault();
+ DCHECK(polling_runner_);
+
+ if (Gamepad_Create()) {
+#if TIZEN_VERSION_AT_LEAST(8, 0, 0)
+ // initialize autoinput
+ VirtualKey_Initialize("gamepad-service");
+#endif
+ Initialize();
+ } else {
+ LOG(ERROR) << "[Gamepad_LOG] "
+ "GamepadPlatformDataFetcherTizenTV::"
+ "GamepadPlatformDataFetcherTizenTV() Gamepad_Create() ERROR "
+ "!!!";
+ }
+}
+
GamepadSource GamepadPlatformDataFetcherTizenTV::source() {
return Factory::static_source();
}
UTF8toUTF16(pad.id, sizeof(pad.id), id, Gamepad::kIdLengthCap);
}
+void GamepadPlatformDataFetcherTizenTV::HandleGamepadConnectionStatus(
+ int type,
+ const OCIDevInfo& deviceinfo) {
+ LOG(INFO) << " deviceinfo.UID " << deviceinfo.UID << " deviceinfo.name "
+ << deviceinfo.name;
+
+ switch (type) {
+ case OCI_EVENT_DEV_CONNECT: {
+ for (size_t i = 0; i < Gamepads::kItemsLengthCap; i++) {
+ if (gamepad_items_[i] == nullptr) {
+ LOG(INFO) << " connected";
+ gamepad_items_[i] = OCIGamepadItem::Create(
+ gamepad_manager_, &deviceinfo, &data_.items[i], i);
+ if (gamepad_items_[i]) {
+ InitMapping(i);
+ break;
+ }
+ }
+ }
+ break;
+ }
+
+ case OCI_EVENT_DEV_DISCONNECT: {
+ for (size_t i = 0; i < Gamepads::kItemsLengthCap; i++) {
+ if (gamepad_items_[i] != nullptr &&
+ (strcmp(gamepad_items_[i]->GetUID(), deviceinfo.UID) == 0)) {
+ LOG(INFO) << " gamepad_items_[" << i << "]->GetUID() "
+ << gamepad_items_[i]->GetUID();
+ gamepad_items_[i]->Shutdown();
+ gamepad_items_[i] = nullptr;
+ break;
+ }
+ }
+ break;
+ }
+ default: {
+ break;
+ }
+ }
+}
void GamepadPlatformDataFetcherTizenTV::t_OnCallback(int type,
void* pparam1,
void* pparam2,
void* pparam3) {
+ LOG(INFO) << "[Gamepad_LOG] t_OnCallback";
+ LOG(INFO) << type << " pparam1 " << reinterpret_cast<char*>(pparam1);
+ LOG(INFO) << type << " pparam2 " << reinterpret_cast<char*>(pparam2);
+
int evType = 0;
OCIDevInfo dev_info;
std::string sType = "";
else if (type == OCI_EVENT_DEV_DISCONNECT)
sType = " DISCONNECT ";
- LOG(INFO) << sType << " pparam1 " << reinterpret_cast<char*>(pparam1);
#if TIZEN_VERSION_AT_LEAST(8, 0, 0)
strncpy(dev_info.UID, (char*)pparam1, OCI_SIZE_ID - 1);
strncpy(dev_info.name, (char*)pparam2, OCI_SIZE_NAME - 1);
}
#endif
- switch (type) {
- case OCI_EVENT_DEV_CONNECT: {
- for (size_t i = 0; i < Gamepads::kItemsLengthCap; i++) {
- if (gamepad_items_[i] == nullptr) {
- LOG(INFO) << " connected";
- gamepad_items_[i] = OCIGamepadItem::Create(
- gamepad_manager_, &dev_info, &data_.items[i], i);
- if (gamepad_items_[i]) {
- InitMapping(i);
- break;
- }
- } else {
- continue;
- }
- }
- break;
- }
-
- case OCI_EVENT_DEV_DISCONNECT: {
- for (size_t i = 0; i < Gamepads::kItemsLengthCap; i++) {
- if (gamepad_items_[i] != nullptr &&
- (strcmp(gamepad_items_[i]->GetUID(), dev_info.UID) == 0)) {
- LOG(INFO) << " gamepad_items_[" << i << "]->GetUID() "
- << gamepad_items_[i]->GetUID();
- LOG(INFO) << " disconnected";
- gamepad_items_[i]->Shutdown();
- gamepad_items_[i] = nullptr;
- break;
- }
- }
- break;
- }
- case OCI_EVENT_DEV_STATUS: {
- break;
- }
- default: {
- break;
- }
- }
+ // operate gamepad in polling thread.
+ DCHECK(polling_runner_);
+ polling_runner_->PostTask(
+ FROM_HERE,
+ base::BindOnce(
+ &GamepadPlatformDataFetcherTizenTV::HandleGamepadConnectionStatus,
+ base::Unretained(this), type, dev_info));
}
void GamepadPlatformDataFetcherTizenTV::PlayEffect(