app_math.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. #include "app_math.h"
  2. #include "bsp_time.h"
  3. #include "system.h"
  4. #include "hal_imu.h"
  5. #include "hal_mode_manage.h"
  6. #include "math.h"
  7. #include "ble_comm.h"
  8. #include "app_flash.h"
  9. #include "detect_zero_vel.h"
  10. #include "tool.h"
  11. #include "app_switchimu.h"
  12. #include "detect_step_by_mag.h"
  13. static int16_t acc_front[IMU_BUFF_SIZE][3];
  14. static int16_t gry_front[IMU_BUFF_SIZE][3];
  15. static int16_t mag6310_front[IMU_BUFF_SIZE][3];
  16. static int16_t mag6310_back[3];
  17. static int32_t timestamp_front[IMU_BUFF_SIZE];
  18. static uint8_t rssi;
  19. static int16_t IMU_STATUS; //记录状态用来重新记录时间戳
  20. static int32_t timestamp;
  21. static int32_t last_timestamp;
  22. void process_imu_data_front(int front_index)
  23. {
  24. if(IMU_STATUS != 1)
  25. {
  26. IMU_STATUS = 1;
  27. last_timestamp = timestamp_front[0];
  28. timestamp = 0;
  29. }
  30. for(int i = 0; i < front_index; i++)
  31. {
  32. int32_t dt = timestamp_front[i] - last_timestamp;
  33. if(dt > 20000 || dt < 0)
  34. {
  35. dt = 10000;
  36. }
  37. timestamp += dt;
  38. last_timestamp = timestamp_front[i];
  39. // SEGGER_RTT_printf(0,"timestamp_front[i] : %d; i = %d\r\n", timestamp_front[i], i);
  40. IMU_Process_motion_queue(mFlash.isHost, timestamp, acc_front[i],
  41. gry_front[i],mag6310_front[i], mag6310_back, rssi);
  42. }
  43. }
  44. void app_math_TimerCounter(void)
  45. {
  46. int16_t group_num = 0;
  47. //游戏模式
  48. if(hal_mode_get() == HAL_MODE_GAME){
  49. // CHECK_TIMECONSUMING_START;
  50. rssi = 0-host_get_rssi();
  51. group_num = IMU_Get_Front_Data_Num();
  52. for(int i=0;i<group_num;i++){
  53. IMU_Get_Front_Data(i, gry_front[i], acc_front[i], mag6310_front[i], &timestamp_front[i]);
  54. SEGGER_RTT_printf(0,"imu_front index:%d------------------------>\n",i);
  55. SEGGER_RTT_printf(0,"f_ax=%d\r,f_ay=%d\r,f_az=%d\r\n",acc_front[i][0],acc_front[i][1],acc_front[i][2]);
  56. SEGGER_RTT_printf(0,"f_gx=%d\r,f_gy=%d\r,f_gz=%d\r\n",gry_front[i][0],gry_front[i][1],gry_front[i][2]);
  57. SEGGER_RTT_printf(0,"f_mx=%d\r,f_my=%d\r,f_mz=%d\r\n",mag6310_front[i][0],mag6310_front[i][1],mag6310_front[i][2]);
  58. SEGGER_RTT_printf(0,"timestamp=%d\r\n",timestamp_front[i]);
  59. // JS_RTT_Print_06(acc_front[i][0],acc_front[i][1],acc_front[i][2],gry_front[i][0],gry_front[i][1],gry_front[i][2]);
  60. // JS_RTT_Print_06(mag6310_front[i][0],mag6310_front[i][1],mag6310_front[i][2],timestamp_front[i],0,0);
  61. }
  62. IMU_Get_Back_Data(mag6310_back);
  63. SEGGER_RTT_printf(0,"b_mx=%d\r,b_my=%d\r,b_mz=%d\r\n",mag6310_back[0],mag6310_back[1],mag6310_back[2]);
  64. if(mFlash.isHost){
  65. process_imu_data_front(group_num);
  66. }else if(Slave_Get7_5ms_interval()){
  67. process_imu_data_front(group_num);
  68. }
  69. // CHECK_TIMECONSUMING_END;
  70. }else{
  71. //将状态重设为0
  72. IMU_STATUS = 0;
  73. }
  74. //实时计步模式
  75. if(hal_mode_get() == HAL_MODE_REALSTEP){
  76. rssi = 0-host_get_rssi();
  77. group_num = IMU_Get_Front_Data_Num();
  78. for(int i=0;i<group_num;i++)IMU_Get_Front_Data(i, gry_front[i], acc_front[i], mag6310_front[i], &timestamp_front[i]);
  79. IMU_Get_Back_Data(mag6310_back);
  80. if(app_switchimu_GetGameModeLsm() == USED_FRONT_LSM){
  81. SEGGER_RTT_printf(0,"app_switchimu_GetGameModeLsm() == USED_FRONT_LSM\r\n");
  82. //start_cal_step((int16_t*)mag6310_front, (int16_t*)mag6310_back, (int16_t*)acc);
  83. }else if(app_switchimu_GetGameModeLsm() == USED_CENTER_LSM){
  84. SEGGER_RTT_printf(0,"app_switchimu_GetGameModeLsm() == USED_CENTER_LSM\r\n");
  85. //start_cal_step((int16_t*)mag6310_front, (int16_t*)mag6310_back, (int16_t*)acc);
  86. }
  87. }
  88. }
  89. static void app_math_DailyStep_Process(void)
  90. {
  91. int16_t acc[3];
  92. int16_t mag6310[3];
  93. if(hal_mode_get() == HAL_MODE_NORMAL){
  94. for(int i=0; i < IMU_Get_Front_Data_Num(); i++)
  95. {
  96. IMU_Get_Front_Data(i, NULL, acc, mag6310, NULL);
  97. //SEGGER_RTT_printf(0,"f_mx=%d\r,f_my=%d\r,f_mz=%d\r\n",mag6310[0],mag6310[1],mag6310[2]);
  98. if(1 == detect_step_by_mag(mag6310,acc[2])){
  99. mFlash.mStep.stepCur[0]++;
  100. SEGGER_RTT_printf(0,">>>>>>isLoader:%d\r\n",mFlash.mStep.stepCur[0]);
  101. break;
  102. }
  103. }
  104. }
  105. }
  106. //static void hal_stepSaveTest_process(void){
  107. // mFlash.mStep.stepCur[0]++;
  108. //// Flash_SaveStep();
  109. // SEGGER_RTT_printf(0,"hal step Save one minute:step %d\r\n",mFlash.mStep.stepCur[0]);
  110. //}
  111. void app_math_Init(void)
  112. {
  113. Process_Start(100,"app_math_DailyStep_Process",app_math_DailyStep_Process);
  114. Process_Start(10,"app_math_TimerCounter",app_math_TimerCounter);
  115. // if(mFlash.isHost)Process_Start(10000,"hal_stepSaveTest",hal_stepSaveTest_process);
  116. }