#include "task_screen.h" #include "../app/app_config.h" #include "../msp/uart/msp_uart1.h" #include "msp_uart1.h" #include "debug_drv.h" #include "../msp/msp_eeprom.h" #include "app_screen_save.h" S_TASK_SCREEN _s_task_screen; SCRSetValPkg scrSetValPkg = { 0xA5, 0x5A, //帧头 0x1C, //长度 0x82, //指令 0x01, 0x1E, //起始地址 0x00, 0x00, //体重 0x00, 0x00, //电量 0x00, 0x00, //网络状态 0x00, 0x00, //单位标志 0x00, 0x00, //语言标志 0x00, 0x00, //蜂鸣器状态 0x00, 0x00, // 0x00, 0x00, //离床报警标志 0x00, 0x00, // 0x1C, 0x78, //CRC }; //息屏指令 SCRControlPkg scrPingOffPkg = { 0xA5, 0x5A, 0x05, //长度 0x80, //指令 0x01, 0x00, //数据 0x71, 0xB8, // CRC }; //亮屏指令 SCRControlPkg scrPingOnPkg = { 0xA5, 0x5A, 0x05, //长度 0x80, //指令 0x01, 0x30, //数据 0x71, 0xAC, // 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_SCREEN_SEND_CONTROL 0x50 // #define D_TASK_SCREEN_SEND_VAL 0x51 // #define D_task_RFID_SET 0x52 #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(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)); } 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.buf.weight_kgx100[0] = (R.weight.kgx10_out * 10) >> 8 & 0xFF; scrSetValPkg.buf.weight_kgx100[1] = (R.weight.kgx10_out * 10) >> 0 & 0xFF; } else if(R.danwei == lb) //1kg = 2.20462262磅 { scrSetValPkg.buf.weight_kgx100[0] = (R.weight.kgx10_out * 22) >> 8 & 0xFF; scrSetValPkg.buf.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, 21); scrSetValPkg.crc[1] = CRC; scrSetValPkg.crc[0] = CRC >> 8; } // 屏幕回传协议解析 void parse_screen_pkg() { SCReturnPkg *p = (SCReturnPkg *) ts_Urec[D_UART1].reg; // p->ocr = p->buf[p->num[0] << 8 | p->num[1]]; if(p->head[0] == 0xA5 && p->head[1] == 0x5A/*count_ocr() */) { if(p->cmd == 0x83) { R.ScrTouch_flag = 1; 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 = 当前重量 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://查看历史数据 L0_Iap_Read_array(EEPROM_WEIGHT_ADDR, screen_save_arr,sizeof(screen_save_arr));//1先从eeprom中读出数组 // 2推送到屏幕 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[pd485->buf[0]].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; } } // 数据录入(确认键) if(p->start_addr[0] == 0x07) { switch (p->start_addr[1]) { case 0xA1://校准点 // register2 = p->data[1]; break; case 0xA2://校准体重 // register3 = p->data[1]; break; default: break; } } } } } //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(void) { U32 Ntime = D_sys_now; if( Ntime - R.ScrTouch_time > D_COUNT_JIFFIES(180000)) { R.ScrTouch_flag = 0; R.power_mode = POWER_LOW; } }