| | |
| | | #include <cstdint> |
| | | #include <cstdlib> |
| | | #include <cstring> |
| | | #include <pthread.h> |
| | | #include <thread> |
| | | #include <mutex> |
| | | #include <semaphore.h> |
| | | #include <cmath> |
| | | #include "platform.h" |
| | |
| | | |
| | | static CTcpPort *ctp = NULL; |
| | | |
| | | static pthread_mutex_t events_mutex = PTHREAD_MUTEX_INITIALIZER; |
| | | static std::mutex events_mutex; |
| | | |
| | | static struct gpsBrief gbf; |
| | | static struct rtkBrief rbf; |
| | |
| | | static struct event_t * FetchEvent(void); |
| | | static void RemoveEvent(void); |
| | | |
| | | static void ReqRtkPlatformConfigTimeout(union sigval sig); |
| | | static void ReqRtkPlatformConfigTimeout(apptimer_var_t val); |
| | | |
| | | static void TcpEventCallback(int stat, void *p, void *context); |
| | | static void TcpDataCallback(void *buffer, int length, void *p, void *context); |
| | | |
| | | static void ConnectPlatform(const char *domain_name, int port); |
| | | static void ConnectPlatformLater(union sigval sig); |
| | | static void ConnectPlatformLater(apptimer_var_t val); |
| | | |
| | | static void *StatusListenThread(void *p); |
| | | static void StatusListenThread(void); |
| | | static void PlatformChangeEntry(uint32_t events, const uint8_t *data, int length); |
| | | |
| | | static void RegisterPlatform(void); |
| | | static void RegisterPlatformTimeout(union sigval sig); |
| | | static void RegisterPlatformTimeout(apptimer_var_t val); |
| | | |
| | | static void LoginPlatform(void); |
| | | static void LoginPlatformTimeout(union sigval sig); |
| | | static void TriggerHeartbeat(union sigval sig); |
| | | static void RequestRtkNoResp(union sigval sig); |
| | | static void LoginPlatformTimeout(apptimer_var_t val); |
| | | static void TriggerHeartbeat(apptimer_var_t val); |
| | | static void RequestRtkNoResp(apptimer_var_t val); |
| | | |
| | | |
| | | static void AddEvnet(uint32_t event, const uint8_t *data, int length) |
| | |
| | | memcpy(nw->event.data, data, length); |
| | | } |
| | | |
| | | pthread_mutex_lock(&events_mutex); |
| | | lock_guard<std::mutex> lock(events_mutex); |
| | | |
| | | struct event_queue_t *p = eventQueue; |
| | | |
| | |
| | | eventQueue = nw; |
| | | else |
| | | p->next = nw; |
| | | |
| | | pthread_mutex_unlock(&events_mutex); |
| | | } |
| | | |
| | | static struct event_t * FetchEvent(void) |
| | | { |
| | | struct event_t *evp = NULL; |
| | | |
| | | pthread_mutex_lock(&events_mutex); |
| | | lock_guard<std::mutex> lock(events_mutex); |
| | | struct event_queue_t *p = eventQueue; |
| | | |
| | | if (p != NULL) { |
| | | evp = &p->event; |
| | | } |
| | | |
| | | pthread_mutex_unlock(&events_mutex); |
| | | |
| | | return evp; |
| | | } |
| | |
| | | { |
| | | void *p1 = NULL, *p2 = NULL; |
| | | |
| | | pthread_mutex_lock(&events_mutex); |
| | | lock_guard<std::mutex> lock(events_mutex); |
| | | struct event_queue_t *p = eventQueue; |
| | | |
| | | if (p != NULL) { |
| | |
| | | p1 = p; |
| | | p2 = p->event.data; |
| | | } |
| | | pthread_mutex_unlock(&events_mutex); |
| | | |
| | | if (p2 != NULL) |
| | | free(p2); |
| | |
| | | memset(&rbf, 0, sizeof(rbf)); |
| | | memset(&defaultMcuRom, 0, sizeof(defaultMcuRom)); |
| | | |
| | | pthread_mutex_init(&events_mutex, NULL); |
| | | |
| | | eventQueue = NULL; |
| | | |
| | | memset(&platformStatus, 0, sizeof(platformStatus)); |
| | |
| | | |
| | | PlatformTxInit(); |
| | | |
| | | pthread_t pid; |
| | | pthread_attr_t attr; |
| | | pthread_attr_init(&attr); |
| | | pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);//detached |
| | | pthread_create(&pid, &attr, StatusListenThread, NULL); |
| | | std::thread(StatusListenThread).detach(); |
| | | } |
| | | |
| | | static void ReqRtkPlatformConfigTimeout(union sigval sig) |
| | | static void ReqRtkPlatformConfigTimeout(apptimer_var_t val) |
| | | { |
| | | AppTimer_delete(ReqRtkPlatformConfigTimeout); |
| | | |
| | | AppTimer_add(ReqRtkPlatformConfigTimeout, D_SEC(2)); |
| | | MA_ReqRtkPlatformConfig(); |
| | | } |
| | |
| | | } |
| | | } |
| | | |
| | | static void ConnectPlatformLater(union sigval sig) { |
| | | AppTimer_delete(ConnectPlatformLater); |
| | | static void ConnectPlatformLater(apptimer_var_t val) { |
| | | ConnectPlatform(exceptSocket.domain_name, exceptSocket.port); |
| | | } |
| | | |
| | | static void *StatusListenThread(void *p) { |
| | | static void StatusListenThread(void) { |
| | | while (true) { |
| | | sem_wait(&sem_status_changed); |
| | | |
| | |
| | | case GPS_UPDATE_EVT: { |
| | | const gpsStatus_t *gps = (gpsStatus_t *) data; |
| | | |
| | | DEBUG("GPS: %s", const_cast<gpsStatus_t *>(gps)->toString().c_str()); |
| | | |
| | | gbf.qf = gps->gps_status; |
| | | gbf.latitude = gps->latitude; |
| | | gbf.longitude = gps->longitude; |
| | |
| | | |
| | | MA_SendRtkBrief(&rbf); |
| | | } |
| | | |
| | | // MA_SendGpsBrief(&brief); |
| | | RequestRtkDownload(gps, 1); |
| | | break; |
| | |
| | | uint32_t ost1 = ost; |
| | | |
| | | const rtk_info *rtk = (rtk_info *) data; |
| | | |
| | | DEBUG("RTK: %s", const_cast<rtk_info *>(rtk)->toString().c_str()); |
| | | |
| | | rbf.qf = rtk->qf; |
| | | rbf.coord_x = rtk->y; |
| | |
| | | if (strlen(defaultMcuRom.verCode) > 0 && ver.size() >= 4 && |
| | | strcmp(defaultMcuRom.verCode, ver[3].c_str()) != 0 && |
| | | defaultMcuRom.rom != NULL) { |
| | | UploadDfuFile(defaultMcuRom.rom, defaultMcuRom.length); |
| | | /////////////////UploadDfuFile(defaultMcuRom.rom, defaultMcuRom.length); |
| | | delete[]defaultMcuRom.rom; |
| | | defaultMcuRom.rom = NULL; |
| | | } |
| | |
| | | if (sta == 3) { |
| | | // Connected |
| | | btConnected = true; |
| | | ParseMcuInit(); |
| | | ////////////////////ParseMcuInit(); |
| | | ConfigRTKModuleLater(); |
| | | |
| | | PlayTTS("蓝牙连接", NULL); |
| | |
| | | if (Virtual2IsConnected()) { |
| | | |
| | | } else { |
| | | ParseMcu(data, length); |
| | | ///////////ParseMcu(data, length); |
| | | } |
| | | break; |
| | | } |
| | |
| | | return ret; |
| | | } |
| | | |
| | | static void RegisterPlatformTimeout(union sigval sig) |
| | | static void RegisterPlatformTimeout(apptimer_var_t val) |
| | | { |
| | | DEBUG("RTK平台注册超时"); |
| | | AppTimer_delete(RegisterPlatformTimeout); |
| | | |
| | | RegisterPlatform(); |
| | | } |
| | | |
| | |
| | | strlen((char *)deviceInfo.device_model), deviceInfo.device_sn, deviceInfo.imei); |
| | | } |
| | | |
| | | static void TriggerHeartbeat(union sigval sig) { |
| | | AppTimer_delete(TriggerHeartbeat); |
| | | |
| | | static void TriggerHeartbeat(apptimer_var_t val) { |
| | | if (platformStatus.login && platformStatus.connected) { |
| | | SendHeartBeat(DATA_ACCESS_PLATFORM); |
| | | AppTimer_add(TriggerHeartbeat, D_SEC(30)); |
| | | } |
| | | } |
| | | |
| | | static void LoginPlatformTimeout(union sigval sig) |
| | | static void LoginPlatformTimeout(apptimer_var_t val) |
| | | { |
| | | DEBUG("RTK平台登录超时"); |
| | | AppTimer_delete(LoginPlatformTimeout); |
| | | |
| | | LoginPlatform(); |
| | | } |
| | | |
| | |
| | | AppTimer_add(RequestRtkNoResp, D_SEC(7)); // 应该每秒收到一次 |
| | | } |
| | | |
| | | static void RequestRtkNoResp(union sigval sig) |
| | | static void RequestRtkNoResp(apptimer_var_t val) |
| | | { |
| | | AppTimer_delete(RequestRtkNoResp); |
| | | requestPlatformSendRtk = true; |
| | | rtcmLength = 0; |
| | | } |