hal_ser_imu_mode_manage.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  1. /*Includes ----------------------------------------------*/
  2. #include "system.h"
  3. #include "exception.h"
  4. #include "bsp_time.h"
  5. #include "hal_ser_imu.h"
  6. #include "hal_ser_imu_mode_manage.h"
  7. /*Private macro ------------------------------------------------------------------------------------------------------------------------------------*/
  8. /*STRUCTION ------------------------------------------------------------------------------------------------------------------------------------*/
  9. typedef struct ser_imu_mode_manage
  10. {
  11. /*private member*/
  12. bool is_imu_id_unusual; //imu的ID是否异常
  13. bool is_imu_damage; //IMU是否损坏
  14. HAL_SER_IMU_MODE_MANAGE_e last_enter_mode; //上次成功进入的模式
  15. int mode_switch[HAL_SER_IMU_MODE_MANAGE_NUM]; //模式开关
  16. int ser_imu_handle_id[HAL_SER_IMU_MODE_MANAGE_NUM]; //模式的IMU服务句柄ID
  17. ser_imu_config_param_t ser_imu_param[HAL_SER_IMU_MODE_MANAGE_NUM][SER_IMU_DIR_NUM]; //模式的IMU配置参数
  18. ser_imu_data_t ser_imu_data[HAL_SER_IMU_MODE_MANAGE_NUM][SER_IMU_DIR_NUM]; //模式的IMU服务数据
  19. } Ser_Imu_Mode_Manage_t;
  20. /*Local Variable ------------------------------------------------------------------------------------------------------------------------------------*/
  21. static Ser_Imu_Mode_Manage_t ob_ser_imu_mode_manage; //模式管理服务对象
  22. static ser_imu_config_param_t imu_power_off_param; //关机配置参数
  23. /*Local Functions ------------------------------------------------------------------------------------------------------------------------------------*/
  24. static void hal_ser_imu_mode_manage_imu_power_off_init(ser_imu_config_param_t *p_param)
  25. {
  26. p_param->acc_power_mode = SER_IMU_ACC_POWER_MODE_NORMAL; //前脚 - 加速度正常模式
  27. p_param->gry_power_mode = SER_IMU_GRY_POWER_MODE_NORMAL; //前脚 - 陀螺仪正常模式
  28. p_param->timestamp_resolution = SER_IMU_TIMESTAMP_25US; //前脚 - 时间戳25US精度
  29. p_param->timestamp_switch = SER_IMU_TIMESTAMP_OFF; //前脚 - 时间戳关闭
  30. p_param->acc_fs = SER_IMU_ACC_FS_16G; //前脚 - 加速度量程 - 16G
  31. p_param->gry_fs = SER_IMU_GRY_FS_2000DPS; //前脚 - 陀螺仪量程 - 2000DPS
  32. p_param->mag_fs = SER_IMU_MAG_FS_30GS; //前脚 - 地磁计量程 - 30GS
  33. p_param->acc_odr = SER_IMU_ACC_ODR_OFF; //后脚 - 加速度采样频率 - 关闭
  34. p_param->gry_odr = SER_IMU_GRY_ODR_OFF; //前脚 - 陀螺仪采样频率 - 关闭
  35. p_param->mag_odr = SER_IMU_MAG_ODR_OFF; //前脚 - 地磁计采样频率 - 关闭
  36. p_param->fifo_odr = SER_IMU_FIFO_ODR_OFF; //前脚 - FIFO采样频率 - 关闭
  37. }
  38. static void hal_ser_imu_mode_manage_imu_standby_power_init(HAL_SER_IMU_MODE_MANAGE_e mode)
  39. {
  40. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_FRONT].acc_power_mode = SER_IMU_ACC_POWER_MODE_NORMAL; //前脚 - 加速度正常模式
  41. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_FRONT].gry_power_mode = SER_IMU_GRY_POWER_MODE_NORMAL; //前脚 - 陀螺仪正常模式
  42. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_FRONT].timestamp_resolution = SER_IMU_TIMESTAMP_25US; //前脚 - 时间戳25US精度
  43. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_FRONT].timestamp_switch = SER_IMU_TIMESTAMP_OFF; //前脚 - 时间戳关闭
  44. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_FRONT].acc_fs = SER_IMU_ACC_FS_16G; //前脚 - 加速度量程 - 16G
  45. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_FRONT].gry_fs = SER_IMU_GRY_FS_2000DPS; //前脚 - 陀螺仪量程 - 2000DPS
  46. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_FRONT].mag_fs = SER_IMU_MAG_FS_30GS; //前脚 - 地磁计量程 - 30GS
  47. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_FRONT].acc_odr = SER_IMU_ACC_ODR_12HZ5; //前脚 - 加速度采样频率 - 12.5HZ
  48. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_FRONT].gry_odr = SER_IMU_GRY_ODR_OFF; //前脚 - 陀螺仪采样频率 - 关闭
  49. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_FRONT].mag_odr = SER_IMU_MAG_ODR_OFF; //前脚 - 地磁计采样频率 - 关闭
  50. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_FRONT].fifo_odr = SER_IMU_FIFO_ODR_OFF; //前脚 - FIFO采样频率 - 关闭
  51. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_BACK].acc_power_mode = SER_IMU_ACC_POWER_MODE_NORMAL; //后脚 - 加速度正常模式
  52. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_BACK].gry_power_mode = SER_IMU_GRY_POWER_MODE_NORMAL; //后脚 - 陀螺仪正常模式
  53. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_BACK].timestamp_resolution = SER_IMU_TIMESTAMP_25US; //后脚 - 时间戳25US精度
  54. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_BACK].timestamp_switch = SER_IMU_TIMESTAMP_OFF; //后脚 - 时间戳关闭
  55. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_BACK].acc_fs = SER_IMU_ACC_FS_16G; //后脚 - 加速度量程 - 16G
  56. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_BACK].gry_fs = SER_IMU_GRY_FS_2000DPS; //后脚 - 陀螺仪量程 - 2000DPS
  57. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_BACK].mag_fs = SER_IMU_MAG_FS_30GS; //后脚 - 地磁计量程 - 30GS
  58. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_BACK].acc_odr = SER_IMU_ACC_ODR_OFF; //后脚 - 加速度采样频率 - 关闭
  59. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_BACK].gry_odr = SER_IMU_GRY_ODR_OFF; //后脚 - 陀螺仪采样频率 - 关闭
  60. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_BACK].mag_odr = SER_IMU_MAG_ODR_10HZ; //后脚 - 地磁计采样频率 - 10HZ
  61. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_BACK].fifo_odr = SER_IMU_FIFO_ODR_OFF; //后脚 - FIFO采样频率 - 关闭
  62. }
  63. static void hal_ser_imu_mode_manage_imu_low_power_init(HAL_SER_IMU_MODE_MANAGE_e mode)
  64. {
  65. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_FRONT].acc_power_mode = SER_IMU_ACC_POWER_MODE_NORMAL; //前脚 - 加速度正常模式
  66. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_FRONT].gry_power_mode = SER_IMU_GRY_POWER_MODE_NORMAL; //前脚 - 陀螺仪正常模式
  67. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_FRONT].timestamp_resolution = SER_IMU_TIMESTAMP_25US; //前脚 - 时间戳25US精度
  68. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_FRONT].timestamp_switch = SER_IMU_TIMESTAMP_OFF; //前脚 - 时间戳关闭
  69. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_FRONT].acc_fs = SER_IMU_ACC_FS_16G; //前脚 - 加速度量程 - 16G
  70. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_FRONT].gry_fs = SER_IMU_GRY_FS_2000DPS; //前脚 - 陀螺仪量程 - 2000DPS
  71. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_FRONT].mag_fs = SER_IMU_MAG_FS_30GS; //前脚 - 地磁计量程 - 30GS
  72. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_FRONT].acc_odr = SER_IMU_ACC_ODR_104HZ; //前脚 - 加速度采样频率 - 104HZ
  73. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_FRONT].gry_odr = SER_IMU_GRY_ODR_OFF; //前脚 - 陀螺仪采样频率 - 关闭
  74. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_FRONT].mag_odr = SER_IMU_MAG_ODR_100HZ; //前脚 - 地磁计采样频率 - 100HZ
  75. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_FRONT].fifo_odr = SER_IMU_FIFO_ODR_104HZ; //前脚 - FIFO采样频率 - 104HZ
  76. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_BACK].acc_power_mode = SER_IMU_ACC_POWER_MODE_NORMAL; //后脚 - 加速度正常模式
  77. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_BACK].gry_power_mode = SER_IMU_GRY_POWER_MODE_NORMAL; //后脚 - 陀螺仪正常模式
  78. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_BACK].timestamp_resolution = SER_IMU_TIMESTAMP_25US; //后脚 - 时间戳25US精度
  79. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_BACK].timestamp_switch = SER_IMU_TIMESTAMP_OFF; //后脚 - 时间戳关闭
  80. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_BACK].acc_fs = SER_IMU_ACC_FS_16G; //后脚 - 加速度量程 - 16G
  81. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_BACK].gry_fs = SER_IMU_GRY_FS_2000DPS; //后脚 - 陀螺仪量程 - 2000DPS
  82. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_BACK].mag_fs = SER_IMU_MAG_FS_30GS; //后脚 - 地磁计量程 - 30GS
  83. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_BACK].acc_odr = SER_IMU_ACC_ODR_OFF; //后脚 - 加速度采样频率 - 关闭
  84. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_BACK].gry_odr = SER_IMU_GRY_ODR_OFF; //后脚 - 陀螺仪采样频率 - 关闭
  85. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_BACK].mag_odr = SER_IMU_MAG_ODR_OFF; //后脚 - 地磁计采样频率 - 关闭
  86. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_BACK].fifo_odr = SER_IMU_FIFO_ODR_OFF; //后脚 - FIFO采样频率 - 关闭
  87. }
  88. static void hal_ser_imu_mode_manage_imu_full_power_init(HAL_SER_IMU_MODE_MANAGE_e mode)
  89. {
  90. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_FRONT].acc_power_mode = SER_IMU_ACC_POWER_MODE_NORMAL; //前脚 - 加速度正常模式
  91. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_FRONT].gry_power_mode = SER_IMU_GRY_POWER_MODE_NORMAL; //前脚 - 陀螺仪正常模式
  92. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_FRONT].timestamp_resolution = SER_IMU_TIMESTAMP_25US; //前脚 - 时间戳25US精度
  93. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_FRONT].timestamp_switch = SER_IMU_TIMESTAMP_ON; //前脚 - 时间戳开启
  94. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_FRONT].acc_fs = SER_IMU_ACC_FS_16G; //前脚 - 加速度量程 - 16G
  95. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_FRONT].gry_fs = SER_IMU_GRY_FS_2000DPS; //前脚 - 陀螺仪量程 - 2000DPS
  96. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_FRONT].mag_fs = SER_IMU_MAG_FS_30GS; //前脚 - 地磁计量程 - 30GS
  97. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_FRONT].acc_odr = SER_IMU_ACC_ODR_104HZ; //前脚 - 加速度采样频率 - 104HZ
  98. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_FRONT].gry_odr = SER_IMU_GRY_ODR_104HZ; //前脚 - 陀螺仪采样频率 - 104HZ
  99. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_FRONT].mag_odr = SER_IMU_MAG_ODR_200HZ; //前脚 - 地磁计采样频率 - 200HZ
  100. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_FRONT].fifo_odr = SER_IMU_FIFO_ODR_104HZ; //前脚 - FIFO采样频率 - 104HZ
  101. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_BACK].acc_power_mode = SER_IMU_ACC_POWER_MODE_NORMAL; //后脚 - 加速度正常模式
  102. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_BACK].gry_power_mode = SER_IMU_GRY_POWER_MODE_NORMAL; //后脚 - 陀螺仪正常模式
  103. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_BACK].timestamp_resolution = SER_IMU_TIMESTAMP_25US; //后脚 - 时间戳25US精度
  104. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_BACK].timestamp_switch = SER_IMU_TIMESTAMP_OFF; //后脚 - 时间戳关闭
  105. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_BACK].acc_fs = SER_IMU_ACC_FS_16G; //后脚 - 加速度量程 - 16G
  106. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_BACK].gry_fs = SER_IMU_GRY_FS_2000DPS; //后脚 - 陀螺仪量程 - 2000DPS
  107. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_BACK].mag_fs = SER_IMU_MAG_FS_30GS; //后脚 - 地磁计量程 - 30GS
  108. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_BACK].acc_odr = SER_IMU_ACC_ODR_OFF; //后脚 - 加速度采样频率 - 关闭
  109. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_BACK].gry_odr = SER_IMU_GRY_ODR_OFF; //后脚 - 陀螺仪采样频率 - 关闭
  110. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_BACK].mag_odr = SER_IMU_MAG_ODR_200HZ; //后脚 - 地磁计采样频率 - 200HZ
  111. ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_BACK].fifo_odr = SER_IMU_FIFO_ODR_OFF; //后脚 - FIFO采样频率 - 关闭
  112. }
  113. static void hal_ser_imu_mode_manage_printf_Process(void)
  114. {
  115. DEBUG_LOG("hal_ser_imu_mode_manage----------------------------------------------------------------->\n");
  116. DEBUG_LOG("mode_switch:%d,%d,%d,%d,%d\n",ob_ser_imu_mode_manage.mode_switch[HAL_SER_IMU_MODE_MANAGE_STANDBY], \
  117. ob_ser_imu_mode_manage.mode_switch[HAL_SER_IMU_MODE_MANAGE_NORMAL], \
  118. ob_ser_imu_mode_manage.mode_switch[HAL_SER_IMU_MODE_MANAGE_SELF_CHECK], \
  119. ob_ser_imu_mode_manage.mode_switch[HAL_SER_IMU_MODE_MANAGE_GAME], \
  120. ob_ser_imu_mode_manage.mode_switch[HAL_SER_IMU_MODE_MANAGE_REALSTEP]);
  121. DEBUG_LOG("<-----------------------------------------------------------------hal_ser_imu_mode_manage\n");
  122. }
  123. static void hal_ser_imu_mode_manage_err_update_Process(void)
  124. {
  125. char err_buff[100];
  126. if(ob_ser_imu_mode_manage.is_imu_damage)
  127. {
  128. //发送一次不能进入其他模式的异常上报。
  129. sprintf(err_buff,"enter_imu_damage_mode,last_enter_mode:%d,%d\r\n",ob_ser_imu_mode_manage.last_enter_mode,ob_ser_imu_mode_manage.is_imu_id_unusual);
  130. Except_TxError(EXCEPT_IMU_SUSPEND_OVERFLOW,err_buff);
  131. }
  132. else
  133. {
  134. //如果IMU配置失败进入挂起模式
  135. if(Except_IsError(EXCEPT_IMU_SUSPEND_OVERFLOW)){
  136. //IMU损坏
  137. ob_ser_imu_mode_manage.is_imu_damage = true;
  138. }
  139. }
  140. }
  141. /*API ------------------------------------------------------------------------------------------------------------------------------------*/
  142. /**
  143. @brief 初始化模式管理服务
  144. @param 无
  145. @return 错误代码 - [out] -1失败,0成功
  146. */
  147. int hal_ser_imu_mode_manage_Init(void)
  148. {
  149. int ret = 0;
  150. //初始化imu服务
  151. if(hal_ser_imu_Init() == -1)ret = -1;
  152. //重置模式管理服务结构体
  153. memset(&ob_ser_imu_mode_manage, 0, sizeof(ob_ser_imu_mode_manage));
  154. /*初始化模式管理服务结构体*/
  155. if(ret == -1)
  156. {
  157. ob_ser_imu_mode_manage.is_imu_id_unusual = true;
  158. ob_ser_imu_mode_manage.is_imu_damage = true;
  159. }
  160. else
  161. {
  162. ob_ser_imu_mode_manage.is_imu_id_unusual = false;
  163. ob_ser_imu_mode_manage.is_imu_damage = false;
  164. }
  165. ob_ser_imu_mode_manage.last_enter_mode = HAL_SER_IMU_MODE_MANAGE_NUM;
  166. //初始化-待机模式配置
  167. ob_ser_imu_mode_manage.mode_switch[HAL_SER_IMU_MODE_MANAGE_STANDBY] = 0; //模式关闭
  168. hal_ser_imu_get_handle("HAL_SER_IMU_MODE_MANAGE_STANDBY", &ob_ser_imu_mode_manage.ser_imu_handle_id[HAL_SER_IMU_MODE_MANAGE_STANDBY]); //获取操作IMU服务句柄ID
  169. hal_ser_imu_mode_manage_imu_standby_power_init(HAL_SER_IMU_MODE_MANAGE_STANDBY); //设置IMU服务配置参数 - 待机配置
  170. //初始化-正常模式配置
  171. ob_ser_imu_mode_manage.mode_switch[HAL_SER_IMU_MODE_MANAGE_NORMAL] = 0; //模式关闭
  172. hal_ser_imu_get_handle("HAL_SER_IMU_MODE_MANAGE_NORMAL", &ob_ser_imu_mode_manage.ser_imu_handle_id[HAL_SER_IMU_MODE_MANAGE_NORMAL]); //获取操作IMU服务句柄ID
  173. hal_ser_imu_mode_manage_imu_low_power_init(HAL_SER_IMU_MODE_MANAGE_NORMAL); //设置IMU服务配置参数 - 低功耗配置
  174. //初始化-自检模式配置
  175. ob_ser_imu_mode_manage.mode_switch[HAL_SER_IMU_MODE_MANAGE_SELF_CHECK] = 0; //模式关闭
  176. hal_ser_imu_get_handle("HAL_SER_IMU_MODE_MANAGE_SELF_CHECK", &ob_ser_imu_mode_manage.ser_imu_handle_id[HAL_SER_IMU_MODE_MANAGE_SELF_CHECK]); //获取操作IMU服务句柄ID
  177. hal_ser_imu_mode_manage_imu_full_power_init(HAL_SER_IMU_MODE_MANAGE_SELF_CHECK); //设置IMU服务配置参数 - 全功率配置
  178. //初始化-游戏模式配置
  179. ob_ser_imu_mode_manage.mode_switch[HAL_SER_IMU_MODE_MANAGE_GAME] = 0; //模式关闭
  180. hal_ser_imu_get_handle("HAL_SER_IMU_MODE_MANAGE_GAME", &ob_ser_imu_mode_manage.ser_imu_handle_id[HAL_SER_IMU_MODE_MANAGE_GAME]); //获取操作IMU服务句柄ID
  181. hal_ser_imu_mode_manage_imu_full_power_init(HAL_SER_IMU_MODE_MANAGE_GAME); //设置IMU服务配置参数 - 全功率配置
  182. //初始化-校准模式配置
  183. ob_ser_imu_mode_manage.mode_switch[HAL_SER_IMU_MODE_MANAGE_CALIBRATION] = 0; //模式关闭
  184. hal_ser_imu_get_handle("HAL_SER_IMU_MODE_MANAGE_CALIBRATION", &ob_ser_imu_mode_manage.ser_imu_handle_id[HAL_SER_IMU_MODE_MANAGE_CALIBRATION]);//获取操作IMU服务句柄ID
  185. hal_ser_imu_mode_manage_imu_full_power_init(HAL_SER_IMU_MODE_MANAGE_CALIBRATION);
  186. //初始化-实时计步模式配置
  187. ob_ser_imu_mode_manage.mode_switch[HAL_SER_IMU_MODE_MANAGE_REALSTEP] = 0; //模式关闭
  188. hal_ser_imu_get_handle("HAL_SER_IMU_MODE_MANAGE_REALSTEP", &ob_ser_imu_mode_manage.ser_imu_handle_id[HAL_SER_IMU_MODE_MANAGE_REALSTEP]); //获取操作IMU服务句柄ID
  189. hal_ser_imu_mode_manage_imu_full_power_init(HAL_SER_IMU_MODE_MANAGE_REALSTEP); //设置IMU服务配置参数 - 全功率配置
  190. //初始化关机配置参数
  191. hal_ser_imu_mode_manage_imu_power_off_init(&imu_power_off_param);
  192. DEBUG_LOG("sizeof(%d)\n",sizeof(ob_ser_imu_mode_manage));
  193. // Process_Start(1000,"hal_ser_imu_mode_manage_printf_Process",hal_ser_imu_mode_manage_printf_Process);
  194. Process_Start(5000,"hal_ser_imu_mode_manage_err_update_Process",hal_ser_imu_mode_manage_err_update_Process);
  195. if(ret == -1)return -1;
  196. return 0;
  197. }
  198. /**
  199. @brief 请求需要的模式
  200. @param mode - [in] 需要请求的模式
  201. @param imu_mode_switch - [in] 请求的模式开关
  202. @return 错误代码 - [out] -1失败,0成功
  203. */
  204. int hal_ser_imu_mode_manage_set_required(HAL_SER_IMU_MODE_MANAGE_e mode, HAL_SER_IMU_MODE_MANAGE_IMU_MODE_SWITCH_e imu_mode_switch)
  205. {
  206. //操作模式不能超过模式数量
  207. if(mode >= HAL_SER_IMU_MODE_MANAGE_NUM)return -1;
  208. //设置模式开关
  209. switch(imu_mode_switch)
  210. {
  211. case HAL_SER_IMU_MODE_MANAGE_IMU_MODE_ON:
  212. if(ob_ser_imu_mode_manage.mode_switch[mode] == 0)ob_ser_imu_mode_manage.mode_switch[mode]++;
  213. break;
  214. case HAL_SER_IMU_MODE_MANAGE_IMU_MODE_OFF:
  215. if(ob_ser_imu_mode_manage.mode_switch[mode] != 0)ob_ser_imu_mode_manage.mode_switch[mode]--;
  216. break;
  217. }
  218. // //如果IMU损毁
  219. // if(ob_ser_imu_mode_manage.is_imu_damage)
  220. // {
  221. // //清空
  222. // memset(ob_ser_imu_mode_manage.mode_switch,0,sizeof(ob_ser_imu_mode_manage.mode_switch));
  223. // //直接强制性不穿鞋模式
  224. // ob_ser_imu_mode_manage.mode_switch[HAL_SER_IMU_MODE_MANAGE_STANDBY] = 1;
  225. // }
  226. //设置各个模式下的配置
  227. for(int i = 0; i < HAL_SER_IMU_MODE_MANAGE_NUM; i++)
  228. {
  229. if(ob_ser_imu_mode_manage.mode_switch[i] > 0)//模式开启
  230. {
  231. //设置前脚IMU配置参数
  232. if(hal_ser_imu_set_required_param(ob_ser_imu_mode_manage.ser_imu_handle_id[i], SER_IMU_DIR_FRONT, &ob_ser_imu_mode_manage.ser_imu_param[i][SER_IMU_DIR_FRONT]) == -1)return -1;
  233. //设置后脚IMU配置参数
  234. if(hal_ser_imu_set_required_param(ob_ser_imu_mode_manage.ser_imu_handle_id[i], SER_IMU_DIR_BACK, &ob_ser_imu_mode_manage.ser_imu_param[i][SER_IMU_DIR_BACK]) == -1)return -1;
  235. }
  236. else //模式关闭
  237. {
  238. //设置前脚IMU配置参数
  239. if(hal_ser_imu_set_required_param(ob_ser_imu_mode_manage.ser_imu_handle_id[i], SER_IMU_DIR_FRONT, &imu_power_off_param) == -1)return -1;
  240. //设置后脚IMU配置参数
  241. if(hal_ser_imu_set_required_param(ob_ser_imu_mode_manage.ser_imu_handle_id[i], SER_IMU_DIR_BACK, &imu_power_off_param) == -1)return -1;
  242. }
  243. }
  244. return 0;
  245. }
  246. /**
  247. @brief 模式是否准备好
  248. @param mode - [in] 需要的模式
  249. @return 错误代码 - [out] -1失败,0成功
  250. */
  251. int hal_ser_imu_mode_manage_get_ready(HAL_SER_IMU_MODE_MANAGE_e mode)
  252. {
  253. //操作模式不能超过模式数量
  254. if(mode >= HAL_SER_IMU_MODE_MANAGE_NUM)return -1;
  255. if(ob_ser_imu_mode_manage.mode_switch[mode] == 0)
  256. {
  257. return -1;
  258. }
  259. else
  260. {
  261. //判断前脚IMU配置参数是否准备好
  262. if(hal_ser_imu_is_param_get_ready(SER_IMU_DIR_FRONT, &ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_FRONT]) != -1)
  263. {
  264. //判断后脚IMU配置参数是否准备好
  265. if(hal_ser_imu_is_param_get_ready(SER_IMU_DIR_BACK, &ob_ser_imu_mode_manage.ser_imu_param[mode][SER_IMU_DIR_BACK]) != -1)
  266. {
  267. ob_ser_imu_mode_manage.last_enter_mode = mode;
  268. return 0;
  269. }
  270. }
  271. }
  272. return -1;
  273. }
  274. /**
  275. @brief 获取当前模式的IMU当前数据数量
  276. @param mode - [in] 需要的模式
  277. @param dir - [in] IMU方向 - 前/后脚
  278. @return 错误代码 - [out] 返回数据数量
  279. */
  280. int hal_ser_imu_mode_manage_get_data_num(SER_IMU_DIR_e dir)
  281. {
  282. return hal_ser_imu_get_data_num(dir);
  283. }
  284. /**
  285. @brief 获取当前模式的IMU数据
  286. @param dir - [in] IMU方向 - 前/后脚
  287. @param index - [in] 第几组数据
  288. @param pdata - [out] IMU数据
  289. @return 错误代码 - [out] -1失败,0成功
  290. */
  291. int hal_ser_imu_mode_manage_get_data(SER_IMU_DIR_e dir, int index, ser_imu_data_t *pdata)
  292. {
  293. return hal_ser_imu_get_data(dir, index, pdata);
  294. }
  295. /**
  296. @brief 查询当前是否挂起模式
  297. @return 错误代码 - [out] -1 非挂起模式,0 挂起模式
  298. */
  299. int hal_ser_imu_mode_IsSuspend(void)
  300. {
  301. for(uint8_t i = HAL_SER_IMU_MODE_MANAGE_STANDBY;i< HAL_SER_IMU_MODE_MANAGE_NUM;i++){
  302. if( 0 == hal_ser_imu_mode_manage_get_ready((HAL_SER_IMU_MODE_MANAGE_e)i)){
  303. return -1;
  304. }
  305. }
  306. return 0;
  307. }