Browse Source

feature:1.实现称重校准功能 2.完善离床报警功能

weight-flt
Zhangwen 9 months ago
parent
commit
910989d9ea
  1. 3
      source/app/app_config.c
  2. 2
      source/app/app_config.h
  3. 9
      source/app/app_screen_save.c
  4. 2
      source/app/app_weight.c
  5. 16
      source/app/main.c
  6. 36
      source/app/task_bedalarm.c
  7. 84
      source/app/task_screen.c
  8. 7
      source/app/task_screen.h

3
source/app/app_config.c

@ -53,6 +53,9 @@ void L3_reg_reset(void)
//离床报警参考重量值
R.Weight_Ref = 0;
//校准体重
R.calib_kg_x100 = 0;
}

2
source/app/app_config.h

@ -199,7 +199,7 @@ typedef struct global_register
U16 sensor_adc[4];
U16 kgx10_out;
U16 adc16;
U16 differ;
S16 differ;
} weight;
//电量

9
source/app/app_screen_save.c

@ -1,7 +1,7 @@
#include "app_screen_save.h"
#include "../msp/msp_eeprom.h"
#include "../msp/uart/msp_uart1.h"
#include "../app/app_config.h"
#include "app_config.h"
SCREEN_SAVE screen_save_arr[SCREEN_SAVE_LEN] = {0};
@ -35,7 +35,7 @@ void screen_save_push(U16 weight)
// 遍历寻找空位
for(i = 0;i < SCREEN_SAVE_LEN; i++)
{
if(screen_save_arr[i].available != 0)
if(screen_save_arr[i].available == 1)
{
free = i;
break;
@ -53,10 +53,7 @@ void screen_save_push(U16 weight)
// 放到free位置
screen_save_arr[free].available = 0;
screen_save_arr[free].kgx100_out = weight;
// 把数组放回(写入)eeprom中
L0_Iap_Program_array(EEPROM_WEIGHT_ADDR, screen_save_arr,sizeof(screen_save_arr));
// L0_uart1_str("L0_Iap_Program_array OK!!!!! ");
// L0_uart1_0d0a();
// L0_uart1_us(weight);
// L0_uart1_0d0a();
}

2
source/app/app_weight.c

@ -174,7 +174,7 @@ void L3_task_weight_handler(TS_TASK_weight_ *s)
//L2_task_go(D_task_WEIGHT_getADC);
TTSS_Task_step(D_task_WEIGHT_getADC):
////四个传感器相加后平均
tst_weight.sum32 = ts_adc_samples[0].out5;
tst_weight.sum32 += ts_adc_samples[1].out5;

16
source/app/main.c

@ -71,6 +71,16 @@ void L0_main_initled(void)
void L0_main_init(void)
{
// A5 5A 05 80 02 32 F0 9D 0.5s
// A5 5A 05 80 02 14 71 47 0.2s
SCRControlPkg scrBeepPowOnPkg = {
0xA5, 0x5A,
0x05, //长度
0x80, //指令
0x02, 0x14, //数据
0x71, 0x47, // CRC
};
int r = 0;
Lc_delay_ms(200);
L0_main_initled();
@ -85,8 +95,12 @@ void L0_main_init(void)
printf1("\r\nD_sys_MainFre %ld",D_sys_MainFre);
//上电时控制蜂鸣器响一声
L1_uart1_Array((U8 *)&scrBeepPowOnPkg, sizeof(scrBeepPowOnPkg));
r = L3_S_init();
printf1("\r\nL3_S_init %d",r);
}
//===============================================
@ -113,7 +127,7 @@ void main(void)
{
s_nos_tick.t1s_heartbeat = 0;
// L1_uartD_uc('.');
// D_LED1_REV();
D_LED1_REV();
}
if((tpc_flag = L2_debug_ONcomand()))

36
source/app/task_bedalarm.c

@ -41,21 +41,20 @@ void L3_task_bed_alarm_handler(S_TASK_Bed_ALARM *s)
//判定是否触发报警
TTSS_Task_step(D_task_ALARM_JUDGE):
R.weight.differ = R.Weight_Ref - R.weight.kgx10_out;
//放在该task的第二步
if(R.LeaveForbid_flag == LeaveForbid_OPEN)
{ //触发报警 //取绝对值abs();
if( abs(R.weight.differ) > 50 ) //&& R.beep != beep_on R.weight.differ
if( R.weight.differ > 50 ) //&& R.beep != beep_on R.weight.differ
{
L0_uart1_str("R.weight.differ:");
L0_uart1_ushex(abs(R.weight.differ));
L0_uart1_ushex(R.weight.differ);
L0_uart1_0d0a();
L0_uart1_str("R.Weight_Ref:");
L0_uart1_ushex(R.Weight_Ref);
L0_uart1_0d0a();
R.beep = beep_on;
D_LED1_ON();
L0_uart1_str("Enter1->");
// D_LED1_ON();
L0_uart1_str("Enter Alarm->");
L0_uart1_0d0a();
R.beep_startime = D_sys_now;
@ -68,26 +67,27 @@ void L3_task_bed_alarm_handler(S_TASK_Bed_ALARM *s)
//判定是否解除报警
TTSS_Task_step(D_task_ALARM_DELETE):
L0_uart1_str("Jump1Jump1Jump1->");
L0_uart1_0d0a();
//手动解除
// if(R.ForbidDelate_flag == 1)
// {
// R.beep = beep_on;
// R.beep_startime = 0;
// R.LeaveForbid_flag = LeaveForbid_OFF; 应在解除按键按下时,操作beep还和置位R.LeaveForbid_flag = LeaveForbid_OFF
// }
//超时解除 //放在该task的第一步
if(D_sys_now - R.beep_startime > D_COUNT_JIFFIES(5000)) //5000 5秒 30000 30秒
//超时解除
if(D_sys_now - R.beep_startime > D_COUNT_JIFFIES(30000)) //5000 5秒 30000 30秒
{
R.beep = beep_off;
L0_uart1_str("Jump1->");
L0_uart1_str("Overtime!! Jump Alarm ->");
L0_uart1_0d0a();
D_LED1_OFF();
// D_LED1_OFF();
R.beep_startime = 0;
R.LeaveForbid_flag = LeaveForbid_OFF;
L2_task_go_Tdelay(D_task_ALARM_JUDGE, D_Tdelay_200ms);
}
else if(R.LeaveForbid_flag == LeaveForbid_OFF)
{
R.beep = beep_off;
L0_uart1_str("Manually dismiss!! Jump Alarm->");
L0_uart1_0d0a();
// D_LED1_OFF();
R.beep_startime = 0;
// R.LeaveForbid_flag = LeaveForbid_OFF;
L2_task_go_Tdelay(D_task_ALARM_JUDGE, D_Tdelay_200ms);
}
else
L2_task_go_Tdelay(D_task_ALARM_DELETE, D_Tdelay_200ms);
TTSS_Task_end();

84
source/app/task_screen.c

@ -67,7 +67,10 @@ SCRControlPkg scrPingOnPkg = {
0x71, 0xAC, // CRC
};
//蜂鸣器指令A5 5A 05 80 02 C8 70 DE
//蜂鸣器指令
// 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, //长度
@ -100,12 +103,6 @@ void L3_task_screen_handler(S_TASK_SCREEN *s)
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)
@ -140,7 +137,7 @@ void L3_task_screen_handler(S_TASK_SCREEN *s)
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);
// L2_task_go_Tdelay(D_task_RS485_SEND, D_Tdelay_100ms);
TTSS_Task_end();
}
@ -165,27 +162,28 @@ void constructor_scr_pkg()
// 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.dl[0] = R.dl >> 8 & 0xFF;
// scrSetValPkg.buf.dl[1] = R.dl >> 0 & 0xFF;
// scrSetValPkg.buf.beep[0] = R.beep >> 8 & 0xFF;
// scrSetValPkg.buf.beep[1] = R.beep >> 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.LeaveForbid_flag[0] = R.LeaveForbid_flag >> 8 & 0xFF;
// scrSetValPkg.buf.LeaveForbid_flag[1] = R.LeaveForbid_flag >> 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;
@ -202,7 +200,7 @@ void constructor_weightsave_pkg()
scrSaveValPkg.crc[0] = CRC >> 8;
}
// 屏幕回传协议解析 A5 5A 07 83 00 01 02 22 00 00
// 屏幕回传协议解析 A55A 07 83 0001 0222 0000
void parse_screen_pkg()
{
SCReturnPkg *p = (SCReturnPkg *) ts_Urec[D_UART1].sp;
@ -228,10 +226,17 @@ void parse_screen_pkg()
tst_weight.kgx10_zero = tst_weight.kgx10;
break;
case 0xD3://离床报警
if(R.LeaveForbid_flag != LeaveForbid_OPEN)
{
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();
L0_uart1_0d0a();
}
else if (R.LeaveForbid_flag == LeaveForbid_OPEN)
{
R.LeaveForbid_flag = LeaveForbid_OFF;
}
break;
case 0xD4://保存
screen_save_push(tst_weight.kgx10);// register1 = tst_weight.kgx10;
@ -243,7 +248,7 @@ void parse_screen_pkg()
// scrSetValPkg.buf.language[1] = p->Data[1];
break;
case 0xD7://重量单位切换
R.danwei = p->Data[1];
R.danwei = (R.danwei == KG)? lb : KG;
break;
case 0xD8://查看历史数据
// 1.从eeprom中读出数组
@ -260,12 +265,12 @@ void parse_screen_pkg()
// 发送pkg
L1_uart1_Array((U8 *)&scrSaveValPkg, sizeof(scrSaveValPkg));
break;
case 0xD9://校准确认 buf[index] 放入寄存器,写入eeprom
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 / 100;
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
// 写入IAP
L3_R_2_S();
L0_Iap_Program_array(D_EEP_BASE,D_struct2U8(S),D_S_LEN);
break;
@ -278,11 +283,29 @@ void parse_screen_pkg()
{
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 = p->Data[1];
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 0xA2://校准体重
R.calib_kg_x100 = (U16)p->Data[0] << 8 & p->Data[1];
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;
@ -290,6 +313,7 @@ void parse_screen_pkg()
}
}
// 亮屏时回传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;
@ -320,7 +344,7 @@ U16 CRC_16(U8 *pMsg, U16 Len)
void ScreenPingOff_judge()
{
U32 Nowtime = D_sys_now;
if( Nowtime - R.ScrTouch_time > D_COUNT_JIFFIES(30000)) //180000 180秒
if( Nowtime - R.ScrTouch_time > D_COUNT_JIFFIES(30000)) //180000 180秒 30000 30秒
{
R.ScrTouch_flag = 0;
R.power_mode = POWER_LOW;

7
source/app/task_screen.h

@ -72,6 +72,10 @@ typedef struct
// } SCRSetValPkg;
// A5 5A 08 83 00 00 01 02 22 00 00
//A5 5A 08 83 06 D6 01 00 00 FE 60
// A5 5A 08 83 07 A3 01 05 DC DB 65
// A5 5A 08 83 07 A1 01 00 00 D8 14
// A5 5A 08 83 07 A2 01 00 00 D8 50
// A5 5A 06 81 01 01 40 79 B8
typedef struct
{
@ -93,6 +97,9 @@ typedef struct
U8 crc[2];
} SCRControlPkg;
// A5 5A 05 80 02 32 F0 9D 0.5s
extern SCRControlPkg scrBeepPowOnPkg;
// typedef struct _tpc_screen_
// {
// U8 head[2];

Loading…
Cancel
Save