You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

247 lines
6.2 KiB

#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;
}
}