Browse Source

feature:对离床报警功能添加1.5s的判断

weight-flt
Zhangwen 9 months ago
parent
commit
2f48115ba4
  1. 2
      source/app/app_weight.c
  2. 27
      source/app/task_bedalarm.c
  3. 1
      source/app/task_bedalarm.h
  4. 53
      source/app/task_screen.c
  5. 32
      source/app/task_weight_keep.c

2
source/app/app_weight.c

@ -199,7 +199,7 @@ void L3_task_weight_handler(TS_TASK_weight_ *s)
{
s->kgx10_out = 0 ;
}
R.weight.kgx10_out = s->kgx10_out;
R.weight.kgx10_out = s->kgx10_out; //屏幕显示的为串口对外输出的重量数值,受kgx10_zero影响:s->kgx10_out = s->kgx10 - s->kgx10_zero;
// L0_uart1_str("s->kgx10_out ");
// L0_uart1_ushex(s->kgx10_out);
// L0_uart1_0d0a();

27
source/app/task_bedalarm.c

@ -23,6 +23,7 @@ void L3_task_bed_alarm_init(void)
{
L1_task_init(&_s_task_bed_alarm.task);
_s_task_bed_alarm.mode_flag = R.LeaveForbid_flag;
_s_task_bed_alarm.times = 6; //经过测试_s_task_bed_alarm.times = 10时,判断时长为2.5s;_s_task_bed_alarm.times = 6时,判断时长为1.5s
L3_task_s_go(_s_task_bed_alarm,D_task_init);
}
@ -40,14 +41,28 @@ void L3_task_bed_alarm_handler(S_TASK_Bed_ALARM *s)
if(R.LeaveForbid_flag == LeaveForbid_OPEN && R.beep == beep_off)
{
// R.weight.differ = R.Weight_Ref - D_get_weight();
R.weight.differ = R.Weight_Ref - R.weight.kgx10_out; //只用输出值来判断
R.weight.differ = R.Weight_Ref - R.weight.kgx10_out; //串口对外输出的重量值的前后差值来判断
// 检测到体重变化超10kg
if( R.weight.differ > 50) // 50 5kg 100 10kg
if(R.weight.differ > 50) // 50 5kg 100 10kg
{
R.beep = beep_on;
L0_uart1_str("Enter Alarm->");
L0_uart1_str(" After Compare 50, s->times = ");
L0_uart1_uchex(s->times);
L0_uart1_0d0a();
R.beep_startime = D_sys_now;
if(--s->times == 0)
{
R.beep = beep_on;
L0_uart1_str("Enter Alarm->");
L0_uart1_0d0a();
R.beep_startime = D_sys_now;
s->times = 6;
}
L0_uart1_str("After Count 10, s->times = ");
L0_uart1_uchex(s->times);
L0_uart1_0d0a();
}
else
{
s->times = 6;
}
}
//模式开启情况下,蜂鸣器响的时候
@ -99,6 +114,8 @@ void L3_task_bed_alarm_handler(S_TASK_Bed_ALARM *s)
}
_s_task_bed_alarm.mode_flag = R.LeaveForbid_flag;
L2_task_go_Tdelay(D_task_JUDGE, D_Tdelay_200ms);
TTSS_Task_end();
}

1
source/app/task_bedalarm.h

@ -34,6 +34,7 @@ typedef struct _s_task_low_power
{
TS_task task;
U8 mode_flag;
U8 times;
}S_TASK_Bed_ALARM;
extern S_TASK_Bed_ALARM _s_task_bed_alarm;

53
source/app/task_screen.c

@ -123,17 +123,6 @@ SCReturnPkg scrPkgIconYClearPkg = {
0xFC,0xA5, // CRC
};
// // A5 5A 08 82 06 D3 01 00 00 FF 7D 清除报警图标
// SCReturnPkg scrPkgAlarmClearPkg = {
// 0xA5, 0x5A,
// 0x08, //指令字节长度(不含帧头)
// 0x82, //指令
// 0x06, 0xD3, //变量存储地址
// 0x01, //数据字长度
// 0x00,0x00, // 数据内容
// 0xFF,0x7D, // CRC
// };
// A5 5A 08 82 06 D7 01 00 00 FE 4D 切换单位
SCReturnPkg scrPkgUnitSwitchPkg = {
0xA5, 0x5A,
@ -203,7 +192,7 @@ void L3_task_screen_handler(S_TASK_SCREEN *s)
L2_task_go_Tdelay(D_task_RS485_SEND, D_Tdelay_400ms);
//发送
TTSS_Task_step(D_task_RS485_SEND):
if(R.power_mode == POWER_NORMAL)
if(R.power_mode == POWER_NORMAL) //熄屏情况下不发送重量信息
{
//构造pkg
constructor_scr_pkg();
@ -222,12 +211,11 @@ void L3_task_screen_handler(S_TASK_SCREEN *s)
void constructor_scr_pkg()
{
U16 CRC = 0;
U16 weight_kgx100 = 0;
L0_uart1_str("R.weight.kgx10_out: ");
L0_uart1_ushex(R.weight.kgx10_out);
L0_uart1_0d0a();
// L0_uart1_str("R.weight.kgx10_out: ");
// L0_uart1_ushex(R.weight.kgx10_out);
// L0_uart1_0d0a();
weight_kgx100 = R.weight_keep_flag == 0? (R.weight.kgx10_out * 10) : (R.weight_keep_kgx10 * 10);
U16 weight_kgx100 = R.weight_keep_flag == 0? (R.weight.kgx10_out * 10) : (R.weight_keep_kgx10 * 10);
if(R.danwei == KG)
{
@ -240,8 +228,8 @@ void constructor_scr_pkg()
{
// 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] = weight_kgx100 >> 8 & 0xFF;
scrSetValPkg.weight_kgx100[1] = weight_kgx100 >> 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);
@ -271,15 +259,9 @@ void constructor_weightsave_pkg()
void parse_screen_pkg()
{
SCReturnPkg *p = (SCReturnPkg *) ts_Urec[D_UART1].sp;
// p->ocr = p->buf[p->num[0] << 8 | p->num[1]];
L0_uart1_str("ts_Urec[D_UART1].sp = ");
L1_uart1_Array(p, sizeof(*p));
L0_uart1_0d0a();
// L0_uart1_str("sizeof(*p) = ");
// L0_uart1_ushex(sizeof(*p));
// L0_uart1_str("ts_Urec[D_UART1].sp = ");
// L1_uart1_Array(p, sizeof(*p));
// L0_uart1_0d0a();
// L0_uart1_str("sizeof(&p) = ");
// L0_uart1_ushex(sizeof(&p));
if(p->head[0] == 0xA5 && p->head[1] == 0x5A/*count_ocr()*/)
{
@ -309,28 +291,17 @@ void parse_screen_pkg()
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;
// if(R.LeaveForbid_flag != LeaveForbid_OPEN)
// {
// R.LeaveForbid_flag = LeaveForbid_OPEN;
// L0_uart1_str("LeaveForbid_OPEN!!!");
// L0_uart1_0d0a();
// }
// else if(R.LeaveForbid_flag == LeaveForbid_OPEN)
// {
// R.LeaveForbid_flag = LeaveForbid_OFF;
// L0_uart1_str("LeaveForbid_OFF!!!");
// L0_uart1_0d0a();
// }
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(tst_weight.kgx10_out);
screen_save_push(R.weight_keep_kgx10); //总是保存 保持的重量(看到的是多少,保存的就是多少)
}
break;
case 0xD5://校准菜单按钮

32
source/app/task_weight_keep.c

@ -31,15 +31,15 @@ void L3_task_weight_keep_handler(S_TASK_WEIGHT_KEEP *s)
if(R.weight_keep_flag == 1)
{
// LED0 = LED0_OFF;
L0_uart1_str("keep status ");
L0_uart1_0d0a();
// L0_uart1_str("keep status ");
// L0_uart1_0d0a();
//当前处于保持状态
//判定是否打破
//连续1s,100ms检测一次,判断实际重量相比保持重量,超过3kg,取消保持
s->levelJudgeTimes = 10;
//3kg
s->levelWeightThresholdKgx10 = 30;
// s->levelTimesThreshold = 10;
s->levelTimesThreshold = 10;
s->levelTimes = 8;
s->levelTimes = 0;
L2_task_go_Tdelay(D_task_WEIGHT_KEEP_LEAVE_JUDGE, 0);
@ -59,18 +59,18 @@ void L3_task_weight_keep_handler(S_TASK_WEIGHT_KEEP *s)
s->enterMaxWeight = 0;
s->enterMinWeight = R.weight.kgx10_out;
s->enterSumWeight = 0;
L2_task_go_Tdelay(D_task_WEIGHT_KEEP_ENTER_JUDGE, 0);
L2_task_go_Tdelay(D_task_WEIGHT_KEEP_ENTER_JUDGE, 0);
}
TTSS_Task_step(D_task_WEIGHT_KEEP_LEAVE_JUDGE):
weight_keep_kgx10 = R.weight_keep_kgx10;
weight_real_kgx10 = R.weight.kgx10_out;
if(Lc_abs(weight_keep_kgx10, weight_real_kgx10) > s->levelWeightThresholdKgx10)
{
{ //每次触发进入该if的执行语句时,第一次输出的s->levelJudgeTimes是个随机数,且它要先减为0,再从10减为0
s->levelTimes++;
// L0_uart1_str("i get here here!! s->levelJudgeTimes = ");
// L0_uart1_uchex(s->levelJudgeTimes);
// L0_uart1_0d0a();
L0_uart1_str("KEEP_LEAVE_JUDGE CountDown :");
L0_uart1_uchex(s->levelJudgeTimes);
L0_uart1_0d0a();
// L0_uart1_str("s->levelTimes = ");
// L0_uart1_uchex(s->levelTimes);
// L0_uart1_0d0a();
@ -81,14 +81,14 @@ void L3_task_weight_keep_handler(S_TASK_WEIGHT_KEEP *s)
}
else
{
if(s->levelTimes >= s->levelTimesThreshold)
if(s->levelTimes >= s->levelTimesThreshold) //这里的s->levelTimesThreshold 在哪里赋的值???
{
R.weight_keep_flag = 0;
L0_uart1_str("s->levelTimesThreshold = ");
L0_uart1_uchex(s->levelTimesThreshold);
L0_uart1_0d0a();
// L0_uart1_str("s->levelTimesThreshold = ");
// L0_uart1_uchex(s->levelTimesThreshold);
// L0_uart1_0d0a();
}
L2_task_go_Tdelay(D_task_WEIGHT_KEEP_1, 0);
}
@ -106,7 +106,7 @@ void L3_task_weight_keep_handler(S_TASK_WEIGHT_KEEP *s)
}
if(-- s->enterTimes > 0)
{
L0_uart1_str("s->enterTimes = ");
L0_uart1_str("KEEP_ENTER_JUDGE CountDown : ");
L0_uart1_uchex(s->enterTimes);
L0_uart1_0d0a();
L2_task_go_Tdelay(D_task_WEIGHT_KEEP_ENTER_JUDGE, D_Tdelay_100ms);
@ -118,9 +118,9 @@ void L3_task_weight_keep_handler(S_TASK_WEIGHT_KEEP *s)
R.weight_keep_flag = 1;
R.weight_keep_kgx10 = (U16)(s->enterSumWeight / s->enterJudgeTimes);
// L0_uart1_str("i get final !!!!!!!!!!! ");
// L0_uart1_str("R.weight_keep_kgx10: ");
// L0_uart1_ushex(R.weight_keep_kgx10);
L0_uart1_str("I KEEP THIS WEIGHT : ");
L0_uart1_ushex(R.weight_keep_kgx10);
L0_uart1_0d0a();
}
L2_task_go_Tdelay(D_task_WEIGHT_KEEP_1, 0);
}

Loading…
Cancel
Save