|
@@ -44,6 +44,42 @@ GPIO_PinState Get_Pin(int Pin_No)
|
|
|
return Pin_sts;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ ***************************************
|
|
|
+ * mcu的IO口采集的一种连续性滤波式的认可机制
|
|
|
+ * 原理为: 某一代号的管脚的输入电平,连续几次
|
|
|
+ * 检查都是相同值,才认可检查
|
|
|
+ * 输入:pinNo, 管脚代号,范围0-7
|
|
|
+ * 输入:pstatus,存放查询当前的管脚输入值
|
|
|
+ * 返回: 0-不认可,1-认可
|
|
|
+ ***************************************
|
|
|
+ */
|
|
|
+int DoPinIoHitSame(uint8_t pinNo, uint8_t *pstatus)
|
|
|
+{
|
|
|
+ uint8_t status = 0;
|
|
|
+ static struct pin_same {
|
|
|
+ GPIO_PinState status;
|
|
|
+ uint16_t same_count;
|
|
|
+ }pin_cache[8];
|
|
|
+
|
|
|
+
|
|
|
+ if(pinNo > 7) return 0;
|
|
|
+ status = Get_Pin(pinNo);
|
|
|
+ *pstatus = status;
|
|
|
+
|
|
|
+ if(pin_cache[pinNo].status == status) {
|
|
|
+ pin_cache[pinNo].same_count++;
|
|
|
+ if(pin_cache[pinNo].same_count >= cang_inf.pinIOHitSameParam){
|
|
|
+ pin_cache[pinNo].same_count = 0;
|
|
|
+ return 1;
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ pin_cache[pinNo].status = status;
|
|
|
+ pin_cache[pinNo].same_count = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
|
|
|
void DF_State(uint8_t Cang_Num) //查询仓底阀状态
|
|
|
{
|
|
@@ -52,7 +88,8 @@ void DF_State(uint8_t Cang_Num) //
|
|
|
RKG_Inf* prkg = rkg_inf;
|
|
|
HDF_Inf* phdf = hdf_inf;
|
|
|
uint8_t i = 0,j = 0,HDF_MAX = 3,PinNo;
|
|
|
-
|
|
|
+ uint8_t status = 0, hit = 0;
|
|
|
+
|
|
|
if(pcang->HDF_Type == 0) //底阀监测器
|
|
|
{
|
|
|
if(i < HDF_BUF_DEP)
|
|
@@ -66,7 +103,10 @@ void DF_State(uint8_t Cang_Num) //
|
|
|
}
|
|
|
for (j = 0; j < HDF_MAX; ++j)
|
|
|
{
|
|
|
- pxyf[j + 1].XYF_State1 = Get_Pin(PinNo++);
|
|
|
+ hit = DoPinIoHitSame(PinNo++, &status);
|
|
|
+ if(hit){
|
|
|
+ pxyf[j + 1].XYF_State1 = status;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
if (pcang->RKG_Type == 2)
|
|
@@ -77,7 +117,10 @@ void DF_State(uint8_t Cang_Num) //
|
|
|
}
|
|
|
for (j = 0; j < HDF_MAX; ++j)
|
|
|
{
|
|
|
- prkg[1 + j].RKDG_State = Get_Pin(PinNo++);
|
|
|
+ hit = DoPinIoHitSame(PinNo++, &status);
|
|
|
+ if(hit){
|
|
|
+ prkg[1 + j].RKDG_State = status;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
for (j = 0, HDF_MAX = 0; j < pcang->Cang_Num; ++j)
|
|
@@ -86,7 +129,10 @@ void DF_State(uint8_t Cang_Num) //
|
|
|
}
|
|
|
for (j = 0; j < HDF_MAX; ++j)
|
|
|
{
|
|
|
- phdf[1 + j].HDF_OFData[i] = Get_Pin(PinNo++);
|
|
|
+ hit = DoPinIoHitSame(PinNo++, &status);
|
|
|
+ if(hit){
|
|
|
+ phdf[1 + j].HDF_OFData[i] = status;
|
|
|
+ }
|
|
|
}
|
|
|
i++;
|
|
|
}
|