|
|
|
@ -81,34 +81,36 @@ int main(int argc, char** argv)
|
|
|
|
// For store Discover systems in a list
|
|
|
|
// For store Discover systems in a list
|
|
|
|
std::vector<systemHandlerInfo> systemHandlerInfos;
|
|
|
|
std::vector<systemHandlerInfo> systemHandlerInfos;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Subscribe to new system discovery
|
|
|
|
// Subscribe to new system discovery
|
|
|
|
mavsdk.subscribe_on_new_system([&mavsdk, &systemHandlerInfos]() {
|
|
|
|
mavsdk.subscribe_on_new_system([&mavsdk, &systemHandlerInfos]() {
|
|
|
|
// Get the last subscribed system
|
|
|
|
// Get the last subscribed system
|
|
|
|
auto comingSystems = mavsdk.systems();
|
|
|
|
auto comingSystems = mavsdk.systems();
|
|
|
|
std::shared_ptr<System> sys = comingSystems.back();
|
|
|
|
std::shared_ptr<System> sys;
|
|
|
|
int sysid = static_cast<int>(sys->get_system_id());
|
|
|
|
int sysid;
|
|
|
|
// Avoid Duplicate System ID (Component ID is careless, maybe determind by UUID will be better?)
|
|
|
|
|
|
|
|
for(int i = 0;i < systemHandlerInfos.size();i++) {
|
|
|
|
// Avoid Duplicate System ID
|
|
|
|
if(sys->get_system_id() == systemHandlerInfos[i].systemID){
|
|
|
|
bool duplicated;
|
|
|
|
comingSystems.pop_back();
|
|
|
|
for(int i=0; i<comingSystems.size(); i++){
|
|
|
|
if(comingSystems.size() != 0){
|
|
|
|
sys = comingSystems[i];
|
|
|
|
sys = comingSystems.back();
|
|
|
|
sysid = static_cast<int>(sys->get_system_id());
|
|
|
|
} else {
|
|
|
|
duplicated = false;
|
|
|
|
std::cout << "(mavone.cpp:main) Duplicate System ID Collision : " << sysid << std::endl;
|
|
|
|
for(int j=0; j<systemHandlerInfos.size(); j++){
|
|
|
|
return;
|
|
|
|
if(sysid == systemHandlerInfos[j].systemID){
|
|
|
|
}
|
|
|
|
duplicated = true;
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// make std::shared_ptr<MAVSDK::System> back to MAVSDK::System
|
|
|
|
|
|
|
|
System& new_system = *sys;
|
|
|
|
if(duplicated == false){
|
|
|
|
// std::cout << "system detect : " << sysid << "(Debug)"<< std::endl; // debug
|
|
|
|
|
|
|
|
|
|
|
|
// Get New System
|
|
|
|
|
|
|
|
System& new_system = *sys; // make std::shared_ptr<MAVSDK::System> back to MAVSDK::System
|
|
|
|
|
|
|
|
std::cout << "(mavone.cpp:subscribe_on_new_system) system detect sysid : " << sysid << "(Debug)"<< std::endl; // debug
|
|
|
|
|
|
|
|
|
|
|
|
// Let handler progrem deal with System
|
|
|
|
// Let handler progrem deal with System
|
|
|
|
std::thread systemHandleThread([&new_system]() {systemHandler(new_system);});
|
|
|
|
std::thread systemHandleThread([&new_system]() {systemHandler(new_system);});
|
|
|
|
gVehicleCommand[sysid]["is_connected"] = 1;
|
|
|
|
// gHandlerMask[sysid]["is_connected"] = 1;
|
|
|
|
|
|
|
|
|
|
|
|
// Need some extra time fpr complete init
|
|
|
|
|
|
|
|
sleep_for(milliseconds(500));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
systemHandlerInfos.push_back(systemHandlerInfo{
|
|
|
|
systemHandlerInfos.push_back(systemHandlerInfo{
|
|
|
|
sysid,
|
|
|
|
sysid,
|
|
|
|
@ -117,6 +119,13 @@ int main(int argc, char** argv)
|
|
|
|
-1
|
|
|
|
-1
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// only get ONE system each time
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Need some extra time fpr complete init
|
|
|
|
|
|
|
|
// sleep_for(milliseconds(500));
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
// MySQL connection is here
|
|
|
|
// MySQL connection is here
|
|
|
|
@ -152,7 +161,7 @@ int main(int argc, char** argv)
|
|
|
|
for ( auto& handlerInfo : systemHandlerInfos) {
|
|
|
|
for ( auto& handlerInfo : systemHandlerInfos) {
|
|
|
|
switch (handlerInfo.handlerState) {
|
|
|
|
switch (handlerInfo.handlerState) {
|
|
|
|
case systemHandlerState::Init :
|
|
|
|
case systemHandlerState::Init :
|
|
|
|
std::cout << "(mavone.cpp:main) SystemHandler:" << std::to_string(handlerInfo.systemID) << " at Init " << std::endl; //debug
|
|
|
|
std::cout << "(mavone.cpp:while) SystemHandler:" << std::to_string(handlerInfo.systemID) << " at Init " << std::endl; //debug
|
|
|
|
|
|
|
|
|
|
|
|
// 用系統時間生成的隨機數 標記目前欄位
|
|
|
|
// 用系統時間生成的隨機數 標記目前欄位
|
|
|
|
std::srand(std::time(0));
|
|
|
|
std::srand(std::time(0));
|
|
|
|
@ -179,16 +188,16 @@ int main(int argc, char** argv)
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case systemHandlerState::Prologue :
|
|
|
|
case systemHandlerState::Prologue :
|
|
|
|
std::cout << "(mavone.cpp:main) SystemHandler:" << std::to_string(handlerInfo.systemID) << " at Prologue " << std::endl; //debug
|
|
|
|
std::cout << "(mavone.cpp:while) SystemHandler:" << std::to_string(handlerInfo.systemID) << " at Prologue " << std::endl; //debug
|
|
|
|
|
|
|
|
|
|
|
|
// 確認之前的 handlerInfo.mysqlSN 有正常被取得 若沒有整個程式即將關閉
|
|
|
|
// 確認之前的 handlerInfo.mysqlSN 有正常被取得 若沒有整個程式即將關閉
|
|
|
|
if (handlerInfo.mysqlSN == -1) {
|
|
|
|
if (handlerInfo.mysqlSN == -1) {
|
|
|
|
reset = true;
|
|
|
|
reset = true;
|
|
|
|
std::cout << "(mavone.cpp:main) handlerInfo.mysqlSN not aquired. Fatal Error. Shutdown all service. " << std::endl;
|
|
|
|
std::cout << "(mavone.cpp:while) handlerInfo.mysqlSN not aquired. Fatal Error. Shutdown all service. " << std::endl;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 確認系統是否仍連線
|
|
|
|
// 確認系統是否仍連線
|
|
|
|
if(gVehicleCommand[handlerInfo.systemID]["is_connected"] == 0){
|
|
|
|
if (gHandlerMask[handlerInfo.systemID]["is_connected"] == 0) {
|
|
|
|
handlerInfo.handlerState = systemHandlerState::Disconnected;
|
|
|
|
handlerInfo.handlerState = systemHandlerState::Disconnected;
|
|
|
|
// 更新 mavsys_connect_status 欄位
|
|
|
|
// 更新 mavsys_connect_status 欄位
|
|
|
|
sqlString = "UPDATE NodeRed_one SET mavsys_connect_status = 'Disconnected' WHERE SerialNO = " + std::to_string(handlerInfo.mysqlSN) + ";";
|
|
|
|
sqlString = "UPDATE NodeRed_one SET mavsys_connect_status = 'Disconnected' WHERE SerialNO = " + std::to_string(handlerInfo.mysqlSN) + ";";
|
|
|
|
@ -204,6 +213,7 @@ int main(int argc, char** argv)
|
|
|
|
|
|
|
|
|
|
|
|
// 切換到下一個狀態
|
|
|
|
// 切換到下一個狀態
|
|
|
|
handlerInfo.handlerState = systemHandlerState::Ready;
|
|
|
|
handlerInfo.handlerState = systemHandlerState::Ready;
|
|
|
|
|
|
|
|
std::cout << "(mavone.cpp:while) SystemHandler:" << std::to_string(handlerInfo.systemID) << " into Ready " << std::endl; //debug
|
|
|
|
// 更新 mavsys_connect_status 欄位
|
|
|
|
// 更新 mavsys_connect_status 欄位
|
|
|
|
sqlString = "UPDATE NodeRed_one SET mavsys_connect_status = 'Ready' WHERE SerialNO = " + std::to_string(handlerInfo.mysqlSN) + ";";
|
|
|
|
sqlString = "UPDATE NodeRed_one SET mavsys_connect_status = 'Ready' WHERE SerialNO = " + std::to_string(handlerInfo.mysqlSN) + ";";
|
|
|
|
stmt->execute(sqlString);
|
|
|
|
stmt->execute(sqlString);
|
|
|
|
@ -212,7 +222,7 @@ int main(int argc, char** argv)
|
|
|
|
// std::cout << "SystemHandler:" << std::to_string(handlerInfo.systemID) << " at Ready " << std::endl; //debug
|
|
|
|
// std::cout << "SystemHandler:" << std::to_string(handlerInfo.systemID) << " at Ready " << std::endl; //debug
|
|
|
|
|
|
|
|
|
|
|
|
// 確認系統是否仍連線
|
|
|
|
// 確認系統是否仍連線
|
|
|
|
if(gVehicleCommand[handlerInfo.systemID]["is_connected"] == 0){
|
|
|
|
if (gHandlerMask[handlerInfo.systemID]["is_connected"] == 0) {
|
|
|
|
handlerInfo.handlerState = systemHandlerState::Disconnected;
|
|
|
|
handlerInfo.handlerState = systemHandlerState::Disconnected;
|
|
|
|
// 更新 mavsys_connect_status 欄位
|
|
|
|
// 更新 mavsys_connect_status 欄位
|
|
|
|
sqlString = "UPDATE NodeRed_one SET mavsys_connect_status = 'Disconnected' WHERE SerialNO = " + std::to_string(handlerInfo.mysqlSN) + ";";
|
|
|
|
sqlString = "UPDATE NodeRed_one SET mavsys_connect_status = 'Disconnected' WHERE SerialNO = " + std::to_string(handlerInfo.mysqlSN) + ";";
|
|
|
|
@ -243,30 +253,41 @@ int main(int argc, char** argv)
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
case systemHandlerState::Disconnected :
|
|
|
|
case systemHandlerState::Disconnected :
|
|
|
|
std::cout << "SystemHandler:" << std::to_string(handlerInfo.systemID) << " at Disconnected " << std::endl; //debug
|
|
|
|
std::cout << "(mavone.cpp:while) SystemHandler:" << std::to_string(handlerInfo.systemID) << " at Disconnected. " << std::endl; //debug
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
reset = true; //debug
|
|
|
|
// reset = true; //debug
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 刪除被輪尋到的 handlerInfo
|
|
|
|
|
|
|
|
// systemHandlerInfos.erase(std::remove_if(systemHandlerInfos.begin(), systemHandlerInfos.end(), [&](const auto& info) {
|
|
|
|
|
|
|
|
// return info.handlerState == systemHandlerState::Disconnected;
|
|
|
|
|
|
|
|
// }), systemHandlerInfos.end());
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// When Progrem Terminate
|
|
|
|
// When Progrem Terminate
|
|
|
|
reset = true;
|
|
|
|
reset = true;
|
|
|
|
|
|
|
|
|
|
|
|
// make all thread join
|
|
|
|
std::cout << "(mavone.cpp:main) Main Loop End !!!!!!" << std::endl;
|
|
|
|
for( auto& handlerInfo : systemHandlerInfos){
|
|
|
|
|
|
|
|
handlerInfo.systemThread.join();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// terminate MySQL Indicator
|
|
|
|
// terminate MySQL Indicator
|
|
|
|
delete res;
|
|
|
|
delete res;
|
|
|
|
delete stmt;
|
|
|
|
delete stmt;
|
|
|
|
delete con;
|
|
|
|
delete con;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// make all thread join
|
|
|
|
|
|
|
|
for( auto& handlerInfo : systemHandlerInfos){
|
|
|
|
|
|
|
|
handlerInfo.systemThread.join();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// delete mavsdk;
|
|
|
|
|
|
|
|
// ~mavsdk;
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|