Quellcode durchsuchen

add:ioqueue返回停止序列时,已经执行了的序列数量 https://gitee.com/openLuat/LuatOS/issues/I5G2P6?from=project-issue

alienwalker vor 4 Jahren
Ursprung
Commit
8036179cc1

+ 2 - 1
application/src/luat_io_queue_air105.c

@@ -64,10 +64,11 @@ void luat_io_queue_start(uint8_t hw_timer_id)
 	HWTimer_StartOperationQueue(hw_timer_id);
 }
 
-void luat_io_queue_stop(uint8_t hw_timer_id)
+void luat_io_queue_stop(uint8_t hw_timer_id, uint32_t *repeat_cnt, uint32_t *cmd_cnt)
 {
 	if (hw_timer_id >= HW_TIMER_MAX) return;
 	HWTimer_Stop(hw_timer_id);
+	HWTimer_GetResultOperationInfo(hw_timer_id, repeat_cnt, cmd_cnt);
 }
 
 

+ 12 - 0
bsp/air105/hal/core_hwtimer.c

@@ -32,6 +32,8 @@ typedef struct
 	uint32_t CurCount;
 	uint32_t RepeatCnt;
 	uint32_t CmdQueuePos;
+	uint32_t LastRepeatCnt;
+	uint32_t LastCount;
 	uint8_t IsQueueRunning;
 	uint8_t ContinueDelay;
 }HWTimer_CtrlStruct;
@@ -119,6 +121,8 @@ static int __FUNC_IN_RAM__ prvHWTimer_OperationEnd(uint8_t HWTimerID, HWTimer_Ct
 	HWTimer->RepeatCnt++;
 	if (HWTimer->TotalRepeat && (HWTimer->RepeatCnt >= HWTimer->TotalRepeat))
 	{
+		prvHWTimer[HWTimerID].LastCount = prvHWTimer[HWTimerID].CurCount;
+		prvHWTimer[HWTimerID].LastRepeatCnt = prvHWTimer[HWTimerID].RepeatCnt;
 		TIMM0->TIM[HWTimerID].ControlReg = 0;
 		TIMM0->TIM[HWTimerID].LoadCount = 24;
 
@@ -590,6 +594,14 @@ void HWTimer_Stop(uint8_t HWTimerID)
 	prvHWTimer[HWTimerID].IsQueueRunning = 0;
 	prvHWTimer[HWTimerID].ContinueDelay = 0;
 	PM_SetHardwareRunFlag(PM_HW_TIMER_0 + HWTimerID, 0);
+	prvHWTimer[HWTimerID].LastCount = prvHWTimer[HWTimerID].CurCount;
+	prvHWTimer[HWTimerID].LastRepeatCnt = prvHWTimer[HWTimerID].RepeatCnt;
+}
+
+void HWTimer_GetResultOperationInfo(uint8_t HWTimerID, uint32_t *Repeat, uint32_t *Count)
+{
+	*Repeat = prvHWTimer[HWTimerID].LastRepeatCnt;
+	*Count = prvHWTimer[HWTimerID].LastCount;
 }
 
 void HWTimer_InitOperationQueue(uint8_t HWTimerID, uint32_t nCount, uint32_t Repeat, CBFuncEx_t CmdDoneCB, void *pCmdDoneParam)

+ 8 - 0
bsp/air105/include/core_hwtimer.h

@@ -49,6 +49,14 @@ void HWTimer_StartPWM(uint8_t HWTimerID, uint32_t HighCnt, uint32_t LowCnt, uint
  * @param HWTimerID 硬件定时器ID
  */
 void HWTimer_Stop(uint8_t HWTimerID);
+/**
+ * @brief 获取上次被停止的IOqueue的信息
+ *
+ * @param HWTimerID 硬件定时器ID
+ * @param Repeat 已经重复次数
+ * @param Count 一次循环中已经操作步骤,可能为0
+ */
+void HWTimer_GetResultOperationInfo(uint8_t HWTimerID, uint32_t *Repeat, uint32_t *Count);
 /**
  * @brief 初始化IO操作序列,会完全清除之前保留的操作序列
  *

+ 0 - 12
bsp/air105/include/core_i2c.h

@@ -61,18 +61,6 @@ void I2C_Prepare(uint8_t I2CID, uint16_t ChipAddress, uint8_t ChipAddressLen, CB
  */
 void I2C_MasterXfer(uint8_t I2CID, uint8_t Operate, uint8_t *RegAddress, uint32_t RegLen, uint8_t *Data, uint32_t Len, uint16_t Toms);
 
-/**
- * @brief i2c主机传输,多个单一寄存器写入
- *
- * @param I2CID I2C通道号
- * @param RegQueue 寄存器序列
- * @param TotalNum 序列长度
- * @param Toms 传输单个字节超时时间,单位ms
- * @param IsBlock 是否要阻塞
- * @return =0 传输成功,其他失败 IsBlock=1才有效,IsBlock=0直接返回0
- */
-int32_t I2C_MasterWriteRegQueue(uint8_t I2CID, I2C_CommonRegDataStruct *RegQueue, uint32_t TotalNum, uint16_t Toms, uint8_t IsBlock);
-
 /**
  * @brief i2c主机传输结果查询
  *