#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; // 实时重量 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 C8 70 DE SCRControlPkg scrBeepOnPkg = { 0xA5, 0x5A, 0x05, //长度 0x80, //指令 0x02, 0xC8, //数据 0x70, 0xDE, // 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(); // L0_uart1_str("R.power_mode: "); // L0_uart1_uchex(R.power_mode); // L0_uart1_0d0a(); // L0_uart1_str("s->power_mode : "); // L0_uart1_uchex(s->power_mode ); // L0_uart1_0d0a(); //检测到模式转变 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; // L0_uart1_str("R.weight.kgx10_out: "); // L0_uart1_us(R.weight.kgx10_out); // L0_uart1_0d0a(); 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; } 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; } // L0_uart1_str("scrSetValPkg.buf.dl: "); // L0_uart1_us(R.dl); // L0_uart1_0d0a(); // scrSetValPkg.buf.dl[0] = R.dl >> 8 & 0xFF; // scrSetValPkg.buf.dl[1] = R.dl >> 0 & 0xFF; // scrSetValPkg.buf.net_status[0] = R.net_status >> 8 & 0xFF; // scrSetValPkg.buf.net_status[1] = R.net_status >> 0 & 0xFF; // // scrSetValPkg.buf.danwei[0] = R.danwei >> 8 & 0xFF; // scrSetValPkg.buf.danwei[1] = R.danwei >> 0 & 0xFF; // scrSetValPkg.buf.beep[0] = R.beep >> 8 & 0xFF; // scrSetValPkg.buf.beep[1] = R.beep >> 0 & 0xFF; // scrSetValPkg.buf.LeaveForbid_flag[0] = R.LeaveForbid_flag >> 8 & 0xFF; // scrSetValPkg.buf.LeaveForbid_flag[1] = R.LeaveForbid_flag >> 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; } // 屏幕回传协议解析 A5 5A 07 83 00 01 02 22 00 00 void parse_screen_pkg() { SCReturnPkg *p = (SCReturnPkg *) ts_Urec[D_UART1].sp; // p->ocr = p->buf[p->num[0] << 8 | p->num[1]]; L1_uart1_Array((U8 *)&p, 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 break; case 0xD2://清零 tst_weight.kgx10_zero = tst_weight.kgx10; break; case 0xD3://离床报警 R.LeaveForbid_flag = LeaveForbid_OPEN;//按键按下时,就置标志位R.LeaveForbid_flag == LeaveForbid_OPEN和获取参考点位的重量。 R.Weight_Ref = tst_weight.kgx10; // 参考重量 weight_ref = 当前重量 L0_uart1_str("LeaveForbid_OPEN!!!"); L0_uart1_0d0a(); break; case 0xD4://保存 screen_save_push(tst_weight.kgx10);// register1 = tst_weight.kgx10; break; case 0xD5://校准菜单按钮 // scrSetValPkg.buf.ui[1] = p->Data[1]; break; case 0xD6://语言切换 // scrSetValPkg.buf.language[1] = p->Data[1]; break; case 0xD7://重量单位切换 R.danwei = p->Data[1]; 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://校准确认 buf[index] 放入寄存器,写入eeprom // ts_weight_SPara.ts_WPoint[pd485->buf[0]].kg = D_2uc_u16(pd485->buf[1],pd485->buf[2]); ts_weight_SPara.ts_WPoint[pd485->buf[R.calib_index]].kg = R.calib_kg; ts_weight_SPara.ts_WPoint[pd485->buf[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 0xA1://校准点 R.calib_index = p->Data[1]; break; case 0xA2://校准体重 R.calib_kg = p->Data[0] << 8 & p->Data[1]; break; default: break; } } } // 亮屏时回传A5 5A 06 81 01 01 40 79 B8 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(30000)) //180000 180秒 { R.ScrTouch_flag = 0; R.power_mode = POWER_LOW; } }