#include /*標準輸入輸出定義*/ #include /*標準函數庫定義*/ #include #include #include #include #include #include #include #include #include #include #include #include "cbmp.h" #include "Module_LcmControl.h" #include "../Log/log.h" #include "../ShareMemory/shmMem.h" #include "../Define/define.h" #include "../Config.h" #include "../SelectGun/SelectGun.h" #include "../CSU/main.h" DcCommonInfo *ShmDcCommonData = NULL; //------------------------------------------------------------------------------ //struct SysConfigAndInfo *ShmSysConfigAndInfo; //struct StatusCodeData *ShmStatusCodeData; static struct SysConfigData *pSysConfig = NULL; static struct SysInfoData *pSysInfo = NULL; static struct WARNING_CODE_INFO *pSysWarning = NULL; static struct FanModuleData *ShmFanModuleData; static struct PrimaryMcuData *ShmPrimaryMcuData; static SelectGunInfo *ShmSelectGunInfo = NULL; static struct ChargingInfoData *pDcChargingInfo = NULL; static struct ChargingInfoData *pAcChargingInfo = NULL; bool needReloadQr = true; bool _isShow = false; //DS60-120 add uint8_t _showInformIndex = 0; //DS60-120 add int _port; //char* pPortName = "/dev/ttyO2"; char *pPortName = "/dev/ttyS3"; char *moduleName = "DMT80480T070_09WT"; uint8_t _totalCount; uint8_t acgunCount; //struct ChargingInfoData *_chargingInfoData[CHAdeMO_QUANTITY + CCS_QUANTITY + GB_QUANTITY]; //struct ChargingInfoData *ac_chargingInfo[AC_QUANTITY]; uint8_t ac_ani_battery_level = _BATTERY_LEVEL_FOR_MAP_LV5; uint8_t isDiffStatus = false; uint8_t isChangeBattMap = false; // 當前選擇的槍號 #if defined DD360Audi short _currentPage = _LCM_SELECT_GUN; short _oldPage = _LCM_SELECT_GUN; #else short _currentPage = _LCM_NONE; short _oldPage = _LCM_NONE; #endif //defined DD360Audi uint8_t _gunIndex = 0; bool _wifi_conn_status = false; bool _battery_display_ani = false; uint8_t _curPage_index = 0; bool _page_reload = false; // LCM - HW uint8_t _everyPageRollChange = 0; short __conn_status = 0x1030; short __ethernet_status = 0x1032; short __3G4G_status = 0x1036; short __3G4G_status1 = 0x1037; short __3G4G_move_status = 0x1038; short __wifi_status = 0x103C; short __sel_gun_btn = 0x1040; short __ret_home_btn = 0x1042; short __stop_method_btn = 0x1044; short __lcm_version = 0x104A; short __qr_code = 0x1250; short __main_rfid = 0x1052; short __main_qr = 0x1054; short __main_app = 0x1056; short __plug_in_arrow = 0x1060; short __conn_line = 0x1066; short __gun_type_index = 0x1070; short __cmp_gun_type_index = 0x1080; ////For Audi short __batt_map_empty = 0x1090; ////For Audi short __qr_code_pre = 0x1280; short __side_top = 0x1090; short __side_down = 0x1092; short __side_mid = 0x1094; short __conn_line_chag = 0x1096; short __batt_map = 0x1100; short __soc_value_charging = 0x1102; short __remain_time_map = 0x1106; short __power_map = 0x1108; short __energy_map = 0x110A; short __remain_time_tx = 0x1110; short __trp_remain_time_map = 0x1116; short __trp_power_map = 0x1118; short __trp_energy_map = 0x111A; short __output_eng_tx = 0x1120; short __total_out_eng_tx = 0x1130; short __conn_line_comp = 0x1140; short __charging_fee_map = 0x1146; short __charging_fee_tx = 0x1150; short __money_by_rate = 0x1200; short __money_rate = 0x1220; short __money_rate_map = 0x1230; //DS60-120 add short __csu_ver_string = 0x1300; short __csu_ver_value = 0x1310; short __fan_speed_string = 0x1390; short __fan_speed_value = 0x1400; short __dc1_ver_string = 0x1320; short __dc1_ver_value = 0x1330; short __dc2_ver_string = 0x1340; short __dc2_ver_value = 0x1350; short __eth0_ip_string = 0x1360; short __eth0_ip_value = 0x1370; short __sn_string = 0x1410; short __sn_value = 0x1420; //For Audi, for select gun short __left_gun_map = 0x1260; short __right_gun_map = 0x1262; short __add_chk_btn = 0x1264; //short __station_id = 0x1270; short __balance = 0x1270; short __remain_balance = 0x1280; short __custStationIdL1 = 0x1450; //short __custStationIdL2 = 0x1470; short _emergency_map = 0x111C; uint8_t _btn_pressed = 0xF0; // ICON ID uint8_t _disappear = 0; uint8_t _disconnect = 1; uint8_t _connect = 2; uint8_t _warning = 3; uint8_t _arrow_dark = 4; uint8_t _arrow_light = 5; uint8_t _3G4G_disconnect = 6; uint8_t __3G4G_connect = 7; uint8_t _wifi_disconnect = 8; uint8_t _wifi_connect = 9; uint8_t _logo = 10; uint8_t _conn_map1 = 11; uint8_t _conn_map2 = 12; uint8_t _sel_gun_btn = 13; uint8_t _back_home_btn = 14; uint8_t _stop_charging_btn = 15; uint8_t _stop_charging_btn_scan = 16; uint8_t _chademo_dark = 17; uint8_t _ccs_dark = 18; uint8_t _gbt_dark = 19; uint8_t _actype_dark = 20; uint8_t _chademo_light = 21; uint8_t _ccs_light = 22; uint8_t _gbt_light = 23; uint8_t _actype_light = 24; uint8_t _main_none_rfid = 25; uint8_t _main_rfid = 26; uint8_t _main_none_app = 27; uint8_t _main_app = 28; uint8_t _main_none_qr = 29; uint8_t _main_qr = 30; uint8_t _charging_map1 = 31; uint8_t _charging_map2 = 32; uint8_t _battery_empty = 33; uint8_t _battery_cap_20 = 34; uint8_t _battery_cap_40 = 35; uint8_t _battery_cap_60 = 36; uint8_t _battery_cap_80 = 37; uint8_t _battery_cap_100 = 38; uint8_t _battery_map = 39; uint8_t _power_map = 40; uint8_t _time_map = 41; uint8_t _complete_map = 42; uint8_t _battery_soc_20 = 43; uint8_t _battery_soc_40 = 44; uint8_t _battery_soc_60 = 45; uint8_t _battery_soc_80 = 46; uint8_t _battery_soc_100 = 47; uint8_t _battery_eng_map = 48; uint8_t _money_map = 49; uint8_t _elapse_time_map = 50; uint8_t _charging_money = 51; //uint8_t _side_none_rfid = 52; //uint8_t _side_rfid = 53; //uint8_t _side_none_app = 54; //uint8_t _side_app = 55; //uint8_t _side_none_qr = 56; //uint8_t _side_qr = 57; uint8_t _eth_disconnect = 52; //58; uint8_t _eth_connect = 53; //59; uint8_t _chademo_dark_cmp = 54; uint8_t _ccs_dark_cmp = 55; uint8_t _gbt_dark_cmp = 56; uint8_t _actype_dark_cmp = 57; uint8_t _chademo_light_cmp = 58; uint8_t _ccs_light_cmp = 59; uint8_t _gbt_light_cmp = 60; uint8_t _actype_light_cmp = 61; uint8_t _logo_cmp = 62; uint8_t _battery_eng_trp_map = 63; uint8_t _money_trp_map = 64; uint8_t _elapse_time_trp_map = 65; #if defined DD360Audi ////For Audi uint8_t _left_gun_disable_map = 66; uint8_t _left_gun_enable_map = 67; uint8_t _right_gun_disable_map = 68; uint8_t _right_gun_enable_map = 69; uint8_t _select_gun_btn = 70; uint8_t _emergency_disable_map = 72; // For replug struct timespec showReplugStrTimer; struct timespec showFullTargetTimer; short __show_StatusString_value_1 = 0x0460; short __show_StatusString_value_2 = 0x0462; uint8_t _showfulltarget_1 = 73; uint8_t _showfulltarget_2 = 74; uint8_t _showReplugStr_1 = 75; uint8_t _showReplugStr_2 = 76; // Select Gun for Audi short __show_selectgun_value = 0x0464; uint8_t _showselectgun_left = 77; uint8_t _showselectgun_right = 78; // Wait for gun plugin Audi short __show_waitgunplug_value = 0x0468; uint8_t _showwaitgunplug_left = 80; uint8_t _showwaitgunplug_right = 81; #elif defined DD360Tcci short __show_handshark_value = 0x1464; short __show_GFD_value = 0x1466; short __show_precharge_value = 0x1468; uint8_t _show_handshark_dark = 67; uint8_t _show_handshark_light = 68; uint8_t _show_GFD_dark = 69; uint8_t _show_GFD_light = 70; uint8_t _show_precharge_dark = 71; uint8_t _show_precharge_light = 72; #endif //#define log_info(format, args...) StoreLogMsg("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args) //#define log_warn(format, args...) StoreLogMsg("[%s:%d][%s][Warn] "format, __FILE__, __LINE__, __FUNCTION__, ##args) //#define log_error(format, args...) StoreLogMsg("[%s:%d][%s][Error] "format, __FILE__, __LINE__, __FUNCTION__, ##args) //================================= // Common routine //================================= /*int StoreLogMsg(const char *fmt, ...) { char Buf[4096 + 256]; char buffer[4096]; va_list args; struct timeb SeqEndTime; struct tm *tm; va_start(args, fmt); int rc = vsnprintf(buffer, sizeof(buffer), fmt, args); va_end(args); memset(Buf, 0, sizeof(Buf)); ftime(&SeqEndTime); SeqEndTime.time = time(NULL); tm = localtime(&SeqEndTime.time); if (pSysConfig->SwitchDebugFlag == YES) { sprintf(Buf, "%02d:%02d:%02d:%03d - %s", tm->tm_hour, tm->tm_min, tm->tm_sec, SeqEndTime.millitm, buffer); printf("%s ", Buf); } else { sprintf(Buf, "echo \"%04d-%02d-%02d %02d:%02d:%02d:%03d - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, SeqEndTime.millitm, buffer, tm->tm_year + 1900, tm->tm_mon + 1); system(Buf); } return rc; } char *getTimeString(void) { char *result = malloc(21); time_t timep; struct tm *p; time(&timep); p = gmtime(&timep); sprintf(result, "[%04d-%02d-%02d %02d:%02d:%02d]", (1900 + p->tm_year), (1 + p->tm_mon), p->tm_mday, p->tm_hour, p->tm_hour, p->tm_sec); return result; } */ #if 0 //========================================== // Init all share memory //========================================== int InitShareMemory() { int result = PASS; int MeterSMId; //creat ShmSysConfigAndInfo if ((MeterSMId = shmget(ShmSysConfigAndInfoKey, sizeof(struct SysConfigAndInfo), 0777)) < 0) { #ifdef SystemLogMessage log_error("shmget ShmSysConfigAndInfo NG"); #endif result = FAIL; } else if ((ShmSysConfigAndInfo = shmat(MeterSMId, NULL, 0)) == (void *) - 1) { #ifdef SystemLogMessage log_error("shmat ShmSysConfigAndInfo NG"); #endif result = FAIL; } else {} //creat ShmStatusCodeData if ((MeterSMId = shmget(ShmStatusCodeKey, sizeof(struct StatusCodeData), 0777)) < 0) { #ifdef SystemLogMessage log_error("shmget ShmStatusCodeData NG"); #endif result = FAIL; } else if ((ShmStatusCodeData = shmat(MeterSMId, NULL, 0)) == (void *) - 1) { #ifdef SystemLogMessage log_error("shmat ShmStatusCodeData NG"); #endif result = FAIL; } else {} //creat Audi customization info if ((MeterSMId = shmget(ShmSelectGunInfoKey, sizeof(SelectGunInfo), IPC_CREAT | 0777)) < 0) { log_error("[main]CreatShareMemory:shmget select gun info NG "); return 0; } else if ((ShmSelectGunInfo = shmat(MeterSMId, NULL, 0)) == (void *) - 1) { log_error("[main]CreatShareMemory:shmat shmget select gun info "); return 0; } //creat ShmStatusCodeData if ((MeterSMId = shmget(ShmPrimaryMcuKey, sizeof(struct PrimaryMcuData), 0777)) < 0) { #ifdef SystemLogMessage log_error("shmget ShmPrimaryMcuData NG"); #endif result = FAIL; } else if ((ShmPrimaryMcuData = shmat(MeterSMId, NULL, 0)) == (void *) - 1) { #ifdef ShmPrimaryMcuData log_error("shmat ShmPrimaryMcuData NG"); #endif result = FAIL; } return result; } #endif //0 unsigned long GetPreChargeTimeoutValue(struct timeval _sour_time) { struct timeval _end_time; gettimeofday(&_end_time, NULL); return 1000000 * (_end_time.tv_sec - _sour_time.tv_sec) + _end_time.tv_usec - _sour_time.tv_usec; } void displayMessageDgus(uint8_t *data, uint16_t len, uint8_t isRX) { uint8_t output[8192]; memset(output, 0x00, ARRAY_SIZE(output)); sprintf((char*)output, "%s", (isRX?"RX: ":"TX: ")); for(uint16_t idx = 0;idx= ARRAY_SIZE(tx)) { if(tx[3] == CMD_REG_WRITE_DATA) { len = read(fd, rx, rx_len); if(len > 0) { if((rx[0] == CMD_HEADER_1) && (rx[1] == CMD_HEADER_2)) { if((rx[3] == CMD_REG_WRITE_DATA) && (rx[4] == 0x4f) && (rx[5] == 0x4b)) { displayMessageDgus(rx, len, YES); result = PASS; } } } } else if(tx[3] == CMD_REG_READ_DATA) { len = read(fd, rx, rx_len); if(len > 0) { if((rx[0] == CMD_HEADER_1) && (rx[1] == CMD_HEADER_2)) { if(rx[3] == CMD_REG_READ_DATA) { displayMessageDgus(rx, len, YES); result = PASS; } else {} } else {} } else {} } else {} } else {} return result; } //========================================== // Open and Close RS232 and R/W //========================================== int CreateCommunicationLcmPort() { int fd; struct termios tios; fd = open(pPortName, O_RDWR); if (fd <= 0) { #ifdef SystemLogMessage log_error("open /dev/ttyS3 NG "); #endif return -1; } ioctl(fd, TCGETS, &tios); tios.c_cflag = B115200 | CS8 | CLOCAL | CREAD; tios.c_lflag = 0; tios.c_iflag = 0; tios.c_oflag = 0; tios.c_cc[VMIN] = 0; tios.c_cc[VTIME] = (uint8_t) 5; tios.c_lflag = 0; tcflush(fd, TCIFLUSH); ioctl(fd, TCSETS, &tios); return fd; } void CloseCommunicationLcmPort() { close(_port); } void WriteCmdToLcm(uint8_t *cmd, uint8_t cmdLen) { int len = write(_port, cmd, cmdLen); if (len >= sizeof(cmd)) { //log_info("Write cmd to LCM successfully. "); } /* for(uint8_t i = 0 ; iLcmHwRev, moduleName); } break; } } else if (*(msg + 3) == CMD_MULTI_READ) { // switch ((unsigned short) (*(msg + 4) << 8) + (unsigned short) *(msg + 5)) // { // case BUTTON_GUN_INDEX: // { // // 當前選的槍號 // _curGunIndex = (*(msg + 8)); // } // break; // } } }*/ read(_port, msg, readLen); // 5a : CMD_TITLE_1 // a5 : CMD_TITLE_2 // 5 // 81 : CMD_WRITE // 3 : CMD_REGISTER // 2 : Data length // 0 : High byte // 1 : Low byte // printf("-------------------------------------------- \n"); // printf("msg = %x \n", *msg); // A5 // printf("msg = %x \n", *(msg + 1)); // 5A // printf("msg = %x \n", *(msg + 2)); // Len : [3] ~ [6] + Data Len // printf("msg = %x \n", *(msg + 3)); // cmd : 0x83 // printf("msg = %x \n", *(msg + 4)); // addr : H // printf("msg = %x \n", *(msg + 5)); // addr : L // printf("msg = %x \n", *(msg + 6)); // Data Len // // printf("msg = %x \n", *(msg + 7)); // printf("msg = %x \n", *(msg + 8)); // printf("msg = %x \n", *(msg + 9)); // printf("msg = %x \n", *(msg + 10)); // printf("msg = %x \n", *(msg + 11)); // printf("msg = %x \n", *(msg + 12)); // printf("msg = %x \n", *(msg + 13)); // printf("msg = %x \n", *(msg + 14)); /* for(uint8_t i = 0 ; iLcmHwRev, "") != EQUAL) strcpy((char *)pSysInfo->LcmHwRev, moduleName); _currentPage = *(msg + 7); log_info("Current Page:%d",_currentPage); // if (_currentPage != 1 && _currentPage != 5 && _currentPage != 6 && _currentPage != 7 && _currentPage != 8) // printf("_currentPage = %d \n", _currentPage); } break; } } else if (*(msg + 3) == CMD_MULTI_READ) { short key = ((short)(*(msg + 4) << 8) + *(msg + 5)); if (key == __lcm_version) { if(strcmp((char *)pSysInfo->LcmHwRev, "") != EQUAL) strcpy((char *)pSysInfo->LcmHwRev, moduleName); //pSysInfo->LcmFwRev = atoi((char *)(msg + 7)); printf("msg = %d \n", atoi((char *)(msg + 7))); // printf("msg = %x \n", *(msg + 7)); // printf("msg = %x \n", *(msg + 8)); // printf("msg = %x \n", *(msg + 9)); } else if (key == 0x0014) { //printf("page = %d \n", *(msg + 8)); _currentPage = *(msg + 8); } else if (key == 0x0600) { if (_btn_pressed != *(msg + 8)) { if (_btn_pressed == 0x0A) printf("NotPressed \n"); else printf("Pressed \n"); _btn_pressed = *(msg + 8); } //printf("msg = %x \n", *(msg + 7)); } // switch ((unsigned short) (*(msg + 4) << 8) + (unsigned short) *(msg + 5)) // { // case BUTTON_GUN_INDEX: // { // // 當前選的槍號 // _curGunIndex = (*(msg + 8)); // } // break; // } } } } //================================================ // Function //================================================ void ChangeToOtherPage(short newPage) { /* uint8_t cmd[7]; memset(cmd, 0x00, sizeof(cmd)); cmd[0] = CMD_TITLE_1; cmd[1] = CMD_TITLE_2; cmd[2] = 0x02 + sizeof(newPage); cmd[3] = CMD_READ; cmd[4] = CMD_REGISTER; cmd[5] = newPage >> 8; cmd[6] = newPage & 0x00FF; WriteCmdToLcm(cmd, ARRAY_SIZE(cmd)); usleep(100000); */ uint8_t cmd[10]; memset(cmd, 0x00, sizeof(cmd)); uint8_t msg[9]; memset(msg, 0x00, sizeof(msg)); cmd[0] = CMD_TITLE_1; cmd[1] = CMD_TITLE_2; cmd[2] = 0x07; cmd[3] = 0x82; cmd[4] = 0x00; cmd[5] = 0x84; cmd[6] = 0x5A; cmd[7] = 0x01; cmd[8] = newPage >> 8; cmd[9] = newPage & 0x00FF; WriteCmdToLcm(cmd, ARRAY_SIZE(cmd)); usleep(10000); ReadMsgFromLcm(msg, ARRAY_SIZE(msg)); } void ChangeBackLight(bool islight) { /* uint8_t value = 0x01; if (islight) { value = 0x20; } uint8_t cmd[7]; memset(cmd, 0x00, sizeof(cmd)); cmd[0] = CMD_TITLE_1; cmd[1] = CMD_TITLE_2; cmd[2] = 0x03; cmd[3] = CMD_READ; cmd[4] = CMD_BACKLIGHT; cmd[5] = value; WriteCmdToLcm(cmd, ARRAY_SIZE(cmd)); usleep(100000); */ uint8_t value = 0x01; uint8_t msg[9]; memset(msg, 0x00, sizeof(msg)); // 0x00 ~ 0x40 if (islight) { value = 0x20; } uint8_t cmd[7]; memset(cmd, 0x00, sizeof(cmd)); cmd[0] = CMD_TITLE_1; cmd[1] = CMD_TITLE_2; cmd[2] = 0x03; cmd[3] = CMD_READ; cmd[4] = CMD_BACKLIGHT; cmd[5] = value; WriteCmdToLcm(cmd, ARRAY_SIZE(cmd)); usleep(10000); ReadMsgFromLcm(msg, ARRAY_SIZE(msg)); } void GetCurrentPage() { /* uint8_t cmd[6]; memset(cmd, 0x00, sizeof(cmd)); uint8_t msg[8]; memset(msg, 0x00, sizeof(msg)); cmd[0] = CMD_TITLE_1; cmd[1] = CMD_TITLE_2; cmd[2] = 0x03; // 底下總長度 cmd[3] = CMD_WRITE; cmd[4] = CMD_REGISTER; cmd[5] = 0x02; WriteCmdToLcm(cmd, ARRAY_SIZE(cmd)); usleep(100000); ReadMsgFromLcm(msg, ARRAY_SIZE(msg)); */ uint8_t cmd[7]; memset(cmd, 0x00, sizeof(cmd)); uint8_t msg[9]; memset(msg, 0x00, sizeof(msg)); cmd[0] = CMD_TITLE_1; cmd[1] = CMD_TITLE_2; cmd[2] = 0x04; // 底下總長度 cmd[3] = 0x83; cmd[4] = 0x00; cmd[5] = 0x14; cmd[6] = 0x01; WriteCmdToLcm(cmd, ARRAY_SIZE(cmd)); usleep(10000); ReadMsgFromLcm(msg, ARRAY_SIZE(msg)); } void DisplayValueToLcm(short address, uint8_t *data, uint8_t len) { /* uint8_t cmd[256]; memset(cmd, 0x00, sizeof(cmd)); cmd[0] = CMD_TITLE_1; cmd[1] = CMD_TITLE_2; cmd[2] = 0x03 + len; cmd[3] = CMD_MULTI_WRITE; cmd[4] = address >> 8; cmd[5] = address & 0x00FF; for (uint8_t count = 0; count < len; count++) { cmd[6 + count] = *(data + count); } WriteCmdToLcm(cmd, cmd[2] + 3); */ uint8_t cmd[256]; memset(cmd, 0x00, sizeof(cmd)); uint8_t msg[9]; memset(msg, 0x00, sizeof(msg)); cmd[0] = CMD_TITLE_1; cmd[1] = CMD_TITLE_2; cmd[2] = 0x03 + len; cmd[3] = CMD_MULTI_WRITE; cmd[4] = address >> 8; cmd[5] = address & 0x00FF; for(uint8_t count = 0; count < len; count++) { cmd[6 + count] = *(data + count); } WriteCmdToLcm(cmd, cmd[2] + 3); usleep(10000); ReadMsgFromLcm(msg, ARRAY_SIZE(msg)); } void ChangeDisplay2Value(short address, short value) { uint8_t data[2]; data[0] = value >> 8; data[1] = value & 0x00FF; DisplayValueToLcm(address, data, sizeof(data)); } void GetBtnStatus(short address, uint8_t len) { uint8_t cmd[8]; memset(cmd, 0x00, sizeof(cmd)); uint8_t msg[8]; memset(msg, 0x00, sizeof(msg)); cmd[0] = CMD_TITLE_1; cmd[1] = CMD_TITLE_2; cmd[2] = 0x03 + len; cmd[3] = CMD_MULTI_READ; cmd[4] = address >> 8; cmd[5] = address & 0x00FF; cmd[6] = 0x00 + len; WriteCmdToLcm(cmd, cmd[2] + 3); usleep(100000); ReadMsgFromLcm(msg, (len * 2) + sizeof(msg)); } //================================================ // Warning process //================================================ void string2ByteArray(uint8_t *input, uint8_t *output) { int loop; int i; loop = 0; i = 0; while (input[loop] != '\0') { output[i++] = input[loop++]; } output[loop] = '\0'; } void ChangeWarningFunc() { uint8_t cmd[7] = {0}; uint8_t i = 0; //uint8_t j = 0; //log_info("ChangeWarningFunc "); // 最多一次五筆 //log_info("LCM PageIndex = %d ", pSysWarning->PageIndex); //log_info("WarningCount = %d ", pSysWarning->WarningCount); //#if !defined DD360Tcci && !defined DD360Audi && !defined DD360ComBox for (i = 0; (i + pSysWarning->PageIndex * 5) < pSysWarning->WarningCount; i++) { memset(cmd, 0x00, sizeof(cmd)); if ((i) >= 5) { break; } //error code string2ByteArray(&pSysWarning->WarningCode[i + pSysWarning->PageIndex * 5][0], cmd); DisplayValueToLcm(0x1010 + ((i) * 6), cmd, sizeof(cmd)); //警告標示 memset(cmd, 0x00, sizeof(cmd)); cmd[0] = 0x00; cmd[1] = 0x01; DisplayValueToLcm(0x1002 + ((i) * 2), cmd, 2); } memset(cmd, 0x00, sizeof(cmd)); for (; i < 5; i++) { DisplayValueToLcm(0x1010 + ((i) * 6), cmd, sizeof(cmd)); DisplayValueToLcm(0x1002 + ((i) * 2), cmd, 2); } /*#else for (i = 0; (i + pSysWarning->PageIndex * 5) < pSysWarning->WarningCount; i++) { memset(cmd, 0x00, sizeof(cmd)); if ((i - j) >= 5) { break; } if ( (memcmp(&pSysWarning->WarningCode[i + pSysWarning->PageIndex * 5][0], "033900", 6) == 0) || (memcmp(&pSysWarning->WarningCode[i + pSysWarning->PageIndex * 5][0], "033901", 6) == 0) || (memcmp(&pSysWarning->WarningCode[i + pSysWarning->PageIndex * 5][0], "033902", 6) == 0) || (memcmp(&pSysWarning->WarningCode[i + pSysWarning->PageIndex * 5][0], "043627", 6) == 0) || (memcmp(&pSysWarning->WarningCode[i + pSysWarning->PageIndex * 5][0], "043628", 6) == 0) || (memcmp(&pSysWarning->WarningCode[i + pSysWarning->PageIndex * 5][0], "043622", 6) == 0) || (memcmp(&pSysWarning->WarningCode[i + pSysWarning->PageIndex * 5][0], "043623", 6) == 0) || (memcmp(&pSysWarning->WarningCode[i + pSysWarning->PageIndex * 5][0], "043624", 6) == 0) || (memcmp(&pSysWarning->WarningCode[i + pSysWarning->PageIndex * 5][0], "043625", 6) == 0) || (memcmp(&pSysWarning->WarningCode[i + pSysWarning->PageIndex * 5][0], "043626", 6) == 0) || (memcmp(&pSysWarning->WarningCode[i + pSysWarning->PageIndex * 5][0], "042241", 6) == 0) || (memcmp(&pSysWarning->WarningCode[i + pSysWarning->PageIndex * 5][0], "042242", 6) == 0) ) { j++; continue; } //error code string2ByteArray(&pSysWarning->WarningCode[i + pSysWarning->PageIndex * 5][0], cmd); DisplayValueToLcm(0x0010 + ((i - j) * 6), cmd, sizeof(cmd)); //警告標示 memset(cmd, 0x00, sizeof(cmd)); cmd[0] = 0x00; cmd[1] = 0x01; DisplayValueToLcm(0x0002 + ((i - j) * 2), cmd, 2); } memset(cmd, 0x00, sizeof(cmd)); i = i - j; for (; (i) < 5; i++) { DisplayValueToLcm(0x0010 + ((i) * 6), cmd, sizeof(cmd)); DisplayValueToLcm(0x0002 + ((i) * 2), cmd, 2); } #endif //!defined DD360Tcci && !defined DD360Audi */ } //================================================ // QR Code process //================================================ void ChangeQrCode_Idle(char *input) { #if defined DD360Audi int len = strlen(input) + 3; int loop = 0; int i = 0, j = 0, k = 0, l = 0; uint8_t qrUrl[128] = {0}; uint16_t urlLen = 0; uint8_t cmd[len]; uint8_t tmpBuf[15] = {0}; //uint8_t tmpLen = sizeof(tmpBuf) - 1; strncpy((char *)cmd, " ", len); while (input[loop] != '\0') { cmd[i++] = input[loop++]; l = loop - 1; if (len >= 25) { if (i >= 16 && i <= 19) { tmpBuf[k++] = input[l]; //printf("tmpBuf = %s", tmpBuf); } else if (i >= 21 && i <= 23) { tmpBuf[k++] = input[l]; } } } tmpBuf[k] = '\0'; //printf("tmpBuf = %s", tmpBuf); j += sprintf((char *)&cmd[i], ":%d", pSysInfo->CurGunSelected); ////For Audi cmd[len - 1] = '\0'; urlLen = sprintf((char *)qrUrl, "%s%s", NOODOE_QR_CODE_URL, cmd); qrUrl[urlLen] = '\0'; //printf("qr url = %s", qrUrl); DisplayValueToLcm(__qr_code, qrUrl, urlLen); j = 0; j += sprintf((char *)&tmpBuf[k], "0%d", pSysInfo->CurGunSelected); ////For Audi tmpBuf[k + j] = '\0'; //if (len < 25) { // strncpy((char *)tmpBuf, (char *)cmd, sizeof(tmpBuf)); //} //tmpBuf[tmpLen] = '\0'; DisplayValueToLcm(__custStationIdL1, tmpBuf, sizeof(tmpBuf)); /*if (len > sizeof(tmpBuf)) { strncpy((char *)tmpBuf, (char *)cmd, sizeof(tmpBuf)); tmpBuf[tmpLen] = '\0'; DisplayValueToLcm(__custStationIdL1, tmpBuf, sizeof(tmpBuf)); memset(tmpBuf, 0, sizeof(tmpBuf)); strncpy((char *)tmpBuf, (char *)&cmd[tmpLen], sizeof(tmpBuf)); tmpBuf[tmpLen] = '\0'; DisplayValueToLcm(__custStationIdL2, tmpBuf, sizeof(tmpBuf)); } else { DisplayValueToLcm(__custStationIdL1, cmd, len); strncpy((char *)tmpBuf, " ", sizeof(tmpBuf)); tmpBuf[tmpLen] = '\0'; DisplayValueToLcm(__custStationIdL2, tmpBuf, sizeof(tmpBuf)); }*/ #else int len = strlen(input); uint8_t cmd[len]; int loop = 0; int i = 0; while (input[loop] != '\0') { cmd[i++] = input[loop++]; } DisplayValueToLcm(__qr_code, cmd, len + 1); #endif //defined DD360Audi } void ChangeQrCode_Charge(char *input) { #if defined DD360Audi int len = strlen(input) + 3; int loop = 0; int i = 0, j = 0, k = 0, l = 0; uint8_t qrUrl[128] = {0}; uint16_t urlLen = 0; uint8_t cmd[len]; uint8_t tmpBuf[15] = {0}; //uint8_t tmpLen = sizeof(tmpBuf) - 1; strncpy((char *)cmd, " ", len); while (input[loop] != '\0') { cmd[i++] = input[loop++]; l = loop - 1; if (len >= 25) { if (i >= 16 && i <= 19) { tmpBuf[k++] = input[l]; //printf("tmpBuf = %s", tmpBuf); } else if (i >= 21 && i <= 23) { tmpBuf[k++] = input[l]; } } } tmpBuf[k] = '\0'; //printf("tmpBuf = %s", tmpBuf); j += sprintf((char *)&cmd[i], ":%d", pSysInfo->CurGunSelected); ////For Audi cmd[len - 1] = '\0'; urlLen = sprintf((char *)qrUrl, "%s%s", NOODOE_QR_CODE_URL, cmd); qrUrl[urlLen] = '\0'; DisplayValueToLcm(__qr_code, qrUrl, urlLen); j = 0; j += sprintf((char *)&tmpBuf[k], "0%d", pSysInfo->CurGunSelected); ////For Audi tmpBuf[k + j] = '\0'; if (len < 25) { strncpy((char *)tmpBuf, (char *)cmd, sizeof(tmpBuf)); } //tmpBuf[tmpLen] = '\0'; DisplayValueToLcm(__custStationIdL1, tmpBuf, sizeof(tmpBuf)); /*if (len > sizeof(tmpBuf)) { strncpy((char *)tmpBuf, (char *)cmd, sizeof(tmpBuf)); tmpBuf[tmpLen] = '\0'; DisplayValueToLcm(__custStationIdL1, tmpBuf, sizeof(tmpBuf)); memset(tmpBuf, 0, sizeof(tmpBuf)); strncpy((char *)tmpBuf, (char *)&cmd[tmpLen], sizeof(tmpBuf)); tmpBuf[tmpLen] = '\0'; DisplayValueToLcm(__custStationIdL2, tmpBuf, sizeof(tmpBuf)); } else { DisplayValueToLcm(__custStationIdL1, cmd, len); strncpy((char *)tmpBuf, " ", sizeof(tmpBuf)); tmpBuf[tmpLen] = '\0'; DisplayValueToLcm(__custStationIdL2, tmpBuf, sizeof(tmpBuf)); }*/ #else int len = strlen(input); uint8_t cmd[len]; int loop = 0; int i = 0; while (input[loop] != '\0') { cmd[i++] = input[loop++]; } DisplayValueToLcm(__qr_code_pre, cmd, len + 1); #endif //defined DD360Audi } //================================================ // Change current page //================================================ void ChangeCurPage() { //log_info("cur = %d, new = %d ", _currentPage, pSysInfo->PageIndex); if (_currentPage != pSysInfo->PageIndex) { _currentPage = pSysInfo->PageIndex; ChangeToOtherPage(_currentPage); _everyPageRollChange = 0; } } //================================================ // Main process //================================================ uint8_t demoCount = 0; void DemoFunction() { if (demoCount == 0) { pSysWarning->WarningCount = 6; memcpy(&pSysWarning->WarningCode[0][0], "000001", 7); memcpy(&pSysWarning->WarningCode[1][0], "000002", 7); memcpy(&pSysWarning->WarningCode[2][0], "000003", 7); memcpy(&pSysWarning->WarningCode[3][0], "000004", 7); memcpy(&pSysWarning->WarningCode[4][0], "000005", 7); memcpy(&pSysWarning->WarningCode[5][0], "000006", 7); } else { if (demoCount == 20) { pSysInfo->PageIndex = _LCM_IDLE; } else if (demoCount == 80) { pSysInfo->PageIndex = _LCM_AUTHORIZING; } else if (demoCount == 100) { pSysInfo->PageIndex = _LCM_AUTHORIZ_COMP; } else if (demoCount == 120) { pSysInfo->PageIndex = _LCM_AUTHORIZ_FAIL; } else if (demoCount == 140) { pSysInfo->PageIndex = _LCM_PRE_CHARGE; } else if (demoCount == 180) { pSysInfo->PageIndex = _LCM_CHARGING; } } if (demoCount < 180) { demoCount++; } } //================================================ // Main process //================================================ bool FindChargingInfoData(uint8_t target, struct ChargingInfoData **_chargingData) { for (uint8_t index = 0; index < CHAdeMO_QUANTITY; index++) { if (pSysInfo->ChademoChargingData[index].Index == target) { _chargingData[target] = &pSysInfo->ChademoChargingData[index]; return true; } } for (uint8_t index = 0; index < CCS_QUANTITY; index++) { if (pSysInfo->CcsChargingData[index].Index == target) { _chargingData[target] = &pSysInfo->CcsChargingData[index]; return true; } } for (uint8_t index = 0; index < GB_QUANTITY; index++) { if (pSysInfo->GbChargingData[index].Index == target) { _chargingData[target] = &pSysInfo->GbChargingData[index]; return true; } } return false; } bool FindAcChargingInfoData(uint8_t target, struct ChargingInfoData **acChargingData) { if (target < AC_QUANTITY) { acChargingData[target] = &pSysInfo->AcChargingData[target]; return true; } return false; } int GetTimeoutValue(struct timespec *startTime) { struct timespec endTime; clock_gettime(CLOCK_MONOTONIC_COARSE, &endTime); return endTime.tv_sec - startTime->tv_sec; } void GetTimespecFunc(struct timespec *time) { clock_gettime(CLOCK_MONOTONIC_COARSE, time); } #if defined DD360Audi void RunReplugStringFunction(bool isRun) { if (isRun) { int time = GetTimeoutValue(&showReplugStrTimer); if (time >=1 && time <2) { ChangeDisplay2Value(__show_StatusString_value_1, _showReplugStr_1); ChangeDisplay2Value(__show_StatusString_value_2, _showReplugStr_2); } else if (time < 1) { ChangeDisplay2Value(__show_StatusString_value_1, _disappear); ChangeDisplay2Value(__show_StatusString_value_2, _disappear); } else GetTimespecFunc(&showReplugStrTimer); } else { ChangeDisplay2Value(__show_StatusString_value_1, _disappear); ChangeDisplay2Value(__show_StatusString_value_2, _disappear); } } void RunFullTargetFunction(bool isRun) { if (isRun) { int time = GetTimeoutValue(&showFullTargetTimer); if (time >=1 && time <2) { ChangeDisplay2Value(__show_StatusString_value_1, _showfulltarget_1 ); ChangeDisplay2Value(__show_StatusString_value_2, _showfulltarget_2); } else if (time < 1) { ChangeDisplay2Value(__show_StatusString_value_1, _disappear); ChangeDisplay2Value(__show_StatusString_value_2, _disappear); } else GetTimespecFunc(&showFullTargetTimer); } else { ChangeDisplay2Value(__show_StatusString_value_1, _disappear); ChangeDisplay2Value(__show_StatusString_value_2, _disappear); } } #endif /** * [ChangeBalanceValue :print balance information] * @Author * @DateTime 2020-11-26 */ static void ChangeBalanceValue(uint16_t addr, uint8_t index) ////For Audi { uint8_t cmd[10] = {0}; uint8_t value[10] = {0}; uint8_t len = 0; float balance = ShmSelectGunInfo->PricesInfo[index].Balance; if ((balance) == (FAIL_BALANCE_PRICES)) { balance = 0.00; } len += sprintf((char *) value, "%.2f", balance); if (len < 6) { sprintf((char *)&value[len], "%s", (uint8_t *)GetCurrency(pSysConfig->BillingData.Currency)); } value[sizeof(value) - 1] = '\0'; string2ByteArray(value, cmd); DisplayValueToLcm(addr, cmd, sizeof(cmd)); } void ChangeAcBattMapAndValue(short page) { pAcChargingInfo = (struct ChargingInfoData *)GetAcChargingInfoData(0); if (page == _LCM_CHARGING) { if (isDiffStatus != _battery_display_ani) { isChangeBattMap = false; isDiffStatus = _battery_display_ani; } if (pAcChargingInfo->IsCharging && !isChangeBattMap) { isChangeBattMap = true; if (ac_ani_battery_level == _BATTERY_LEVEL_FOR_MAP_LV5) { ChangeDisplay2Value(__batt_map, _battery_empty); ac_ani_battery_level = _BATTERY_LEVEL_FOR_MAP_EMP; } else if (ac_ani_battery_level == _BATTERY_LEVEL_FOR_MAP_EMP) { ChangeDisplay2Value(__batt_map, _battery_cap_20); ac_ani_battery_level = _BATTERY_LEVEL_FOR_MAP_LV1; } else if (ac_ani_battery_level == _BATTERY_LEVEL_FOR_MAP_LV1) { ChangeDisplay2Value(__batt_map, _battery_cap_40); ac_ani_battery_level = _BATTERY_LEVEL_FOR_MAP_LV2; } else if (ac_ani_battery_level == _BATTERY_LEVEL_FOR_MAP_LV2) { ChangeDisplay2Value(__batt_map, _battery_cap_60); ac_ani_battery_level = _BATTERY_LEVEL_FOR_MAP_LV3; } else if (ac_ani_battery_level == _BATTERY_LEVEL_FOR_MAP_LV3) { ChangeDisplay2Value(__batt_map, _battery_cap_80); ac_ani_battery_level = _BATTERY_LEVEL_FOR_MAP_LV4; } else if (ac_ani_battery_level == _BATTERY_LEVEL_FOR_MAP_LV4) { ChangeDisplay2Value(__batt_map, _battery_cap_100); ac_ani_battery_level = _BATTERY_LEVEL_FOR_MAP_LV5; } } } else if (page == _LCM_COMPLETE) { if (ac_ani_battery_level == _BATTERY_LEVEL_FOR_MAP_LV5) { ChangeDisplay2Value(__batt_map, _battery_soc_20); } else if (ac_ani_battery_level == _BATTERY_LEVEL_FOR_MAP_EMP) { ChangeDisplay2Value(__batt_map, _battery_soc_20); } else if (ac_ani_battery_level == _BATTERY_LEVEL_FOR_MAP_LV1) { ChangeDisplay2Value(__batt_map, _battery_soc_40); } else if (ac_ani_battery_level == _BATTERY_LEVEL_FOR_MAP_LV2) { ChangeDisplay2Value(__batt_map, _battery_soc_60); } else if (ac_ani_battery_level == _BATTERY_LEVEL_FOR_MAP_LV3) { ChangeDisplay2Value(__batt_map, _battery_soc_80); } else if (ac_ani_battery_level == _BATTERY_LEVEL_FOR_MAP_LV4) { ChangeDisplay2Value(__batt_map, _battery_soc_100); } } ChangeDisplay2Value(__soc_value_charging, _disappear); } void ChangeBattMapAndValue(short page, int soc) { // srand(time(NULL)); // int min = 10; // int max = 90; // soc = rand() % (max - min + 1) + min; if (page == _LCM_PRE_CHARGE) { ChangeDisplay2Value(__batt_map_empty, _battery_empty); } else if (page == _LCM_CHARGING) { if (soc < 20) { if (_battery_display_ani) { ChangeDisplay2Value(__batt_map, _battery_empty); } else { ChangeDisplay2Value(__batt_map, _battery_cap_20); } } else if (soc >= 20 && soc < 40) { if (_battery_display_ani) { ChangeDisplay2Value(__batt_map, _battery_cap_20); } else { ChangeDisplay2Value(__batt_map, _battery_cap_40); } } else if (soc >= 40 && soc < 60) { if (_battery_display_ani) { ChangeDisplay2Value(__batt_map, _battery_cap_40); } else { ChangeDisplay2Value(__batt_map, _battery_cap_60); } } else if (soc >= 60 && soc < 80) { if (_battery_display_ani) { ChangeDisplay2Value(__batt_map, _battery_cap_60); } else { ChangeDisplay2Value(__batt_map, _battery_cap_80); } } else if (soc >= 80 && soc <= 100) { if (_battery_display_ani) { ChangeDisplay2Value(__batt_map, _battery_cap_80); //DS60-120 add } else { ChangeDisplay2Value(__batt_map, _battery_cap_100); } } } else if (page == _LCM_COMPLETE) { if (soc < 20) { ChangeDisplay2Value(__batt_map, _battery_soc_20); } else if (soc >= 20 && soc < 40) { ChangeDisplay2Value(__batt_map, _battery_soc_40); } else if (soc >= 40 && soc < 60) { ChangeDisplay2Value(__batt_map, _battery_soc_60); } else if (soc >= 60 && soc < 80) { ChangeDisplay2Value(__batt_map, _battery_soc_80); } else if (soc >= 80 && soc <= 100) { ChangeDisplay2Value(__batt_map, _battery_soc_100); } } uint8_t cmd[5]; uint8_t value[5]; memset(cmd, 0x00, sizeof(cmd)); memset(value, 0x00, sizeof(value)); sprintf((char *)value, "%d%%", soc); string2ByteArray(value, cmd); DisplayValueToLcm(__soc_value_charging, cmd, sizeof(cmd)); } void ChangeRemainTime(int sec) { int h, m, s; uint8_t cmd[10]; uint8_t value[10]; memset(cmd, 0x00, sizeof(cmd)); // srand(time(NULL)); // int min = 0; // int max = 65536; // sec = rand() % (max - min + 1) + min; h = (sec / 3600); m = (sec - (3600 * h)) / 60; s = (sec - (3600 * h) - (m * 60)); sprintf((char *)value, "%02d:%02d:%02d", h, m, s); string2ByteArray(value, cmd); DisplayValueToLcm(__remain_time_tx, cmd, sizeof(cmd)); } void ChangeChargingEnergyValue(float energy) { uint8_t cmd[10]; uint8_t value[10]; memset(cmd, 0x00, sizeof(cmd)); if (energy >= 0.05) { energy -= 0.05; } sprintf((char *) value, "%.1f kWh", energy); string2ByteArray(value, cmd); DisplayValueToLcm(__total_out_eng_tx, cmd, sizeof(cmd)); } void ChangeChargingPowerValue(float pow) { uint8_t cmd[10]; uint8_t value[10]; memset(cmd, 0x00, sizeof(cmd)); // float min = 0.0; // float max = 50; // pow = (max - min) * rand() / (RAND_MAX + 1.0) + min; sprintf((char *) value, "%.1f kW", pow); string2ByteArray(value, cmd); DisplayValueToLcm(__output_eng_tx, cmd, sizeof(cmd)); } void ChangeChargingFeeValue(float fee) { uint8_t cmd[10]; uint8_t value[10]; memset(cmd, 0x00, sizeof(cmd)); sprintf((char *) value, "%.2f", fee); string2ByteArray(value, cmd); DisplayValueToLcm(__charging_fee_tx, cmd, sizeof(cmd)); } void DisplayMoneyRate(float money) { uint8_t cmd[8]; uint8_t value[8]; memset(cmd, 0x00, sizeof(cmd)); sprintf((char *) value, "%.2f", money); string2ByteArray(value, cmd); DisplayValueToLcm(__money_by_rate, cmd, sizeof(cmd)); } void DisplayMoneyCur(uint8_t *cur) { uint8_t cmd[10] = {0}; uint8_t buf[10] = {0}; uint8_t len = 0; *(cur + 3) = '\0'; memset(cmd, 0x00, sizeof(cmd)); len = sprintf((char *) buf, "%s/kWh", cur); buf[len] = '\0'; string2ByteArray(buf, cmd); DisplayValueToLcm(__money_rate, cmd, sizeof(cmd)); } void RefreshPageAnimation(uint8_t value) { switch (_currentPage) { case _LCM_IDLE: { } break; case _LCM_WAIT_FOR_PLUG: { if (_everyPageRollChange == 0) { ChangeDisplay2Value(__plug_in_arrow, _arrow_dark); } else if (_everyPageRollChange == 15) { ChangeDisplay2Value(__plug_in_arrow, _arrow_light); } _everyPageRollChange > 30 ? _everyPageRollChange = 0 : _everyPageRollChange++; } break; case _LCM_PRE_CHARGE: case _LCM_CHARGING: case _LCM_COMPLETE: { if (_currentPage == _LCM_PRE_CHARGE) { if (_everyPageRollChange == 0 || _everyPageRollChange == 22) { ChangeDisplay2Value(__conn_line, _conn_map1); } else if (_everyPageRollChange == 11 || _everyPageRollChange == 33) { ChangeDisplay2Value(__conn_line, _conn_map2); } } else if (_currentPage == _LCM_CHARGING) { if (_everyPageRollChange == 0 || _everyPageRollChange == 22) { ChangeDisplay2Value(__conn_line_chag, _charging_map1); } else if (_everyPageRollChange == 11 || _everyPageRollChange == 33) { ChangeDisplay2Value(__conn_line_chag, _charging_map2); } } else if (_currentPage == _LCM_COMPLETE) { if (_everyPageRollChange == 0) { ChangeDisplay2Value(__conn_line_comp, _complete_map); } } _everyPageRollChange >= 45 ? _everyPageRollChange = 0 : _everyPageRollChange++; } break; } } void RefreshConnStatus() { // Wifi priority is higher than Ethernet #if defined DD360Tcci ||defined DD360Audi || defined DD360ComBox uint8_t i = 0; uint8_t ethstatus = 0; for (i = 0; i < pSysWarning->WarningCount; i++) { if (memcmp(&pSysWarning->WarningCode[i][0], "012304", 6) == 0) { ethstatus = 1; //if (ShmSelectGunInfo->EthDevStatus.Ethernet != DEV_ST_DISABLE) { // ShmSelectGunInfo->EthDevStatus.Ethernet = DEV_ST_ENABLE_NO_USE; //} break; } } if (ShmSelectGunInfo->EthDevStatus.Backend == DEV_ST_DISABLE) { ChangeDisplay2Value(__conn_status, _disappear); } else if (ShmSelectGunInfo->EthDevStatus.Backend == DEV_ST_ENABLE_USE) { ChangeDisplay2Value(__conn_status, _connect); } else if (ShmSelectGunInfo->EthDevStatus.Backend == DEV_ST_ENABLE_NO_USE) { ChangeDisplay2Value(__conn_status, _disconnect); } if (ethstatus == 1) { if (ShmSelectGunInfo->EthDevStatus.Ethernet != DEV_ST_DISABLE) { ChangeDisplay2Value(__ethernet_status, _eth_disconnect); } } else { if (ShmSelectGunInfo->EthDevStatus.Ethernet != DEV_ST_DISABLE) { ChangeDisplay2Value(__ethernet_status, _eth_connect); } //if (ShmSelectGunInfo->EthDevStatus.Ethernet == DEV_ST_DISABLE) { //} else if (ShmSelectGunInfo->EthDevStatus.Ethernet == DEV_ST_ENABLE_USE) { // ChangeDisplay2Value(__ethernet_status, _eth_connect); //} else if (ShmSelectGunInfo->EthDevStatus.Ethernet == DEV_ST_ENABLE_NO_USE) { // ChangeDisplay2Value(__ethernet_status, _eth_disconnect); //} } if (ShmSelectGunInfo->EthDevStatus.Wifi == DEV_ST_DISABLE) { ChangeDisplay2Value(__wifi_status, _disappear); ChangeDisplay2Value(__3G4G_status, _disappear); if (ShmSelectGunInfo->EthDevStatus.FourG == DEV_ST_DISABLE) { ChangeDisplay2Value(__3G4G_move_status, _disappear); } else if (ShmSelectGunInfo->EthDevStatus.FourG == DEV_ST_ENABLE_USE) { ChangeDisplay2Value(__3G4G_move_status, __3G4G_connect); } else if (ShmSelectGunInfo->EthDevStatus.FourG == DEV_ST_ENABLE_NO_USE) { ChangeDisplay2Value(__3G4G_move_status, _3G4G_disconnect); } } else if (ShmSelectGunInfo->EthDevStatus.Wifi == DEV_ST_ENABLE_USE) { ChangeDisplay2Value(__3G4G_move_status, _disappear); ChangeDisplay2Value(__wifi_status, _wifi_connect); } else if (ShmSelectGunInfo->EthDevStatus.Wifi == DEV_ST_ENABLE_NO_USE) { ChangeDisplay2Value(__3G4G_move_status, _disappear); ChangeDisplay2Value(__wifi_status, _wifi_disconnect); } if (ShmSelectGunInfo->EthDevStatus.Wifi != DEV_ST_DISABLE) { if (ShmSelectGunInfo->EthDevStatus.FourG == DEV_ST_DISABLE) { ChangeDisplay2Value(__3G4G_status, _disappear); } else if (ShmSelectGunInfo->EthDevStatus.FourG == DEV_ST_ENABLE_USE) { ChangeDisplay2Value(__3G4G_status, __3G4G_connect); } else if (ShmSelectGunInfo->EthDevStatus.FourG == DEV_ST_ENABLE_NO_USE) { ChangeDisplay2Value(__3G4G_status, _3G4G_disconnect); } } //uint8_t flag[4] = {0}; /*for (i = 0; i < pSysWarning->WarningCount; i++) { //printf("status code = %s", &pSysWarning->WarningCode[i][0]); if (memcmp(&pSysWarning->WarningCode[i][0], "012304", 6) == 0) { flag[0] = 1; continue; } if (memcmp(&pSysWarning->WarningCode[i][0], "043625", 6) == 0) { //disconnected from AP through WiFi flag[1] = 1; continue; } if (memcmp(&pSysWarning->WarningCode[i][0], "043627", 6) == 0) { //wifi disabled flag[1] = 2; continue; } if ((memcmp(&pSysWarning->WarningCode[i][0], "033900", 6) == 0) || (memcmp(&pSysWarning->WarningCode[i][0], "033901", 6) == 0) || (memcmp(&pSysWarning->WarningCode[i][0], "033902", 6) == 0)) { flag[2] = 1; continue; } if (memcmp(&pSysWarning->WarningCode[i][0], "043626", 6) == 0) { //disconnected from APN through 3G/4G flag[3] = 1; continue; } if (memcmp(&pSysWarning->WarningCode[i][0], "043628", 6) == 0) { //4g disabled flag[3] = 2; continue; } } if (flag[0] == 1) { ChangeDisplay2Value(__ethernet_status, _eth_disconnect); } else { ChangeDisplay2Value(__ethernet_status, _eth_connect); } //ChangeDisplay2Value(__wifi_status, _disappear); //ChangeDisplay2Value(__conn_status, _disappear); //ChangeDisplay2Value(__3G4G_status, _disappear); if (flag[1] == 1) { ChangeDisplay2Value(__3G4G_move_status, _disappear); ChangeDisplay2Value(__wifi_status, _wifi_disconnect); } else if (flag[1] == 2) { ChangeDisplay2Value(__wifi_status, _disappear); } else { ChangeDisplay2Value(__3G4G_move_status, _disappear); ChangeDisplay2Value(__wifi_status, _wifi_connect); } if (flag[2] == 1) { ChangeDisplay2Value(__conn_status, _disconnect); } else { ChangeDisplay2Value(__conn_status, _connect); } if (flag[1] == 2) { ChangeDisplay2Value(__3G4G_status, _disappear); if (flag[3] == 1) { ChangeDisplay2Value(__3G4G_move_status, _3G4G_disconnect); } else if (flag[3] == 2) { ChangeDisplay2Value(__3G4G_move_status, _disappear); } else { ChangeDisplay2Value(__3G4G_move_status, __3G4G_connect); } } else { if (flag[3] == 1) { ChangeDisplay2Value(__3G4G_status, _3G4G_disconnect); } else if (flag[3] == 2) { ChangeDisplay2Value(__3G4G_status, _disappear); } else { ChangeDisplay2Value(__3G4G_status, __3G4G_connect); } } */ #else // eth if (pSysInfo->ethInternetConn == YES) { ChangeDisplay2Value(__ethernet_status, _ethernet_connect); } else { ChangeDisplay2Value(__ethernet_status, _ethernet_disconnect); } // Wifi if ((pSysConfig->ModelName[10] == 'W' || pSysConfig->ModelName[10] == 'D') && pSysConfig->AthInterface.WifiMode != _SYS_WIFI_MODE_DISABLE) { if (pSysConfig->AthInterface.WifiNetworkConn == YES || pSysConfig->AthInterface.WifiMode == _SYS_WIFI_MODE_AP) { ChangeDisplay2Value(__wifi_status, _wifi_connect); } else { ChangeDisplay2Value(__wifi_status, _wifi_disconnect); } } else { ChangeDisplay2Value(__wifi_status, _disappear); } if ((pSysConfig->ModelName[10] == 'T' || pSysConfig->ModelName[10] == 'D') && pSysConfig->TelecomInterface.TelcomEnabled != NO) { if (pSysConfig->AthInterface.WifiMode == _SYS_WIFI_MODE_DISABLE) { ChangeDisplay2Value(__3G4G_status, _disappear); // 3G/4G if (pSysConfig->TelecomInterface.TelcomNetworkConn == YES) { ChangeDisplay2Value(__3G4G_move_status, _3G4G_disconnect); } else { ChangeDisplay2Value(__3G4G_move_status, _3G4G_disconnect); } } else { ChangeDisplay2Value(__3G4G_move_status, _disappear); // 3G/4G if (pSysConfig->TelecomInterface.TelcomNetworkConn == YES) { ChangeDisplay2Value(__3G4G_status, _3G4G_disconnect); } else { ChangeDisplay2Value(__3G4G_status, _3G4G_disconnect); } } } else { ChangeDisplay2Value(__3G4G_status, _disappear); ChangeDisplay2Value(__3G4G_move_status, _disappear); } // 連線到後台 if (pSysInfo->OcppConnStatus == YES) { ChangeDisplay2Value(__conn_status, _connect); } else { ChangeDisplay2Value(__conn_status, _disconnect); } /*if (pSysConfig->AthInterface.WifiNetworkConn == YES || pSysConfig->AthInterface.WifiMode == _SYS_WIFI_MODE_AP) { _wifi_conn_status = true; ChangeDisplay2Value(__wifi_status, _wifi_connect); ChangeDisplay2Value(__ethernet_status, _disappear); } else { _wifi_conn_status = false; ChangeDisplay2Value(__wifi_status, _disappear); } if (!_wifi_conn_status) { if (pSysConfig->TelecomInterface.TelcomNetworkConn == YES || pSysInfo->InternetConn == YES) { ChangeDisplay2Value(__ethernet_status, _ethernet_connect); } else { ChangeDisplay2Value(__ethernet_status, _ethernet_disconnect); } } // 連線到後台 if (pSysInfo->OcppConnStatus == YES) { ChangeDisplay2Value(__conn_status, _connect); } else { ChangeDisplay2Value(__conn_status, _disconnect); } */ #endif //defined DD360Tcci || defined DD360Audi } uint8_t FirstPageChanged() { uint8_t result = NO; if (_currentPage != _oldPage) { result = YES; _oldPage = _currentPage; } return result; } bool IsPageReloadChk() { bool result = false; if (pSysInfo->CurGunSelectedByAc == NO_DEFINE) { if (_curPage_index != pSysInfo->CurGunSelected) { _curPage_index = pSysInfo->CurGunSelected; result = true; } } else { if (_curPage_index != pSysInfo->CurGunSelectedByAc) { _curPage_index = pSysInfo->CurGunSelectedByAc; result = true; } } return result; } void ClearDisplayInfo() { ChangeDisplay2Value(__csu_ver_string, _disappear); ChangeDisplay2Value(__csu_ver_value, _disappear); ChangeDisplay2Value(__eth0_ip_string, _disappear); ChangeDisplay2Value(__eth0_ip_value, _disappear); ChangeDisplay2Value(__sn_string, _disappear); ChangeDisplay2Value(__sn_value, _disappear); ChangeDisplay2Value(__dc1_ver_string, _disappear); ChangeDisplay2Value(__dc1_ver_value, _disappear); ChangeDisplay2Value(__dc2_ver_string, _disappear); ChangeDisplay2Value(__dc2_ver_value, _disappear); ChangeDisplay2Value(__fan_speed_string, _disappear); ChangeDisplay2Value(__fan_speed_value, _disappear); } void DisplayInfoCsuVer(bool isShow, uint8_t *modelName) { if (isShow) { uint8_t value[10]; memset(value, 0x00, sizeof(value)); strcpy((char *)value, "CSU Ver >"); DisplayValueToLcm(__csu_ver_string, value, sizeof(value)); memset(value, 0x00, sizeof(value)); strncpy((char *)value, (char *)modelName, 5); DisplayValueToLcm(__csu_ver_value, value, sizeof(value)); } else { ChangeDisplay2Value(__csu_ver_string, _disappear); ChangeDisplay2Value(__csu_ver_value, _disappear); } } void ShowWifiMode(bool isShow, uint8_t mode) { if (isShow) { uint8_t value[20]; memset(value, 0x00, sizeof(value)); strcpy((char *) value, "Wifi Mo. >"); DisplayValueToLcm(__csu_ver_string, value, sizeof(value)); memset(value, 0x00, sizeof(value)); if (mode == 0) { sprintf((char *)value, "disable"); } else if (mode == 1) { sprintf((char *)value, "station"); } else if (mode == 2) { sprintf((char *)value, "AP"); } DisplayValueToLcm(__csu_ver_value, value, sizeof(value)); } else { ChangeDisplay2Value(__csu_ver_string, _disappear); ChangeDisplay2Value(__csu_ver_value, _disappear); } } void DisplayInfoEthIp(bool isShow, uint8_t *ip) { if (isShow) { uint8_t value[20]; memset(value, 0x00, sizeof(value)); strcpy((char *) value, "Eth IP >"); DisplayValueToLcm(__eth0_ip_string, value, sizeof(value)); memset(value, 0x00, sizeof(value)); strcpy((char *) value, (char *) ip); DisplayValueToLcm(__eth0_ip_value, value, sizeof(value)); } else { ChangeDisplay2Value(__eth0_ip_string, _disappear); ChangeDisplay2Value(__eth0_ip_value, _disappear); } } void Show4GRssi(bool isShow, int dbValue) { if (isShow) { uint8_t value[20]; memset(value, 0x00, sizeof(value)); strcpy((char *) value, "RSSI >"); DisplayValueToLcm(__eth0_ip_string, value, sizeof(value)); memset(value, 0x00, sizeof(value)); sprintf((char *)value, "%d dBm", dbValue); DisplayValueToLcm(__eth0_ip_value, value, sizeof(value)); } else { ChangeDisplay2Value(__eth0_ip_string, _disappear); ChangeDisplay2Value(__eth0_ip_value, _disappear); } } void DisplayInfoSN(bool isShow, uint8_t *sn) { if (isShow) { uint8_t value[30]; memset(value, 0x00, sizeof(value)); strcpy((char *) value, "SN >"); DisplayValueToLcm(__sn_string, value, sizeof(value)); memset(value, 0x00, sizeof(value)); strcpy((char *) value, (char *) sn); DisplayValueToLcm(__sn_value, value, sizeof(value)); } else { ChangeDisplay2Value(__sn_string, _disappear); ChangeDisplay2Value(__sn_value, _disappear); } } void ShowWifiRssi(bool isShow, int dbValue) { if (isShow) { uint8_t value[20]; memset(value, 0x00, sizeof(value)); strcpy((char *) value, "RSSI >"); DisplayValueToLcm(__sn_string, value, sizeof(value)); memset(value, 0x00, sizeof(value)); sprintf((char *)value, "%d dBm", dbValue); DisplayValueToLcm(__sn_value, value, sizeof(value)); } else { ChangeDisplay2Value(__sn_string, _disappear); ChangeDisplay2Value(__sn_value, _disappear); } } void DisplayInfoGun1Ver(bool isShow, uint8_t *version) { if (isShow) { uint8_t value[10]; memset(value, 0x00, sizeof(value)); strcpy((char *) value, "Ct1 Ver >"); DisplayValueToLcm(__dc1_ver_string, value, sizeof(value)); memset(value, 0x00, sizeof(value)); strcpy((char *) value, (char *) version); DisplayValueToLcm(__dc1_ver_value, value, sizeof(value)); } else { ChangeDisplay2Value(__dc1_ver_string, _disappear); ChangeDisplay2Value(__dc1_ver_value, _disappear); } } void Show4GMode(bool isShow, uint8_t mode) { if (isShow) { uint8_t value[20]; memset(value, 0x00, sizeof(value)); strcpy((char *) value, "3/4G Mo. >"); DisplayValueToLcm(__dc1_ver_string, value, sizeof(value)); memset(value, 0x00, sizeof(value)); if (mode == 0) { sprintf((char *)value, "disable"); } else if (mode == 1) { sprintf((char *)value, "enable"); } DisplayValueToLcm(__dc1_ver_value, value, sizeof(value)); } else { ChangeDisplay2Value(__dc1_ver_string, _disappear); ChangeDisplay2Value(__dc1_ver_value, _disappear); } } void DisplayInfoGun2Ver(bool isShow, uint8_t *version) { if (isShow) { uint8_t value[10]; memset(value, 0x00, sizeof(value)); strcpy((char *) value, "Ct2 Ver >"); DisplayValueToLcm(__dc2_ver_string, value, sizeof(value)); memset(value, 0x00, sizeof(value)); strcpy((char *) value, (char *) version); DisplayValueToLcm(__dc2_ver_value, value, sizeof(value)); } else { ChangeDisplay2Value(__dc2_ver_string, _disappear); ChangeDisplay2Value(__dc2_ver_value, _disappear); } } void Show4GIP(bool isShow, uint8_t *ip) { if (isShow) { uint8_t value[20]; memset(value, 0x00, sizeof(value)); strcpy((char *) value, "3/4G IP >"); DisplayValueToLcm(__dc2_ver_string, value, sizeof(value)); memset(value, 0x00, sizeof(value)); strcpy((char *) value, (char *) ip); DisplayValueToLcm(__dc2_ver_value, value, sizeof(value)); } else { ChangeDisplay2Value(__dc2_ver_string, _disappear); ChangeDisplay2Value(__dc2_ver_value, _disappear); } } void DisplayInfoSpeed(bool isShow, unsigned int fan) { if (isShow) { uint8_t value[10]; memset(value, 0x00, sizeof(value)); strcpy((char *) value, "Fan Spd >"); DisplayValueToLcm(__fan_speed_string, value, sizeof(value)); memset(value, 0x00, sizeof(value)); sprintf((char *)value, "%d", fan); DisplayValueToLcm(__fan_speed_value, value, sizeof(value)); } else { ChangeDisplay2Value(__fan_speed_string, _disappear); ChangeDisplay2Value(__fan_speed_value, _disappear); } } void ShowWifiIP(bool isShow, uint8_t *ip) { if (isShow) { uint8_t value[20]; memset(value, 0x00, sizeof(value)); strcpy((char *) value, "Wifi IP >"); DisplayValueToLcm(__fan_speed_string, value, sizeof(value)); memset(value, 0x00, sizeof(value)); strcpy((char *) value, (char *) ip); DisplayValueToLcm(__fan_speed_value, value, sizeof(value)); } else { ChangeDisplay2Value(__fan_speed_string, _disappear); ChangeDisplay2Value(__fan_speed_value, _disappear); } } void InformationShow() { if (pSysConfig->ShowInformation == YES) { bool show = _isShow = true; if (_showInformIndex == 0) { DisplayInfoCsuVer(show, pSysInfo->CsuRootFsFwRev); DisplayInfoSpeed(show, pSysInfo->SystemFanRotaSpeed); DisplayInfoSN(show, pSysConfig->SerialNumber); DisplayInfoEthIp(show, pSysConfig->Eth0Interface.EthIpAddress); DisplayInfoGun1Ver(show, pSysInfo->Connector1FwRev); if (_totalCount > 1) { DisplayInfoGun2Ver(show, pSysInfo->Connector2FwRev); } else { DisplayInfoGun2Ver(false, pSysInfo->Connector2FwRev); } } else if (_showInformIndex == 1) { ShowWifiMode(show, pSysConfig->AthInterface.WifiMode); ShowWifiIP(show, pSysConfig->AthInterface.WifiIpAddress); ShowWifiRssi(show, pSysConfig->AthInterface.WifiRssi); Show4GMode(show, pSysConfig->TelecomInterface.TelcomEnabled); Show4GIP(show, pSysConfig->TelecomInterface.TelcomIpAddress); Show4GRssi(show, pSysConfig->TelecomInterface.TelcomRssi); } } else { ClearDisplayInfo(); if (_isShow) { _isShow = false; _showInformIndex++; if (_showInformIndex >= 2) { _showInformIndex = 0; } } } } void ProcessPageInfo() { _page_reload = IsPageReloadChk(); pAcChargingInfo = (struct ChargingInfoData *)GetAcChargingInfoData(0); struct InfoCodeData *pInfoCode = (struct InfoCodeData *)GetShmInfoCodeData(); struct AlarmCodeData *pAlarmCode = (struct AlarmCodeData *)GetShmAlarmCodeData(); uint8_t i; // 隨插即充 - 可省略該按鈕 //DS60-120 add if (pSysConfig->AuthorisationMode == AUTH_MODE_ENABLE) { ChangeDisplay2Value(__ret_home_btn, _back_home_btn); if (_totalCount >= 2 && pSysInfo->IsAlternatvieConf == NO) { ChangeDisplay2Value(__sel_gun_btn, _sel_gun_btn); } else { ChangeDisplay2Value(__sel_gun_btn, _disappear); } } switch (_currentPage) { #if defined DD360Audi case _LCM_SELECT_GUN: ////For Audi if (pSysInfo->CurGunSelected == 0) { ChangeDisplay2Value(__left_gun_map, _left_gun_enable_map); ChangeDisplay2Value(__right_gun_map, _right_gun_disable_map); } else if (pSysInfo->CurGunSelected == 1) { ChangeDisplay2Value(__left_gun_map, _left_gun_disable_map); ChangeDisplay2Value(__right_gun_map, _right_gun_enable_map); } ChangeDisplay2Value(__add_chk_btn, _select_gun_btn); break; #endif //defined DD360Audi case _LCM_IDLE: { if (pSysConfig->isRFID) { ChangeDisplay2Value(__main_rfid, _main_rfid); } else { ChangeDisplay2Value(__main_rfid, _main_none_rfid); } if (pSysConfig->isQRCode) { ChangeDisplay2Value(__main_qr, _main_qr); } else { ChangeDisplay2Value(__qr_code, _disappear); ChangeDisplay2Value(__main_qr, _main_none_qr); needReloadQr = true; } if (pSysConfig->isAPP) { ChangeDisplay2Value(__main_app, _main_app); } else { ChangeDisplay2Value(__main_app, _main_none_app); } #if defined DD360Audi if(pSysInfo->CurGunSelected == LEFT_GUN_NUM ) ChangeDisplay2Value(__show_selectgun_value, _showselectgun_left); else if (pSysInfo->CurGunSelected == RIGHT_GUN_NUM ) ChangeDisplay2Value(__show_selectgun_value, _showselectgun_right); #endif //if (FirstPageChanged() == YES || needReloadQr || _page_reload) { if (pSysConfig->isQRCode) { needReloadQr = false; if (pSysConfig->QRCodeMadeMode == NO) { //uint8_t len = strlen((char *)pSysConfig->SystemId); ChangeQrCode_Idle((char *)pSysConfig->SystemId); } else { //uint8_t len = strlen((char *)pSysConfig->QRCodeContent); ChangeQrCode_Idle((char *)pSysConfig->QRCodeContent); } //ChangeQrCode_Idle((char *)pSysConfig->SystemId); } //} //DS60-120 add bool isCharging = false; for (uint8_t i = 0; i < _totalCount; i++) { pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(i); if (pDcChargingInfo->SystemStatus == S_IDLE) { continue; } isCharging = true; break; } if (isCharging && pSysInfo->IsAlternatvieConf == NO) { ChangeDisplay2Value(__sel_gun_btn, _sel_gun_btn); } else { ChangeDisplay2Value(__sel_gun_btn, _disappear); } } break; case _LCM_AUTHORIZING: case _LCM_AUTHORIZ_COMP: case _LCM_AUTHORIZ_FAIL: { //case _LCM_WAIT_FOR_PLUG: { FirstPageChanged(); #if defined DD360Audi if (_currentPage == _LCM_AUTHORIZ_COMP) { ////For Audi ChangeBalanceValue(__balance, pSysInfo->CurGunSelected); } #endif //defined DD360Audi } break; case _LCM_WAIT_FOR_PLUG: { #if defined DD360Audi if(pSysInfo->CurGunSelected == LEFT_GUN_NUM ) ChangeDisplay2Value(__show_waitgunplug_value, _showwaitgunplug_left); else if (pSysInfo->CurGunSelected == RIGHT_GUN_NUM ) ChangeDisplay2Value(__show_waitgunplug_value, _showwaitgunplug_right); #endif FirstPageChanged(); if (pSysConfig->AuthorisationMode == AUTH_MODE_DISABLE) { // 新增隨插即充功能預設在等待插槍頁面在開啟 ChangeDisplay2Value(__ret_home_btn, _disappear); bool isCharging = false; for (uint8_t i = 0; i < _totalCount; i++) { pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(i); if (pDcChargingInfo->SystemStatus == S_IDLE) { continue; } isCharging = true; break; } if (isCharging && pSysInfo->IsAlternatvieConf == NO) { ChangeDisplay2Value(__sel_gun_btn, _sel_gun_btn); } else { ChangeDisplay2Value(__sel_gun_btn, _disappear); } } else { ChangeDisplay2Value(__sel_gun_btn, _disappear); } } break; case _LCM_PRE_CHARGE: case _LCM_CHARGING: case _LCM_COMPLETE: { bool isShowAc = false; uint8_t gunTargetIndex = 0; if (_totalCount >= 2 ) ChangeDisplay2Value(__sel_gun_btn, _sel_gun_btn); if (acgunCount > 0) { gunTargetIndex = 2; if (pSysInfo->CurGunSelectedByAc != NO_DEFINE) { isShowAc = true; //ChangeDisplay2Value(__gun_type_index + (2 * 2), _actype_light); //DS60-120 remove if (_currentPage == _LCM_COMPLETE) { ChangeDisplay2Value(__cmp_gun_type_index + (gunTargetIndex * 2), _actype_light_cmp); } else { ChangeDisplay2Value(__gun_type_index + (gunTargetIndex * 2), _actype_light); } if (_currentPage == _LCM_CHARGING) { ChangeAcBattMapAndValue(_LCM_CHARGING); if (pAcChargingInfo->PresentChargedDuration >= 0 && pAcChargingInfo->PresentChargedDuration <= TIME_MAX_SEC) { ChangeRemainTime(pAcChargingInfo->PresentChargedDuration); } else { ChangeRemainTime(0); } if (pAcChargingInfo->PresentChargingPower >= 0.1 && pAcChargingInfo->PresentChargingPower <= POWER_MAX_KW) { ChangeChargingPowerValue(pAcChargingInfo->PresentChargingPower); } else { ChangeChargingPowerValue(0); } if (pAcChargingInfo->PresentChargedEnergy >= 0.1 && pAcChargingInfo->PresentChargedEnergy <= ENERGY_MAX_KWH) { ChangeChargingEnergyValue(pAcChargingInfo->PresentChargedEnergy); } else { ChangeChargingEnergyValue(0); } if (strcmp((char *)pAcChargingInfo->StartUserId, "") == 0 || pSysConfig->StopChargingByButton == YES) { ChangeDisplay2Value(__stop_method_btn, _stop_charging_btn); } else { ChangeDisplay2Value(__stop_method_btn, _stop_charging_btn_scan); } } else if (_currentPage == _LCM_COMPLETE) { ChangeAcBattMapAndValue(_LCM_COMPLETE); if (pAcChargingInfo->PresentChargedDuration >= 0 && pAcChargingInfo->PresentChargedDuration <= TIME_MAX_SEC) { ChangeRemainTime(pAcChargingInfo->PresentChargedDuration); } else { ChangeRemainTime(0); } if (pAcChargingInfo->PresentChargingPower >= 0.1 && pAcChargingInfo->PresentChargingPower <= POWER_MAX_KW) { ChangeChargingPowerValue(pAcChargingInfo->PresentChargingPower); } else { ChangeChargingPowerValue(0); } if (pAcChargingInfo->PresentChargedEnergy >= 0.1 && pAcChargingInfo->PresentChargedEnergy <= ENERGY_MAX_KWH) { ChangeChargingEnergyValue(pAcChargingInfo->PresentChargedEnergy); if (pSysConfig->BillingData.isBilling && pAcChargingInfo->ChargingFee >= 0) { ChangeChargingFeeValue(pAcChargingInfo->ChargingFee); } } else { ChangeChargingEnergyValue(0); if (pSysConfig->BillingData.isBilling) { ChangeChargingFeeValue(0); } } if (!pSysConfig->BillingData.isBilling) { ChangeDisplay2Value(__charging_fee_map, _disappear); ChangeDisplay2Value(__charging_fee_tx, _disappear); } else { ChangeDisplay2Value(__charging_fee_map, _money_map); } } } else { //ChangeDisplay2Value(__gun_type_index + (2 * 2), _actype_dark); //DS60-120 remove if (_currentPage == _LCM_COMPLETE) { ChangeDisplay2Value(__cmp_gun_type_index + (gunTargetIndex * 2), _actype_dark_cmp); } else { ChangeDisplay2Value(__gun_type_index + (gunTargetIndex * 2), _actype_dark); } } } else { //ChangeDisplay2Value(__gun_type_index + (2 * 2), _disappear); //DS60-120 remove if (_totalCount > 1) { gunTargetIndex = 2; ChangeDisplay2Value(__cmp_gun_type_index + (gunTargetIndex * 2), _disappear); ChangeDisplay2Value(__gun_type_index + (gunTargetIndex * 2), _disappear); } } gunTargetIndex = 0; //DS60-120 add for (uint8_t i = 0; i < _totalCount; i++) { if (_totalCount == 1 && acgunCount <= 0) { //DS60-120 add gunTargetIndex = 2; } else { gunTargetIndex = i; } pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(i); switch (pDcChargingInfo->Type) { case _Type_Chademo: { if (pSysInfo->CurGunSelected == i && !isShowAc) { if (_currentPage == _LCM_COMPLETE) { ChangeDisplay2Value(__cmp_gun_type_index + (i * 2), _chademo_light_cmp); } else { ChangeDisplay2Value(__gun_type_index + (i * 2), _chademo_light); } } else { if (_currentPage == _LCM_COMPLETE) { ChangeDisplay2Value(__cmp_gun_type_index + (i * 2), _chademo_dark_cmp); } else { ChangeDisplay2Value(__gun_type_index + (i * 2), _chademo_dark); } } } break; case _Type_GB: { if (pSysInfo->CurGunSelected == i && !isShowAc) { if (_currentPage == _LCM_COMPLETE) { ChangeDisplay2Value(__cmp_gun_type_index + (i * 2), _gbt_light_cmp); } else { ChangeDisplay2Value(__gun_type_index + (i * 2), _gbt_light); } } else { if (_currentPage == _LCM_COMPLETE) { ChangeDisplay2Value(__cmp_gun_type_index + (i * 2), _gbt_dark_cmp); } else { ChangeDisplay2Value(__gun_type_index + (i * 2), _gbt_dark); } } } break; case _Type_CCS_2: { if (pSysInfo->CurGunSelected == i && !isShowAc) { if (_currentPage == _LCM_COMPLETE) { ChangeDisplay2Value(__cmp_gun_type_index + (i * 2), _ccs_light_cmp); } else { ChangeDisplay2Value(__gun_type_index + (i * 2), _ccs_light); } } else { if (_currentPage == _LCM_COMPLETE) { ChangeDisplay2Value(__cmp_gun_type_index + (i * 2), _ccs_dark_cmp); } else { ChangeDisplay2Value(__gun_type_index + (i * 2), _ccs_dark); } } } break; } if (_currentPage == _LCM_PRE_CHARGE && !isShowAc) { if (pSysInfo->CurGunSelected == i) { ChangeBattMapAndValue(_currentPage, pDcChargingInfo->EvBatterySoc); uint8_t precharg_time = (GetPreChargeTimeoutValue(pDcChargingInfo->PreChargeTimer)/1) / uSEC_VAL; if (precharg_time > PRECHARGING_TTIMEOUT) precharg_time = PRECHARGING_TTIMEOUT; ChangeTimeValue(PRECHARGING_TTIMEOUT- precharg_time); if (pDcChargingInfo->SystemStatus >= S_REASSIGN_CHECK && pDcChargingInfo->SystemStatus <= S_PREPARING_FOR_EV) { ChangeDisplay2Value(__show_handshark_value, _show_handshark_light); ChangeDisplay2Value(__show_GFD_value, _show_GFD_dark); ChangeDisplay2Value(__show_precharge_value, _show_precharge_dark); } else if (pDcChargingInfo->SystemStatus == S_PREPARING_FOR_EVSE) { // Detect GFD finish and into precharge mode if (pDcChargingInfo->Type == _Type_Chademo || pDcChargingInfo->Type == _Type_GB) { if (pDcChargingInfo->_SaftyDetect == false ) { ChangeDisplay2Value(__show_handshark_value, _show_handshark_dark); ChangeDisplay2Value(__show_GFD_value, _show_GFD_light); ChangeDisplay2Value(__show_precharge_value, _show_precharge_dark); if (pDcChargingInfo->EvBatterytargetVoltage == 0) pDcChargingInfo->_SaftyDetect = true; } else { ChangeDisplay2Value(__show_handshark_value, _show_handshark_dark); ChangeDisplay2Value(__show_GFD_value, _show_GFD_dark); ChangeDisplay2Value(__show_precharge_value, _show_precharge_light); } } else { ChangeDisplay2Value(__show_handshark_value, _show_handshark_dark); ChangeDisplay2Value(__show_GFD_value, _show_GFD_light); ChangeDisplay2Value(__show_precharge_value, _show_precharge_dark); } } else if (pDcChargingInfo->SystemStatus == S_CCS_PRECHARGE_ST0 || pDcChargingInfo->SystemStatus == S_CCS_PRECHARGE_ST1) { if (pDcChargingInfo->_SaftyDetect == false ) { ChangeDisplay2Value(__show_handshark_value, _show_handshark_dark); ChangeDisplay2Value(__show_GFD_value, _show_GFD_light); ChangeDisplay2Value(__show_precharge_value, _show_precharge_dark); if (pDcChargingInfo->EvBatterytargetVoltage == 0) pDcChargingInfo->_SaftyDetect = true; } else { ChangeDisplay2Value(__show_handshark_value, _show_handshark_dark); ChangeDisplay2Value(__show_GFD_value, _show_GFD_dark); ChangeDisplay2Value(__show_precharge_value, _show_precharge_light); } } else { ChangeDisplay2Value(__show_handshark_value, _disappear); ChangeDisplay2Value(__show_GFD_value, _disappear); ChangeDisplay2Value(__show_precharge_value, _disappear); } } } else if (_currentPage == _LCM_CHARGING && !isShowAc) { if (pSysInfo->CurGunSelected == i) { ChangeBattMapAndValue(_LCM_CHARGING, pDcChargingInfo->EvBatterySoc); if (pDcChargingInfo->PresentChargedDuration >= 0 && pDcChargingInfo->PresentChargedDuration <= TIME_MAX_SEC) { ChangeRemainTime(pDcChargingInfo->PresentChargedDuration); } else { ChangeRemainTime(0); } if (pDcChargingInfo->PresentChargingPower >= 0 && pDcChargingInfo->PresentChargingPower <= POWER_MAX_KW) { ChangeChargingPowerValue(pDcChargingInfo->PresentChargingPower); } else { ChangeChargingPowerValue(0); } if (pDcChargingInfo->PresentChargedEnergy >= 0.1 && pDcChargingInfo->PresentChargedEnergy <= ENERGY_MAX_KWH) { ChangeChargingEnergyValue(pDcChargingInfo->PresentChargedEnergy); } else { ChangeChargingEnergyValue(0); } if (strcmp((char *)pDcChargingInfo->StartUserId, "") == 0 || pSysConfig->StopChargingByButton == YES) { ChangeDisplay2Value(__stop_method_btn, _stop_charging_btn); } else { ChangeDisplay2Value(__stop_method_btn, _stop_charging_btn_scan); } } } else if (_currentPage == _LCM_COMPLETE && !isShowAc) { if (pSysInfo->CurGunSelected == i) { ChangeBattMapAndValue(_LCM_COMPLETE, pDcChargingInfo->EvBatterySoc); if (pDcChargingInfo->PresentChargedDuration >= 0 && pDcChargingInfo->PresentChargedDuration <= TIME_MAX_SEC) { ChangeRemainTime(pDcChargingInfo->PresentChargedDuration); } else { ChangeRemainTime(0); } if (pDcChargingInfo->PresentChargingPower >= 0 && pDcChargingInfo->PresentChargingPower <= POWER_MAX_KW) { ChangeChargingPowerValue(pDcChargingInfo->PresentChargingPower); } else { ChangeChargingPowerValue(0); } #if 1 if (pDcChargingInfo->PresentChargedEnergy >= 0.1 && pDcChargingInfo->PresentChargedEnergy <= ENERGY_MAX_KWH) { ChangeChargingEnergyValue(pDcChargingInfo->PresentChargedEnergy); if (pSysConfig->BillingData.isBilling && pDcChargingInfo->ChargingFee >= 0) { ChangeChargingFeeValue(pDcChargingInfo->ChargingFee); ChangeBalanceValue(__remain_balance, i); } } else { ChangeChargingEnergyValue(0); if (pSysConfig->BillingData.isBilling) { ChangeChargingFeeValue(0); ChangeBalanceValue(__remain_balance, i); } } #else ChangeChargingEnergyValue(pDcChargingInfo->PresentChargedEnergy); if (pSysConfig->BillingData.isBilling && pDcChargingInfo->ChargingFee >= 0) { ChangeChargingFeeValue(pDcChargingInfo->ChargingFee); ChangeBalanceValue(__remain_balance, i); } #endif // 0 if (!pSysConfig->BillingData.isBilling) { ChangeDisplay2Value(__charging_fee_map, _disappear); ChangeDisplay2Value(__charging_fee_tx, _disappear); } else { ChangeDisplay2Value(__charging_fee_map, _money_map); } #ifdef DD360Audi // Warming Occur in prepare or precharing state, turn into complete mode if (pInfoCode->InfoEvents.bits.Stop_by_EV_with_unknow_reason) { RunFullTargetFunction(true); } else { RunFullTargetFunction(false); if (pDcChargingInfo->Replug_flag) { RunReplugStringFunction(true); } else { RunReplugStringFunction(false); } } #endif } } } // gun btn and QR code if (_totalCount + acgunCount >= 2 && _currentPage) { uint8_t index = 0; for (index = 0; index < _totalCount; index++) { if (pSysInfo->CurGunSelected != index) { break; } } pDcChargingInfo = (struct ChargingInfoData *)GetDcChargingInfoData(index); if (pDcChargingInfo->SystemStatus == S_IDLE || pDcChargingInfo->SystemStatus == S_RESERVATION || pDcChargingInfo->SystemStatus == S_BOOTING) { if (FirstPageChanged() == YES || needReloadQr || _page_reload) { if (pSysConfig->isQRCode) { needReloadQr = false; //ChangeQrCode_Charge((char *)pSysConfig->SystemId); //DS60-120 remove if (pSysConfig->QRCodeMadeMode == NO) { //uint8_t len = strlen((char *)pSysConfig->SystemId); ChangeQrCode_Charge((char *)pSysConfig->SystemId); } else { //uint8_t len = strlen((char *)pSysConfig->QRCodeContent); ChangeQrCode_Charge((char *)pSysConfig->QRCodeContent); } } } } } } break; case _LCM_FIX: #if defined DD360Audi // For Emergency Button if (ShmPrimaryMcuData->InputDet.bits.EmergencyButton == 1) { ChangeToOtherPage(_LCM_EMERGENCY); break; } // For Network Disconnect for (i = 0; i < pSysWarning->WarningCount; i++) { if (memcmp(&pSysWarning->WarningCode[i][0], "012304", 6) == 0 || memcmp(&pSysWarning->WarningCode[i][0], "042304", 6) == 0) { ChangeToOtherPage(_LCM_DISCONNECT); break; } } #endif break; } } void ChangeDisplayMoneyInfo() { uint8_t curGun = pSysInfo->CurGunSelected; if (pSysConfig->BillingData.isBilling) { struct timeb csuTime; struct tm *tmCSU; ftime(&csuTime); tmCSU = localtime(&csuTime.time); ChangeDisplay2Value(__money_rate_map, _charging_money); #if defined DD360Audi if (ShmSelectGunInfo->PricesInfo[curGun].UserPrices != 0.00) { //Jerry add DisplayMoneyRate(ShmSelectGunInfo->PricesInfo[curGun].UserPrices); } else { #endif //defined DD360Audi if (tmCSU->tm_hour <= 23) { pSysConfig->BillingData.Cur_fee = pSysConfig->BillingData.Fee[tmCSU->tm_hour]; DisplayMoneyRate(pSysConfig->BillingData.Cur_fee); } if (pSysConfig->BillingData.Currency <= 53) { DisplayMoneyCur((uint8_t *)GetCurrency(pSysConfig->BillingData.Currency)); } #if defined DD360Audi } #endif //defined DD360Audi } else { ChangeDisplay2Value(__money_rate_map, _disappear); ChangeDisplay2Value(__money_by_rate, _disappear); ChangeDisplay2Value(__money_rate, _disappear); } } /*void Initialization() { bool isPass = false; uint8_t count = 5; while (!isPass && count > 0) { isPass = true; for (uint8_t _index = 0; _index < _totalCount; _index++) { if (!FindChargingInfoData(_index, &_chargingInfoData[0])) { log_error("LcmComm (main) : FindChargingInfoData false "); isPass = false; count--; break; } } sleep(1); } isPass = false; if (acgunCount > 0) { while (!isPass) { isPass = true; for (uint8_t _index = 0; _index < acgunCount; _index++) { if (!FindAcChargingInfoData(_index, &ac_chargingInfo[0])) { log_error("LcmComm : FindAcChargingInfoData false "); isPass = false; break; } } sleep(1); } } if (count == 0) { log_info("LCM Initialization Gun Fail............."); } } */ //DS60-120 add void DefaultIconStatus() { for (uint8_t i = 0; i < 3; i++) { ChangeDisplay2Value(__gun_type_index + (i * 2), _disappear); } if (pSysInfo->IsAlternatvieConf == YES || _totalCount == 1) { ChangeDisplay2Value(__sel_gun_btn, _disappear); } else { log_info("DefaultIconStatus"); ChangeDisplay2Value(__sel_gun_btn, _sel_gun_btn); } } void GetDeviceInfoStatus(short address, uint8_t len) { uint8_t cmd[8]; memset(cmd, 0x00, sizeof(cmd)); uint8_t msg[11]; memset(msg, 0x00, sizeof(msg)); cmd[0] = CMD_TITLE_1; cmd[1] = CMD_TITLE_2; cmd[2] = 0x04; cmd[3] = CMD_MULTI_READ; cmd[4] = (address >> 8) & 0xff; cmd[5] = (address >> 0) & 0xff; cmd[6] = len; WriteCmdToLcm(cmd, ARRAY_SIZE(cmd)); usleep(10000); ReadMsgFromLcm(msg, ARRAY_SIZE(msg)); } int8_t lcdRegisterWrite(int32_t fd, uint8_t regType, uint16_t address, uint8_t *data, uint16_t dataLen) { int8_t result = FAIL; uint8_t tx[(regType == REG_TYPE_CONTROL? 8 : 6) + dataLen]; uint8_t rx[6]; memset(tx, 0x00, sizeof(tx)); memset(rx, 0x00, sizeof(rx)); tx[0] = CMD_HEADER_1; tx[1] = CMD_HEADER_2; tx[2] = (regType == REG_TYPE_CONTROL? 7 : (3 + dataLen)); tx[3] = CMD_REG_WRITE_DATA; tx[4] = (address >> 8) & 0xff; tx[5] = (address >> 0) & 0xff; if(regType == REG_TYPE_CONTROL) { if(address == REG_ADDRESS_SET_PAGE_ID) { tx[6] = 0x5A; tx[7] = 0x01; memcpy(&tx[8], data, dataLen); } } else { memcpy(&tx[6], data, dataLen); } if(fd > 0) { if(transceiverDgus(fd, tx, ARRAY_SIZE(tx), rx, ARRAY_SIZE(rx)) == PASS) { result = PASS; } else {} } else {} return result; } void ResetLCM() { uint8_t cmd_reset [] = { 0x55, 0xaa, 0x5a, 0xa5 }; while (lcdRegisterWrite ( _port, REG_TYPE_RAM, 0x04, cmd_reset, ARRAY_SIZE( cmd_reset ) ) != PASS) { log_error( "LCD reset fail.\n" ); } sleep ( 1 ); } //======================================= // LCD upgrade //======================================= int downloadBMP(uint8_t picIdx, char *filename) { int result = PASS; BMP *bmp; struct stat fileSt; uint32_t pageSize = 0xf0; uint32_t pixelSize; uint32_t transferedByte=0; uint16_t bufferRamAddr = 0x8000; uint32_t dataLen = 0; uint32_t startAddr=0; // Reset LCD ResetLCM(); // Get image file size stat(filename, &fileSt); bmp = bopen(filename); uint8_t buf[bmp->width*bmp->height*2]; log_info("Target address: %d\n", picIdx); log_info("Image filename: %s\n", filename); log_info("Image width: %d height: %d\n", bmp->width, bmp->height); log_info("Image data size: %d\n", ARRAY_SIZE(buf)); // Get bmp pixel data and convert to 16 bit color for(uint16_t idxY=0 ; idxYheight ; idxY++) { for(uint16_t idxX=0 ; idxXwidth ; idxX++) { uint8_t r, g, b; get_pixel_rgb(bmp, idxX, (bmp->height-idxY-1), &r, &g, &b); buf[(2*((idxY*bmp->width) + idxX)) + 0] = ((((r>>3)<<11) | ((g>>2)<<5) | (b>>3)) >> 8) & 0xff; buf[(2*((idxY*bmp->width) + idxX)) + 1] = ((((r>>3)<<11) | ((g>>2)<<5) | (b>>3)) >> 0) & 0xff; } } bclose(bmp); // Transfer pixel to screen page pixelSize = ARRAY_SIZE(buf); for(uint16_t idxSrcData=0;idxSrcData<(((pixelSize%pageSize)==0)?(pixelSize/pageSize):(pixelSize/pageSize)+1);idxSrcData++) { //log_info("Buffer start data address: 0x%08X\n", (idxSrcData*pageSize)); //log_info(" Image start ram address: 0x%08X\n", ((idxSrcData*pageSize) >> 1)); uint8_t display_cmd[] ={0x5a, (bufferRamAddr>>8)&0xff, (bufferRamAddr>>0)&0xff, 0x00, 0x00, 0x00, 0x00, 0x00}; if((idxSrcData+1) != (((pixelSize%pageSize)==0)?(pixelSize/pageSize):(pixelSize/pageSize)+1)) { // Data transfer while(lcdRegisterWrite(_port, REG_TYPE_RAM, (bufferRamAddr+(dataLen>>1)), &buf[(idxSrcData*pageSize)], pageSize) != PASS) { log_info("Transfer data to ram 0x%04X fail.\n", transferedByte); } transferedByte += pageSize; dataLen += pageSize; } else { // Last data transfer while(lcdRegisterWrite(_port, REG_TYPE_RAM, (bufferRamAddr+(dataLen>>1)), &buf[(idxSrcData*pageSize)], (pixelSize-(idxSrcData*pageSize))) != PASS) { log_info("Transfer data to ram 0x%04X fail.\n", transferedByte); } transferedByte += (pixelSize-(idxSrcData*pageSize)); dataLen += (pixelSize-(idxSrcData*pageSize)); } // Move data from ram to flash if((dataLen >= (pageSize*10)) || (idxSrcData == (((pixelSize%pageSize)==0)?(pixelSize/pageSize):(pixelSize/pageSize)+1)-1)) { display_cmd[3] = ((dataLen>>1) >> 8) & 0xff; // Data length high byte display_cmd[4] = ((dataLen>>1) >> 0) & 0xff; // Data length low byte display_cmd[5] = (((startAddr)>>1) >> 16) & 0xff; // Screen on ram address 1st byte display_cmd[6] = (((startAddr)>>1) >> 8) & 0xff; // Screen on ram address 2nd byte display_cmd[7] = (((startAddr)>>1) >> 0) & 0xff; // Screen on ram address 3th byte while(lcdRegisterWrite(_port, REG_TYPE_RAM, 0xa2, display_cmd, ARRAY_SIZE(display_cmd)) != PASS) { log_info("Write data to display buffer 0x%04X fail.\n", transferedByte); } startAddr += dataLen; dataLen = 0; } } // Save image to target address uint8_t save_cmd[] ={0x5a, 0x02, ((picIdx>>8)&0xff), (picIdx&0xff)}; while(lcdRegisterWrite(_port, REG_TYPE_RAM, 0x84, save_cmd, ARRAY_SIZE(save_cmd)) != PASS) { log_info("Save image fail.\n"); } log_info("Save image success.\n"); sleep(1); return result; } int downloadBIN(uint8_t targetAddr, char *filename) { int result = PASS; int fd; struct stat fileSt; uint32_t pageSize = 128; uint32_t blocklSize = 32768; uint32_t transferedByte=0; uint16_t bufferRamAddr = 0x8000; // Reset LCD ResetLCM(); // Get image file size stat(filename, &fileSt); if(S_ISDIR(fileSt.st_mode)) { return FAIL; } uint8_t buf[(fileSt.st_size%32768==0?(fileSt.st_size/32768)*32768:(fileSt.st_size/32768)+1)*32768]; log_info("Target address: %d\n", targetAddr); log_info("Bin filename: %s\n", filename); log_info("Bin data size: %ld\n", fileSt.st_size); fd = open(filename, O_RDWR); if (fd < 0) { log_info("Bin can not be open.\n"); result = FAIL; } else { // Read data from bin file memset(buf, 0x00, ARRAY_SIZE(buf)); read(fd, buf, ARRAY_SIZE(buf)); close(fd); for(uint8_t idxBinSrc=0;idxBinSrc<(fileSt.st_size%32768==0?fileSt.st_size/32768:(fileSt.st_size/32768)+1);idxBinSrc++) { // Transfer data to ram for(uint16_t idxSrcData=0;idxSrcData<(((blocklSize%pageSize)==0)?(blocklSize/pageSize):(blocklSize/pageSize)+1);idxSrcData++) { //log_info("Buffer start data address: 0x%08X\n", (idxBinSrc*blocklSize)+(idxSrcData*pageSize)); //log_info(" Image start ram address: 0x%08X\n", ((idxSrcData*pageSize) >> 1)); if((idxSrcData+1) != (((blocklSize%pageSize)==0)?(blocklSize/pageSize):(blocklSize/pageSize)+1)) { // Data transfer while(lcdRegisterWrite(_port, REG_TYPE_RAM, bufferRamAddr+((idxSrcData*pageSize)>>1), &buf[(idxBinSrc*blocklSize)+(idxSrcData*pageSize)], pageSize) != PASS) { log_info("Transfer data to ram 0x%04X fail.\n", transferedByte); } transferedByte += pageSize; } else { // Last data transfer while(lcdRegisterWrite(_port, REG_TYPE_RAM, bufferRamAddr+((idxSrcData*pageSize)>>1), &buf[(idxBinSrc*blocklSize)+(idxSrcData*pageSize)], (blocklSize-(idxSrcData*pageSize)))!= PASS) { log_info("Transfer data to ram 0x%04X fail.\n", transferedByte); } transferedByte += (blocklSize-(idxSrcData*pageSize)); } } // Move data from ram to flash uint8_t save_cmd[] ={0x5a, 0x02, ((((targetAddr*8)+idxBinSrc)>>8)&0xff), ((((targetAddr*8)+idxBinSrc)>>0)&0xff), ((bufferRamAddr>>8)&0xff), ((bufferRamAddr>>0)&0xff), 0x00, 0x01, 0x00, 0x00, 0x00, 0x00}; while(lcdRegisterWrite(_port, REG_TYPE_RAM, 0xaa, save_cmd, ARRAY_SIZE(save_cmd)) != PASS) { log_info("Save bin file to 0x%04X fail.\n", ((targetAddr*8)+idxBinSrc)); } //log_info("Save bin file on 0x%04X success.\n", ((targetAddr*8)+idxBinSrc)); sleep(1); } } return result; } uint8_t lcdUpgrade(char *forlder) { int result = _LCM_UPGRADE_RESULT_PASS; DIR *dir; struct dirent *file; struct stat fileSt; log_info("forlder = %s \n", forlder); if ((dir = opendir (forlder)) != NULL) { /* print all the files and directories within directory */ while ((file = readdir (dir)) != NULL) { //log_error("file->d_name = %s \n", file->d_name); if((strlen(file->d_name) > 2) && (file->d_type == DT_REG)) { int targetAddr; stat(file->d_name, &fileSt); if(sscanf(file->d_name, "%d", &targetAddr) == 1) { char targetFile[384]; sprintf(targetFile, "/mnt/lcd/DWIN_SET/%s", file->d_name); log_info("targetFile = %s \n", targetFile); if(strstr(file->d_name, ".bmp") != NULL) { downloadBMP(targetAddr, targetFile); } else { downloadBIN(targetAddr, targetFile); } } else { log_error("%s can not parse target address.\n", file->d_name); } } else { if(strlen(file->d_name) >= 3) { log_error("File name error.\n"); result = _LCM_UPGRADE_RESULT_FAIL; } else { log_error("Searching file.\n"); } } sleep(1); } closedir (dir); } else { log_error("%s does not valid.\n", forlder); result = _LCM_UPGRADE_RESULT_FAIL; } return result; } void UpdateLcmFunction() { if(ShmDcCommonData->_upgrade_lcm_flag) { // 固定路徑 /mnt/lcd/DWIN_SET ShmDcCommonData->_upgrade_lcm_result = lcdUpgrade("/mnt/lcd/DWIN_SET"); ResetLCM(); ShmDcCommonData->_upgrade_lcm_flag = NO; } } int main(void) { //if (InitShareMemory() == FAIL) { // log_error("InitShareMemory NG"); // // if (ShmStatusCodeData != NULL) { // ShmStatusCodeData->AlarmCode.AlarmEvents.bits.FailToCreateShareMemory = 1; // } // sleep(5); // return 0; //} if (CreateAllCsuShareMemory() == FAIL) { log_error("create share memory error"); return FAIL; } MappingGunChargingInfo("LCM Control Task"); pSysConfig = (struct SysConfigData *)GetShmSysConfigData(); pSysInfo = (struct SysInfoData *)GetShmSysInfoData(); pSysWarning = (struct WARNING_CODE_INFO *)GetShmSysWarningInfo(); ShmFanModuleData = (struct FanModuleData *)GetShmFanModuleData();; ShmPrimaryMcuData = (struct PrimaryMcuData *)GetShmPrimaryMcuData(); ShmSelectGunInfo = (SelectGunInfo *)GetShmSelectGunInfo(); struct StatusCodeData *ShmStatusCodeData = (struct StatusCodeData *)GetShmStatusCodeData();; ShmDcCommonData = (DcCommonInfo *)GetShmDcCommonData(); _port = CreateCommunicationLcmPort(); uint8_t changeWarningPriority = 0; uint8_t curWarningCount = 255; ChangeBackLight(true); _totalCount = pSysConfig->TotalConnectorCount; acgunCount = pSysConfig->AcConnectorCount; //Initialization(); //printf("_LCM_COMPLETE "); //ChangeToOtherPage(_LCM_COMPLETE); //return 0; for (uint8_t i = 0; i < 3; i++) { ChangeDisplay2Value(__gun_type_index + (i * 2), _disappear); } DefaultIconStatus(); //DS60-120 add uint8_t _verShowCount = 5; while (_port != -1) { UpdateLcmFunction(); if (strcmp((char *)pSysInfo->LcmHwRev, moduleName) != 0x00) { GetDeviceInfoStatus(__lcm_version, 3); GetCurrentPage(); sleep(1); if (_verShowCount > 0) { //PRINTF_FUNC("LCM Version = V.%03d \n", ShmDcCommonData->LcmFwVersion); _verShowCount--; } #ifndef DD360ComBox ShmStatusCodeData->AlarmCode.AlarmEvents.bits.LcmModuleCommFail = true; #endif } else { //DemoFunction(); #ifndef DD360ComBox ShmStatusCodeData->AlarmCode.AlarmEvents.bits.LcmModuleCommFail = false; #endif // Warning 處理 if (curWarningCount != pSysWarning->WarningCount) { log_info("Print Warming Code %d",curWarningCount); changeWarningPriority = 0; pSysWarning->PageIndex = 0; curWarningCount = pSysWarning->WarningCount; ChangeWarningFunc(); } else if (pSysWarning->WarningCount > 5 && changeWarningPriority == 0) { // 當有兩頁 Warning 則每隔三秒改變一次 if (pSysWarning->PageIndex == 0) { pSysWarning->PageIndex = 1; } else { pSysWarning->PageIndex = 0; } ChangeWarningFunc(); } // 頁面資訊處理 ProcessPageInfo(); // 網路 - wifi - 連線訊號處理 RefreshConnStatus(); // 換頁處理 GetCurrentPage(); //DS60-120 add ChangeCurPage(); RefreshPageAnimation(_everyPageRollChange); #if defined DD360Audi ChangeDisplayMoneyInfo(); #else if (changeWarningPriority == 0) { ////For Audi ChangeDisplayMoneyInfo(); InformationShow(); } #endif //defined DD360Audi changeWarningPriority >= 15 ? (_battery_display_ani = true) : (_battery_display_ani = false); changeWarningPriority >= 30 ? changeWarningPriority = 0 : changeWarningPriority++; usleep(100000); } } #ifndef DD360ComBox ShmStatusCodeData->AlarmCode.AlarmEvents.bits.LcmModuleCommFail = true; #endif log_info("Close LCM Uart Port"); CloseCommunicationLcmPort(); return FAIL; }