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.

425 lines
11 KiB

#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 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;
// L0_uart1_str("R.weight.kgx10_out: ");
// L0_uart1_ushex(R.weight.kgx10_out);
// L0_uart1_0d0a();
U16 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] = (U16)(weight_kgx100 * 2.2) >> 8 & 0xFF;
scrSetValPkg.weight_kgx100[1] = (U16)(weight_kgx100 * 2.2) >> 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;
// L0_uart1_str("ts_Urec[D_UART1].sp = ");
// L1_uart1_Array(p, sizeof(*p));
// L0_uart1_0d0a();
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;
R.weight_keep_kgx10 = 0 ;
}
break;
case 0xD3://离床报警
R.LeaveForbid_flag ^= 1;// R.LeaveForbid_flag = R.LeaveForbid_flag ^ 1;
break;
case 0xD4://保存
if(p->Data[1] == 1)
{
// screen_save_push(tst_weight.kgx10);
screen_save_push(R.weight_keep_kgx10);//总是保存 保持的重量(看到的是多少,保存的就是多少)
}
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;
}
}