#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "define.h" #define DEBUG_INFO(format, args...) StoreLogMsg("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args) #define DEBUG_WARN(format, args...) StoreLogMsg("[%s:%d][%s][Warn] "format, __FILE__, __LINE__, __FUNCTION__, ##args) #define DEBUG_ERROR(format, args...) StoreLogMsg("[%s:%d][%s][Error] "format, __FILE__, __LINE__, __FUNCTION__, ##args) #define EVENT_INFO(format, args...) StoreEventLogMsg("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args) #define Debug #define ARRAY_SIZE(A) (sizeof(A) / sizeof(A[0])) #define PASS 1 #define FAIL -1 #define DB_FILE "/Storage/EventLog/Eventlog.db" struct SysConfigAndInfo *ShmSysConfigAndInfo; struct StatusCodeData *ShmStatusCodeData; sqlite3 *localDb; struct network_previous_status { int rssiWifi; int rssi4g; uint8_t isInternet:1; uint8_t isOcppConnected:1; uint8_t ethIsInternet:1; uint8_t maln0IsInternet:1; uint8_t ppp0IsInternet:1; }netPreviousStatus; void trim(char *s); int mystrcmp(char *p1,char *p2); void substr(char *dest, const char* src, unsigned int start, unsigned int cnt); void split(char **arr, char *str, const char *del); int StoreLogMsg(const char *fmt, ...) { char Buf[4096+256]; char buffer[4096]; time_t CurrentTime; struct tm *tm; struct timeval tv; va_list args; va_start(args, fmt); int rc = vsnprintf(buffer, sizeof(buffer), fmt, args); va_end(args); memset(Buf,0,sizeof(Buf)); CurrentTime = time(NULL); tm=localtime(&CurrentTime); gettimeofday(&tv, NULL); // get microseconds, 10^-6 sprintf(Buf,"echo -n \"[%04d.%02d.%02d %02d:%02d:%02d.%06ld]%s\" >> /Storage/EventLog/[%04d.%02d]EventLog", tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,tv.tv_usec, buffer, tm->tm_year+1900,tm->tm_mon+1); #ifdef SystemLogMessage system(Buf); #endif #ifdef ConsloePrintLog printf("[%04d.%02d.%02d %02d:%02d:%02d.%06ld %s", tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,tv.tv_usec, buffer); #endif return rc; } int StoreEventLogMsg(const char *fmt, ...) { char Buf[4096+256]; char buffer[4096]; time_t CurrentTime; struct tm *tm; struct timeval tv; va_list args; va_start(args, fmt); int rc = vsnprintf(buffer, sizeof(buffer), fmt, args); va_end(args); memset(Buf,0,sizeof(Buf)); CurrentTime = time(NULL); tm=localtime(&CurrentTime); gettimeofday(&tv, NULL); // get microseconds, 10^-6 if((ShmSysConfigAndInfo->SysConfig.ModelName != NULL) && (ShmSysConfigAndInfo->SysConfig.SerialNumber != NULL) && (strlen((char*)ShmSysConfigAndInfo->SysConfig.ModelName) >= 14)) { sprintf(Buf,"echo -n \"[%04d.%02d.%02d %02d:%02d:%02d.%06ld]%s\" >> /Storage/EventLog/[%04d.%02d]%s_%s_EventLog", tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,tv.tv_usec, buffer, tm->tm_year+1900,tm->tm_mon+1, ShmSysConfigAndInfo->SysConfig.ModelName, ShmSysConfigAndInfo->SysConfig.SerialNumber); } else { sprintf(Buf,"echo -n \"[%04d.%02d.%02d %02d:%02d:%02d.%06ld]%s\" >> /Storage/EventLog/[%04d.%02d]EventLog", tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,tv.tv_usec, buffer, tm->tm_year+1900,tm->tm_mon+1); } #ifdef SystemLogMessage system(Buf); #endif #ifdef ConsloePrintLog printf("[%04d.%02d.%02d %02d:%02d:%02d.%06ld]%s", tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,tm->tm_hour,tm->tm_min,tm->tm_sec,tv.tv_usec, buffer); #endif return rc; } int DiffTimeb(struct timeb ST, struct timeb ET) { //return milli-second unsigned int StartTime,StopTime; StartTime=(unsigned int)ST.time; StopTime=(unsigned int)ET.time; return (StopTime-StartTime)*1000+ET.millitm-ST.millitm; } //========================================== // Common routine //========================================== void trim(char *s) { int i=0, j, k, l=0; while((s[i]==' ')||(s[i]=='\t')||(s[i]=='\n')) i++; j = strlen(s)-1; while((s[j]==' ')||(s[j]=='\t')||(s[j]=='\n')) j--; if(i==0 && j==strlen(s)-1) { } else if(i==0) s[j+1] = '\0'; else { for(k=i; k<=j; k++) s[l++] = s[k]; s[l] = '\0'; } } int mystrcmp(char *p1,char *p2) { while(*p1==*p2) { if(*p1=='\0' || *p2=='\0') break; p1++; p2++; } if(*p1=='\0' && *p2=='\0') return(PASS); else return(FAIL); } void substr(char *dest, const char* src, unsigned int start, unsigned int cnt) { strncpy(dest, src + start, cnt); dest[cnt] = 0; } void split(char **arr, char *str, const char *del) { char *s = strtok(str, del); while(s != NULL) { *arr++ = s; s = strtok(NULL, del); } } void AddFaultCodeToBuf(unsigned char *Code) { if(ShmSysConfigAndInfo->SysWarningInfo.WarningCount < 10) { memcpy(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[ShmSysConfigAndInfo->SysWarningInfo.WarningCount][0], Code, 7); ShmSysConfigAndInfo->SysWarningInfo.WarningCount++; } } void RemoveFaultCodeToBuf(unsigned char *Code) { unsigned char find = 0x01; char _code[7]; sprintf(_code,"%s", Code); while(find) { find = 0x00; for(unsigned char i = 0; i < ShmSysConfigAndInfo->SysWarningInfo.WarningCount; i++) { if (find == 0x00) { if(memcmp(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][0], _code, 7) == 0) { find = 0x01; } } else { memcpy(&ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i - 1][0], &ShmSysConfigAndInfo->SysWarningInfo.WarningCode[i][0], 7); } } if (find) ShmSysConfigAndInfo->SysWarningInfo.WarningCount--; } } int getCurrentYear() { int result = 0; time_t CurrentTime; struct tm *tm; CurrentTime = time(NULL); tm=localtime(&CurrentTime); result = (tm->tm_year + 1900); return result; } //========================================== // Init all share memory //========================================== int InitShareMemory() { int result = PASS; int MeterSMId; //creat ShmSysConfigAndInfo if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), 0777)) < 0) { DEBUG_ERROR("shmget ShmSysConfigAndInfo NG\n"); result = FAIL; } else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) -1) { DEBUG_ERROR("shmat ShmSysConfigAndInfo NG\n"); result = FAIL; } else {} //creat ShmStatusCodeData if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), 0777)) < 0) { DEBUG_ERROR("shmget ShmStatusCodeData NG\n"); result = FAIL; } else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1) { DEBUG_ERROR("shmat ShmStatusCodeData NG\n"); result = FAIL; } else {} //creat ShmStatusCodeData if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), 0777)) < 0) { DEBUG_ERROR("shmget ShmStatusCodeData NG"); result = FAIL; } else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) -1) { DEBUG_ERROR("shmat ShmStatusCodeData NG"); result = FAIL; } else {} memset(ShmStatusCodeData,0,sizeof(struct StatusCodeData)); return result; } //========================================== // SQLite routne //========================================== int DB_Event_Open(sqlite3 *db) { int result = PASS; char* errMsg = NULL; char* createRecordSql="CREATE TABLE IF NOT EXISTS event_record(" "idx integer primary key AUTOINCREMENT, " "occurDatetime text NOT NULL, " "statusCode text NOT NULL" ");"; //sqlite3_config(SQLITE_CONFIG_URI, 1); if(sqlite3_open(DB_FILE, &db)) { result = FAIL; DEBUG_ERROR( "Can't open database: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); } else { DEBUG_INFO( "Local event record database open successfully.\n"); if (sqlite3_exec(db, createRecordSql, 0, 0, &errMsg) != SQLITE_OK) { result = FAIL; DEBUG_ERROR( "Create local event record table error message: %s\n", errMsg); } else { DEBUG_INFO( "Opened local event record table successfully\n"); } sqlite3_close(db); } return result; } int DB_Event_Insert_Record(sqlite3 *db, uint8_t *statusCode) { int result = PASS; char* errMsg = NULL; char sqlStr[1024]; sprintf(sqlStr, "insert into event_record(occurDatetime, statusCode) values(CURRENT_TIMESTAMP, '%s');", statusCode); if(sqlite3_open(DB_FILE, &db)) { result = FAIL; DEBUG_INFO( "Can't open database: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); } else { if (sqlite3_exec(db, sqlStr, 0, 0, &errMsg) != SQLITE_OK) { result = FAIL; DEBUG_INFO( "Insert local event record error message: %s\n", errMsg); } sprintf(sqlStr, "delete from event_record where (idx < (select idx from event_record order by idx desc limit 1)-2000) and (occurDatetime < '%04d-01-01 00:00:00');", (getCurrentYear()-3)); if (sqlite3_exec(db, sqlStr, 0, 0, &errMsg) != SQLITE_OK) { result = FAIL; DEBUG_INFO( "delete local event_record error message: %s\n", errMsg); } sqlite3_close(db); } return result; } int DB_Network_Open(sqlite3 *db) { int result = PASS; char* errMsg = NULL; char* createRecordSql="CREATE TABLE IF NOT EXISTS network_record(" "idx integer primary key AUTOINCREMENT, " "occurDatetime text NOT NULL, " "isInternet text NOT NULL, " "isOcppConnected text NOT NULL, " "isEth0Internet text NOT NULL, " "isMlan0Internet text NOT NULL, " "isPpp0Internet text NOT NULL, " "rssiMlan0 text NOT NULL, " "rssiPpp0 text NOT NULL" ");"; //sqlite3_config(SQLITE_CONFIG_URI, 1); if(sqlite3_open(DB_FILE, &db)) { result = FAIL; DEBUG_ERROR( "Can't open database: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); } else { DEBUG_INFO( "Local network status record database open successfully.\n"); if (sqlite3_exec(db, createRecordSql, 0, 0, &errMsg) != SQLITE_OK) { result = FAIL; DEBUG_ERROR( "Create local network status record table error message: %s\n", errMsg); } else { DEBUG_INFO( "Opened local network status record table successfully\n"); } sqlite3_close(db); } return result; } int DB_Network_Insert_Record(sqlite3 *db) { int result = PASS; char* errMsg = NULL; char sqlStr[1024]; if(ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'D') { sprintf(sqlStr, "insert into network_record(occurDatetime, isInternet, isOcppConnected, isEth0Internet, isMlan0Internet, isPpp0Internet, rssiMlan0, rssiPpp0) values(CURRENT_TIMESTAMP, '%d', '%d', '%d', '%d', '%d', '%d', '%d');", ShmSysConfigAndInfo->SysInfo.InternetConn, ShmSysConfigAndInfo->SysInfo.OcppConnStatus, !ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet, (ShmSysConfigAndInfo->SysConfig.AthInterface.WifiMode!=1?0:!ShmStatusCodeData->InfoCode.InfoEvents.bits.ApDisconnectViaWiFi), (ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomEnabled!=1?0:!ShmStatusCodeData->InfoCode.InfoEvents.bits.ApnDisconnectVia4Gi), ShmSysConfigAndInfo->SysConfig.AthInterface.WifiRssi, ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomRssi); } else if(ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'W') { sprintf(sqlStr, "insert into network_record(occurDatetime, isInternet, isOcppConnected, isEth0Internet, isMlan0Internet, isPpp0Internet, rssiMlan0, rssiPpp0) values(CURRENT_TIMESTAMP, '%d', '%d', '%d', '%d', '%d', '%d', '%d');", ShmSysConfigAndInfo->SysInfo.InternetConn, ShmSysConfigAndInfo->SysInfo.OcppConnStatus, !ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet, (ShmSysConfigAndInfo->SysConfig.AthInterface.WifiMode!=1?0:!ShmStatusCodeData->InfoCode.InfoEvents.bits.ApDisconnectViaWiFi), 0, ShmSysConfigAndInfo->SysConfig.AthInterface.WifiRssi, 0); } else if(ShmSysConfigAndInfo->SysConfig.ModelName[10] == 'T') { sprintf(sqlStr, "insert into network_record(occurDatetime, isInternet, isOcppConnected, isEth0Internet, isMlan0Internet, isPpp0Internet, rssiMlan0, rssiPpp0) values(CURRENT_TIMESTAMP, '%d', '%d', '%d', '%d', '%d', '%d', '%d');", ShmSysConfigAndInfo->SysInfo.InternetConn, ShmSysConfigAndInfo->SysInfo.OcppConnStatus, !ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet, 0, (ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomEnabled!=1?0:!ShmStatusCodeData->InfoCode.InfoEvents.bits.ApnDisconnectVia4Gi), 0, ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomRssi); } else { sprintf(sqlStr, "insert into network_record(occurDatetime, isInternet, isOcppConnected, isEth0Internet, isMlan0Internet, isPpp0Internet, rssiMlan0, rssiPpp0) values(CURRENT_TIMESTAMP, '%d', '%d', '%d', '%d', '%d', '%d', '%d');", ShmSysConfigAndInfo->SysInfo.InternetConn, ShmSysConfigAndInfo->SysInfo.OcppConnStatus, !ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet, 0, 0, 0, 0); } if(sqlite3_open(DB_FILE, &db)) { result = FAIL; DEBUG_INFO( "Can't open database: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); } else { if (sqlite3_exec(db, sqlStr, 0, 0, &errMsg) != SQLITE_OK) { result = FAIL; DEBUG_INFO( "Insert local network status record error message: %s\n", errMsg); } sprintf(sqlStr, "delete from network_record where idx < (select idx from network_record order by idx desc limit 1)-20000;"); if (sqlite3_exec(db, sqlStr, 0, 0, &errMsg) != SQLITE_OK) { result = FAIL; DEBUG_INFO( "delete local network_record error message: %s\n", errMsg); } sqlite3_close(db); } return result; } //================================================ // Common routin //================================================ char* getSystemModeName(unsigned char mode) { char* result; switch(mode) { case SYS_MODE_BOOTING: result = "booting"; break; case SYS_MODE_IDLE: result = "idle"; break; case SYS_MODE_AUTHORIZING: result = "authorizing"; break; case SYS_MODE_PREPARING: result = "preparing"; break; case SYS_MODE_CHARGING: result = "charging"; break; case SYS_MODE_TERMINATING: result = "terminating"; break; case SYS_MODE_COMPLETE: result = "complete"; break; case SYS_MODE_ALARM: result = "alarm"; break; case SYS_MODE_FAULT: result = "fault"; break; case SYS_MODE_MAINTAIN: result = "maintain"; break; case SYS_MODE_RESERVATION: result = "reservation"; break; case SYS_MODE_BOOKING: result = "booking"; break; case SYS_MODE_DEBUG: result = "debug"; break; case SYS_MODE_UPDATE: result = "upgrade"; break; default: result = "unknown"; break; } return result; } int getConnectorStatus(char *status) { int result = FAIL; sprintf(status, " "); if(ShmSysConfigAndInfo->SysConfig.ModelName[0] == 'A') { for(uint8_t gun_index=0;gun_indexSysConfig.ModelName[9+(gun_index*-1)] != '0') { sprintf(status, "%s, Gun-%d: %s", status, (gun_index+1), getSystemModeName(ShmSysConfigAndInfo->SysInfo.AcChargingData[gun_index].SystemStatus)); } } } return result; } //================================================ // Main process //================================================ int main(void) { int ByteCount,BitCount; unsigned char tmp, EventCodeTmp[7], EventCodeDisp[7]; char connectorStatus[512]; if(InitShareMemory() == FAIL) { DEBUG_ERROR("InitShareMemory NG\n"); if(ShmStatusCodeData!=NULL) { ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory=1; } sleep(5); return 0; } if(DB_Event_Open(localDb) != PASS) { DEBUG_ERROR("Local event database initial fail.\n"); } if(DB_Network_Open(localDb) != PASS) { DEBUG_ERROR("Local network status database initial fail.\n"); } for(;;) { //check Fault Status for(ByteCount=0;ByteCountFaultCode.FaultEvents.FaultVal);ByteCount++) { if(ShmStatusCodeData->FaultCode.FaultEvents.FaultVal[ByteCount] != ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount]) { tmp=ShmStatusCodeData->FaultCode.FaultEvents.FaultVal[ByteCount]; //prevent be modified during following process for(BitCount=0;BitCount<8;BitCount++) { if(((tmp>>BitCount)&0x01) != ((ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount]>>BitCount)&0x01)) { memset(EventCodeTmp,0,sizeof(EventCodeTmp)); memcpy(EventCodeTmp,FaultStatusCode[ByteCount*8+BitCount],sizeof(EventCodeTmp)-1); memcpy(EventCodeDisp, EventCodeTmp, ARRAY_SIZE(EventCodeTmp)); if((strstr((char*)EventCodeTmp, "11021") == NULL) && (strstr((char*)EventCodeTmp, "11022") == NULL)) { if(((tmp>>BitCount)&0x01)==0)//Recovered { EventCodeTmp[0]='1'; ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount]&=~(1<FaultCode.PreviousFaultVal[ByteCount]|=(1<>BitCount)&0x01)==0)//Recovered { EventCodeTmp[0]='1'; ShmStatusCodeData->FaultCode.PreviousFaultVal[ByteCount]&=~(1<FaultCode.PreviousFaultVal[ByteCount]|=(1<AlarmCode.AlarmEvents.AlarmVal);ByteCount++) { if(ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[ByteCount] != ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount]) { tmp=ShmStatusCodeData->AlarmCode.AlarmEvents.AlarmVal[ByteCount]; //prevent be modified during following process for(BitCount=0;BitCount<8;BitCount++) { if(((tmp>>BitCount)&0x01) != ((ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount]>>BitCount)&0x01)) { memset(EventCodeTmp,0,sizeof(EventCodeTmp)); memcpy(EventCodeTmp,AlarmStatusCode[ByteCount*8+BitCount],sizeof(EventCodeTmp)-1); memcpy(EventCodeDisp, EventCodeTmp, ARRAY_SIZE(EventCodeTmp)); if(((tmp>>BitCount)&0x01)==0)//Recovered { EventCodeTmp[0]='1'; ShmStatusCodeData->AlarmCode.PreviousAlarmVal[ByteCount]&=~(1<AlarmCode.PreviousAlarmVal[ByteCount]|=(1<InfoCode.InfoEvents.InfoVal);ByteCount++) { if(ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[ByteCount] != ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount]) { tmp=ShmStatusCodeData->InfoCode.InfoEvents.InfoVal[ByteCount]; //prevent be modified during following process for(BitCount=0;BitCount<8;BitCount++) { if(((tmp>>BitCount)&0x01) != ((ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount]>>BitCount)&0x01)) { memset(EventCodeTmp,0,sizeof(EventCodeTmp)); memcpy(EventCodeTmp,InfoStatusCode[ByteCount*8+BitCount],sizeof(EventCodeTmp)-1); memcpy(EventCodeDisp, EventCodeTmp, ARRAY_SIZE(EventCodeTmp)); if((strstr((char*)EventCodeTmp, "13622") == NULL) && (strstr((char*)EventCodeTmp, "13623") == NULL) && (strstr((char*)EventCodeTmp, "13624") == NULL) && (strstr((char*)EventCodeTmp, "13625") == NULL) && (strstr((char*)EventCodeTmp, "13626") == NULL)) { if(((tmp>>BitCount)&0x01)==0)//Recovered { EventCodeTmp[0]='1'; ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount]&=~(1<InfoCode.PreviousInfoVal[ByteCount]|=(1<>BitCount)&0x01)==0)//Recovered { EventCodeTmp[0]='1'; ShmStatusCodeData->InfoCode.PreviousInfoVal[ByteCount]&=~(1<InfoCode.PreviousInfoVal[ByteCount]|=(1<SysInfo.InternetConn) || (netPreviousStatus.isOcppConnected != ShmSysConfigAndInfo->SysInfo.OcppConnStatus) || (netPreviousStatus.ethIsInternet != ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet) || (netPreviousStatus.maln0IsInternet != ShmStatusCodeData->InfoCode.InfoEvents.bits.ApDisconnectViaWiFi) || (netPreviousStatus.ppp0IsInternet != ShmStatusCodeData->InfoCode.InfoEvents.bits.ApnDisconnectVia4Gi) || (netPreviousStatus.rssiWifi != ShmSysConfigAndInfo->SysConfig.AthInterface.WifiRssi) || (netPreviousStatus.rssi4g != ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomRssi)) { DB_Network_Insert_Record(localDb); netPreviousStatus.isInternet = ShmSysConfigAndInfo->SysInfo.InternetConn; netPreviousStatus.isOcppConnected = ShmSysConfigAndInfo->SysInfo.OcppConnStatus; netPreviousStatus.ethIsInternet = ShmStatusCodeData->InfoCode.InfoEvents.bits.InternetDisconnectViaEthernet; netPreviousStatus.maln0IsInternet = ShmStatusCodeData->InfoCode.InfoEvents.bits.ApDisconnectViaWiFi; netPreviousStatus.ppp0IsInternet = ShmStatusCodeData->InfoCode.InfoEvents.bits.ApnDisconnectVia4Gi; netPreviousStatus.rssiWifi = ShmSysConfigAndInfo->SysConfig.AthInterface.WifiRssi; netPreviousStatus.rssi4g = ShmSysConfigAndInfo->SysConfig.TelecomInterface.TelcomRssi; } usleep(100000); } return FAIL; }