#include "task_screen.h" #include "app_config.h" #include "../msp/uart/msp_uart1.h" #include "../msp_uart1.h" #include "debug_drv.h" #include "../msp/msp_eeprom.h" #include "../msp/uart/msp_uart1.h" S_TASK_SCREEN _s_task_screen; // 实时重量 A5 5A 07 82 02 A1 00 C8 0D D2 SCRSetValPkg scrSetValPkg = { 0xA5, 0x5A, //帧头 0x07, //长度 0x82, //指令 0x02, 0xA1, //起始地址 0x00, 0x00, //体重 0x1C, 0x78, //CRC }; // 历史重量 SCRSaveValPkg scrSaveValPkg = { 0xA5, 0x5A, //帧头 0x2D, //长度 0x82, //指令 0x02, 0xB1, //起始地址 0x00, 0x01, //序号1 0x00, 0x01, //历史重量1 0x00, 0x02, //序号2 0x00, 0x02, //历史重量2 0x00, 0x03, //序号3 0x00, 0x03, //历史重量3 0x00, 0x04, //序号4 0x00, 0x00, //历史重量4 0x00, 0x05, //序号5 0x00, 0x00, //历史重量5 0x00, 0x06, //序号6 0x00, 0x00, //历史重量6 0x00, 0x07, //序号7 0x00, 0x00, //历史重量7 0x00, 0x08, //序号8 0x00, 0x00, //历史重量8 0x00, 0x09, //序号9 0x00, 0x00, //历史重量9 0x00, 0x0A, //序号10 0x00, 0x00, //历史重量10 0x97, 0xCE, //CRC }; //息屏指令 SCRControlPkg scrPingOffPkg = { 0xA5, 0x5A, 0x05, //长度 0x80, //指令 0x01, 0x00, //数据 0x71, 0xB8, // CRC }; //亮屏指令 SCRControlPkg scrPingOnPkg = { 0xA5, 0x5A, 0x05, //长度 0x80, //指令 0x01, 0x30, //数据 0x71, 0xAC, // CRC }; //蜂鸣器指令 // A5 5A 05 80 02 32 F0 9D 0.5s // A5 5A 05 80 02 C8 70 DE 2s // A5 5A 05 80 02 FF 31 08 2.55s SCRControlPkg scrBeepOnPkg = { 0xA5, 0x5A, 0x05, //长度 0x80, //指令 0x02, 0x32, //数据 0xF0, 0x9D, // CRC }; // A5 5A 08 82 07 A0 01 00 00 D8 39 清除图标0 SCReturnPkg scrPkgIcon0ClearPkg = { 0xA5, 0x5A, 0x08, //指令字节长度(不含帧头) 0x82, //指令 0x07, 0xA0, //变量存储地址 0x01, //数据字长度 0x00,0x00, // 数据内容 0xD8,0x39, // CRC }; // A5 5A 08 82 07 A1 01 00 00 D9 C5 清除图标1 SCReturnPkg scrPkgIcon1ClearPkg = { 0xA5, 0x5A, 0x08, //指令字节长度(不含帧头) 0x82, //指令 0x07, 0xA1, //变量存储地址 0x01, //数据字长度 0x00,0x00, // 数据内容 0xD9,0xC5, // CRC }; // A5 5A 08 82 07 A2 01 00 00 D9 81 清除图标2 SCReturnPkg scrPkgIcon2ClearPkg = { 0xA5, 0x5A, 0x08, //指令字节长度(不含帧头) 0x82, //指令 0x07, 0xA2, //变量存储地址 0x01, //数据字长度 0x00,0x00, // 数据内容 0xD9,0x81, // CRC }; // A5 5A 08 82 06 D9 01 00 00 FC A5 清除图标确定 SCReturnPkg scrPkgIconYClearPkg = { 0xA5, 0x5A, 0x08, //指令字节长度(不含帧头) 0x82, //指令 0x06, 0xD9, //变量存储地址 0x01, //数据字长度 0x00,0x00, // 数据内容 0xFC,0xA5, // CRC }; // // A5 5A 08 82 06 D3 01 00 00 FF 7D 清除报警图标 // SCReturnPkg scrPkgAlarmClearPkg = { // 0xA5, 0x5A, // 0x08, //指令字节长度(不含帧头) // 0x82, //指令 // 0x06, 0xD3, //变量存储地址 // 0x01, //数据字长度 // 0x00,0x00, // 数据内容 // 0xFF,0x7D, // CRC // }; // A5 5A 08 82 06 D7 01 00 00 FE 4D 切换单位 SCReturnPkg scrPkgUnitSwitchPkg = { 0xA5, 0x5A, 0x08, //指令字节长度(不含帧头) 0x82, //指令 0x06, 0xD7, //变量存储地址 0x01, //数据字长度 0x00,0x00, // 数据内容 0xFE,0x4D, // CRC }; // A5 5A 08 82 06 D6 01 00 00 FF B1 切换中英文 SCReturnPkg scrPkgLanguageSwitchPkg = { 0xA5, 0x5A, 0x08, //指令字节长度(不含帧头) 0x82, //指令 0x06, 0xD6, //变量存储地址 0x01, //数据字长度 0x00,0x00, // 数据内容 0xFF,0xB1, // CRC }; //============================================= void L3_task_screen_init(void) { L1_task_init(&_s_task_screen.task); _s_task_screen.power_mode = R.power_mode; L3_task_s_go(_s_task_screen, D_task_init); } #define D_task_RS485_SEND_BEFORE 0x50 #define D_task_RS485_SEND 0x51 #define D_task_RS485_SEND_AFTER 0x52 #define D_task_RS485_RECV 0x53 void L3_task_screen_handler(S_TASK_SCREEN *s) { // L0_uart1_str("_s_task_screen.task.sh: "); // L0_uart1_uchex(_s_task_screen.task.sh); // L0_uart1_0d0a(); TTSS_Task_init(): L2_task_go(D_task_RS485_SEND_BEFORE); //发送前 TTSS_Task_step(D_task_RS485_SEND_BEFORE): //检测功耗模式 ScreenPingOff_judge(); //检测到模式转变 if(s->power_mode != R.power_mode) { s->power_mode = R.power_mode; if(R.ScrTouch_flag == 0) // if (s->power_mode == POWER_LOW) { //发送熄屏指令 L1_uart1_Array((U8 *)&scrPingOffPkg, sizeof(scrPingOffPkg)); } else if(R.ScrTouch_flag == 1) { //发送亮屏指令 L1_uart1_Array((U8 *)&scrPingOnPkg, sizeof(scrPingOnPkg)); } } if (R.beep == beep_on) { //发送蜂鸣器指令 L1_uart1_Array((U8 *)&scrBeepOnPkg, sizeof(scrBeepOnPkg)); } L2_task_go_Tdelay(D_task_RS485_SEND, D_Tdelay_400ms); //发送 TTSS_Task_step(D_task_RS485_SEND): if(R.power_mode == POWER_NORMAL) { //构造pkg constructor_scr_pkg(); //发送pkg L1_uart1_Array((U8 *)&scrSetValPkg, sizeof(SCRSetValPkg)); } L2_task_go_Tdelay(D_task_RS485_SEND_BEFORE, D_Tdelay_400ms); //发送后 // TTSS_Task_step(D_task_RS485_SEND_AFTER): // L2_task_go_Tdelay(D_task_RS485_SEND, D_Tdelay_100ms); TTSS_Task_end(); } //构造屏幕协议包 void constructor_scr_pkg() { U16 CRC = 0; U16 weight_kgx100 = 0; L0_uart1_str("R.weight.kgx10_out: "); L0_uart1_ushex(R.weight.kgx10_out); L0_uart1_0d0a(); weight_kgx100 = R.weight_keep_flag == 0? (R.weight.kgx10_out * 10) : (R.weight_keep_kgx10 * 10); if(R.danwei == KG) { // scrSetValPkg.weight_kgx100[0] = (R.weight.kgx10_out * 10) >> 8 & 0xFF; // scrSetValPkg.weight_kgx100[1] = (R.weight.kgx10_out * 10) >> 0 & 0xFF; scrSetValPkg.weight_kgx100[0] = weight_kgx100 >> 8 & 0xFF; scrSetValPkg.weight_kgx100[1] = weight_kgx100 >> 0 & 0xFF; } else if(R.danwei == lb) //1kg = 2.20462262磅 { // scrSetValPkg.weight_kgx100[0] = (R.weight.kgx10_out * 22) >> 8 & 0xFF; // scrSetValPkg.weight_kgx100[1] = (R.weight.kgx10_out * 22) >> 0 & 0xFF; scrSetValPkg.weight_kgx100[0] = weight_kgx100 >> 8 & 0xFF; scrSetValPkg.weight_kgx100[1] = weight_kgx100 >> 0 & 0xFF; } CRC = CRC_16(((U8 *)&scrSetValPkg) + 3, 5); scrSetValPkg.crc[1] = CRC; scrSetValPkg.crc[0] = CRC >> 8; } // 构造历史重量数据协议包 void constructor_weightsave_pkg() { U16 CRC = 0; U8 i = 0; for (i = 0; i < SCREEN_SAVE_LEN; i++) { scrSaveValPkg.weight_save[i].save_val[0] = (screen_save_arr[i].kgx100_out ) >> 8; scrSaveValPkg.weight_save[i].save_val[1] = screen_save_arr[i].kgx100_out; } CRC = CRC_16(((U8 *)&scrSaveValPkg) + 3, 43); scrSaveValPkg.crc[1] = CRC; scrSaveValPkg.crc[0] = CRC >> 8; } // 屏幕回传协议解析 A55A 07 83 0000 01 0222 0000 // A55A 08 83 06D2 01 0001 3E90 void parse_screen_pkg() { SCReturnPkg *p = (SCReturnPkg *) ts_Urec[D_UART1].sp; // p->ocr = p->buf[p->num[0] << 8 | p->num[1]]; L0_uart1_str("ts_Urec[D_UART1].sp = "); L1_uart1_Array(p, sizeof(*p)); L0_uart1_0d0a(); // L0_uart1_str("sizeof(*p) = "); // L0_uart1_ushex(sizeof(*p)); // L0_uart1_0d0a(); // L0_uart1_str("sizeof(&p) = "); // L0_uart1_ushex(sizeof(&p)); if(p->head[0] == 0xA5 && p->head[1] == 0x5A/*count_ocr()*/) { if(p->cmd == 0x83) { R.ScrTouch_flag = 1; R.power_mode = POWER_NORMAL; R.ScrTouch_time = D_sys_now; //2024.9.13 15:04:59 // 按钮 if(p->start_addr[0] == 0x06) { switch (p->start_addr[1]) { case 0xD0://菜单 break; case 0xD1://Home if(p->Data[1] == 1) { //返回键值为1时,代表从校准界面返回,清除图标 L1_uart1_Array((U8 *)&scrPkgIcon0ClearPkg, sizeof(scrPkgIcon0ClearPkg)); L1_uart1_Array((U8 *)&scrPkgIcon1ClearPkg, sizeof(scrPkgIcon1ClearPkg)); L1_uart1_Array((U8 *)&scrPkgIcon2ClearPkg, sizeof(scrPkgIcon2ClearPkg)); L1_uart1_Array((U8 *)&scrPkgIconYClearPkg, sizeof(scrPkgIconYClearPkg)); } break; case 0xD2://清零 if(p->Data[1] == 1) { tst_weight.kgx10_zero = tst_weight.kgx10; } break; case 0xD3://离床报警 R.LeaveForbid_flag ^= 1;// R.LeaveForbid_flag = R.LeaveForbid_flag ^ 1; // if(R.LeaveForbid_flag != LeaveForbid_OPEN) // { // R.LeaveForbid_flag = LeaveForbid_OPEN; // L0_uart1_str("LeaveForbid_OPEN!!!"); // L0_uart1_0d0a(); // } // else if(R.LeaveForbid_flag == LeaveForbid_OPEN) // { // R.LeaveForbid_flag = LeaveForbid_OFF; // L0_uart1_str("LeaveForbid_OFF!!!"); // L0_uart1_0d0a(); // } break; case 0xD4://保存 if(p->Data[1] == 1) { // screen_save_push(tst_weight.kgx10); screen_save_push(tst_weight.kgx10_out); } break; case 0xD5://校准菜单按钮 // scrSetValPkg.buf.ui[1] = p->Data[1]; break; case 0xD6://语言切换 R.Language = (R.Language == Chinese)? English : Chinese; if( R.Language == Chinese ) { // 切换回Chinese图标 L1_uart1_Array((U8 *)&scrPkgLanguageSwitchPkg, sizeof(scrPkgLanguageSwitchPkg)); } break; case 0xD7://重量单位切换 R.danwei = (R.danwei == KG)? lb : KG; if( R.danwei == KG ) { // 切换回KG单位图标 L1_uart1_Array((U8 *)&scrPkgUnitSwitchPkg, sizeof(scrPkgUnitSwitchPkg)); } break; case 0xD8://查看历史数据 // 1.从eeprom中读出数组 L0_Iap_Read_array(EEPROM_WEIGHT_ADDR, screen_save_arr,sizeof(screen_save_arr)); // 2.判断头尾 if(screen_save_arr[0].head[0] != HEAD0 || screen_save_arr[0].head[1] != HEAD1 || screen_save_arr[0].tail[0] != TAIL0 || screen_save_arr[0].tail[1] != TAIL1) { screen_save_init(); } // 3.推送到屏幕 // 构造pkg constructor_weightsave_pkg(); // 发送pkg L1_uart1_Array((U8 *)&scrSaveValPkg, sizeof(scrSaveValPkg)); break; case 0xD9://校准确认 // ts_weight_SPara.ts_WPoint[pd485->buf[0]].kg = D_2uc_u16(pd485->buf[1],pd485->buf[2]); ts_weight_SPara.ts_WPoint[R.calib_index].kg = R.calib_kg_x100 / 10; ts_weight_SPara.ts_WPoint[R.calib_index].adc = tst_weight.adc32;//使用当前采样值 L4_WPoint_out(); // 写入IAP L3_R_2_S(); L0_Iap_Program_array(D_EEP_BASE,D_struct2U8(S),D_S_LEN); break; default: break; } } // 数据录入(确认键) else if(p->start_addr[0] == 0x07) { switch (p->start_addr[1]) { case 0xA0://校准点 R.calib_index = 0; L0_uart1_str("R.calib_index ="); L0_uart1_uchex(R.calib_index); L0_uart1_0d0a(); break; case 0xA1://校准点 R.calib_index = 1; L0_uart1_str("R.calib_index ="); L0_uart1_uchex(R.calib_index); L0_uart1_0d0a(); break; case 0xA2://校准点 R.calib_index = 2; L0_uart1_str("R.calib_index ="); L0_uart1_uchex(R.calib_index); L0_uart1_0d0a(); break; case 0xA3://校准体重 R.calib_kg_x100 = (U16)p->Data[0] << 8 | p->Data[1]; L0_uart1_str("R.calib_kg_x100 = "); L0_uart1_ushex(R.calib_kg_x100); L0_uart1_0d0a(); break; default: break; } } } // 亮屏时回传A5 5A 06 81 01 01 40 79 B8 // 给屏幕发送熄屏指令时,回传 A5 5A 06 81 01 01 00 78 48 if(p->cmd == 0x81 && p->num_word == 0x40 ) { R.ScrTouch_flag = 1; R.power_mode = POWER_NORMAL; R.ScrTouch_time = D_sys_now; } } } //CRC校验 查表法 U16 CRC_16(U8 *pMsg, U16 Len) { U8 i; U16 j; U8 uchCRCHi = 0xFF; U8 uchCRCLo = 0xFF; while (Len--) { i = uchCRCHi ^ (*pMsg++); uchCRCHi = uchCRCLo ^ auchCRCHi[i]; uchCRCLo = auchCRCLo[i]; } j = (U16)uchCRCHi << 8 | uchCRCLo; return j; } // 180s无操作 判定函数 void ScreenPingOff_judge() { U32 Nowtime = D_sys_now; if( Nowtime - R.ScrTouch_time > D_COUNT_JIFFIES(180000)) //180000 180秒 30000 30秒 60000 60秒 { R.ScrTouch_flag = 0; R.power_mode = POWER_LOW; } }