app_imu.cpp 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400
  1. /*
  2. * app_imu.cpp
  3. *
  4. * Created on: Nov 23, 2023
  5. * Author: juraj
  6. */
  7. #include "app_imu.h"
  8. #include "IcmSpiManager.h"
  9. #include "icm20948.h"
  10. extern SPI_HandleTypeDef hspi1;
  11. nBusAppInterface_t mcu_spi_driver = {
  12. mcu_spi_init,
  13. mcu_spi_reset,
  14. mcu_spi_getType,
  15. mcu_spi_getSensorCount,
  16. mcu_spi_getData,
  17. mcu_spi_setData,
  18. mcu_spi_hasParam,
  19. mcu_spi_getParam,
  20. mcu_spi_setParam,
  21. mcu_spi_start,
  22. mcu_spi_stop,
  23. mcu_spi_readData,
  24. NULL, //mcu_spi_store,
  25. mcu_spi_calibrate,
  26. };
  27. axisesI *sensor_dataI; // int16 values
  28. Icm20948 *sensor;
  29. IcmSpiManager *manager;
  30. nBusAppInterface_t *getImuDriver(){
  31. return &mcu_spi_driver;
  32. }
  33. static accel_samplerate getAccelParamSamplerate(int32_t value){
  34. switch(value){
  35. case ACCEL_samplerate_0_27Hz:
  36. case ACCEL_samplerate_0_55Hz:
  37. case ACCEL_samplerate_102_3Hz:
  38. case ACCEL_samplerate_140_6Hz:
  39. case ACCEL_samplerate_17_6Hz:
  40. case ACCEL_samplerate_187_5Hz:
  41. case ACCEL_samplerate_1_1Hz:
  42. case ACCEL_samplerate_281_3Hz:
  43. case ACCEL_samplerate_2_2Hz:
  44. case ACCEL_samplerate_35_2Hz:
  45. case ACCEL_samplerate_48_9Hz:
  46. case ACCEL_samplerate_4_4Hz:
  47. case ACCEL_samplerate_562_5Hz:
  48. case ACCEL_samplerate_70_3Hz:
  49. case ACCEL_samplerate_8_8Hz:
  50. return (accel_samplerate)value;
  51. }
  52. return ACCEL_samplerate_None;
  53. }
  54. static accel_full_scale getAccelParamFullScale(int32_t value){
  55. switch(value){
  56. case ACCEL_FS_2g:
  57. case ACCEL_FS_4g:
  58. case ACCEL_FS_8g:
  59. case ACCEL_FS_16g:
  60. return (accel_full_scale)value;
  61. }
  62. return ACCEL_FS_NoneG;
  63. }
  64. static accel_dlp_cfg getAccelParamLowPassFilter(int32_t value){
  65. switch(value){
  66. case ACCEL_lpf_005_7Hz:
  67. case ACCEL_lpf_011_5Hz:
  68. case ACCEL_lpf_023_9Hz:
  69. case ACCEL_lpf_050_4Hz:
  70. case ACCEL_lpf_114_4Hz:
  71. case ACCEL_lpf_246Hz:
  72. case ACCEL_lpf_473Hz:
  73. case ACCEL_lpf_OFF:
  74. return (accel_dlp_cfg)value;
  75. }
  76. return ACCEL_lpf_None;
  77. }
  78. static gyro_samplerate getGyroParamSamplerate(int32_t value){
  79. switch(value){
  80. case GYRO_samplerate_004_4Hz:
  81. case GYRO_samplerate_017_3Hz:
  82. case GYRO_samplerate_017_6Hz:
  83. case GYRO_samplerate_034_1Hz:
  84. case GYRO_samplerate_035_2Hz:
  85. case GYRO_samplerate_048_9Hz:
  86. case GYRO_samplerate_066_2Hz:
  87. case GYRO_samplerate_070_3Hz:
  88. case GYRO_samplerate_102_3Hz:
  89. case GYRO_samplerate_125_0Hz:
  90. case GYRO_samplerate_140_6Hz:
  91. case GYRO_samplerate_187_5Hz:
  92. case GYRO_samplerate_225_0Hz:
  93. case GYRO_samplerate_281_3Hz:
  94. case GYRO_samplerate_375_0Hz:
  95. case GYRO_samplerate_562_5Hz:
  96. return (gyro_samplerate)value;
  97. }
  98. return GYRO_samplerate_None;
  99. }
  100. static gyro_full_scale getGyroParamFullScale(int32_t value){
  101. switch(value){
  102. case GYRO_FS_1000dps:
  103. case GYRO_FS_2000dps:
  104. case GYRO_FS_250dps:
  105. case GYRO_FS_500dps:
  106. return (gyro_full_scale)value;
  107. }
  108. return GYRO_FS_None;
  109. }
  110. static gyro_dlp_cfg getGyroParamLowPassFilter(int32_t value){
  111. switch(value){
  112. case GYRO_low_pass_OFF:
  113. case GYRO_lpf_005_7Hz:
  114. case GYRO_lpf_011_6Hz:
  115. case GYRO_lpf_023_9Hz:
  116. case GYRO_lpf_051_2Hz:
  117. case GYRO_lpf_119_5Hz:
  118. case GYRO_lpf_151_8Hz:
  119. case GYRO_lpf_196_6Hz:
  120. case GYRO_lpf_361_4Hz:
  121. return (gyro_dlp_cfg)value;
  122. }
  123. return GYRO_lpf_None;
  124. }
  125. void mcu_spi_init(void *hw_interface, void *hw_config){
  126. manager = new IcmSpiManager((SPI_HandleTypeDef*)hw_interface); // TODO toto ma byt o uroven vyssie, ale je to c subor
  127. sensor = new Icm20948(manager, (icm20948_Config*)hw_config);
  128. }
  129. void mcu_spi_reset(){
  130. sensor->Reset();
  131. }
  132. void mcu_spi_start(){
  133. sensor->Start();
  134. }
  135. void mcu_spi_stop(){
  136. sensor->Stop();
  137. }
  138. void mcu_spi_readData(void){
  139. sensor->Read();
  140. }
  141. nBus_sensorType_t mcu_spi_getType(uint8_t sensor_index){
  142. if (sensor_index > mcu_spi_getSensorCount()) {
  143. return TYPE_UNKNOWN;
  144. }
  145. if (sensor_index == 1) {
  146. return TYPE_ACCELEROMETER;
  147. }
  148. if (sensor_index == 2) {
  149. return TYPE_GYROSCOPE;
  150. }
  151. return TYPE_UNKNOWN;
  152. }
  153. uint8_t mcu_spi_getSensorCount(){
  154. return 2;
  155. }
  156. uint8_t mcu_spi_getData(uint8_t sensor_index, uint8_t *data){
  157. if(sensor_index == 1){
  158. sensor_dataI = sensor->accSensor->GetData();
  159. }
  160. if(sensor_index == 2){
  161. sensor_dataI = sensor->gyroSensor->GetData();
  162. }
  163. data[0] = sensor_index;
  164. data[1] = (uint8_t)sensor_dataI->x & 0xFF;
  165. data[2] = (uint8_t)((sensor_dataI->x >> 8) & 0xFF);
  166. data[3] = (uint8_t)sensor_dataI->y & 0xFF;
  167. data[4] = (uint8_t)((sensor_dataI->y >> 8) & 0xFF);
  168. data[5] = (uint8_t)sensor_dataI->z & 0xFF;
  169. data[6] = (uint8_t)((sensor_dataI->z >> 8) & 0xFF);
  170. return 7;
  171. }
  172. uint8_t mcu_spi_setData(uint8_t *data){
  173. return 1; // ILLEGAL_FUNCTION;
  174. }
  175. int32_t mcu_spi_getParam(uint8_t sensor_index, nBus_param_t param){
  176. uint32_t param_value = PARAM_VALUE_NONE;
  177. // to module
  178. if(sensor_index == 0) {
  179. return PARAM_VALUE_NONE;
  180. }
  181. if(sensor_index == 1) {
  182. switch(param){
  183. case PARAM_SAMPLERATE:
  184. param_value = sensor->accSensor->GetSampleRate();
  185. break;
  186. case PARAM_RANGE:
  187. param_value = sensor->accSensor->GetRange();
  188. break;
  189. case PARAM_FILTER:
  190. param_value = sensor->accSensor->GetLowPassFilter();
  191. break;
  192. default:
  193. param_value = PARAM_VALUE_NONE;
  194. }
  195. }
  196. if(sensor_index == 2) {
  197. switch(param){
  198. case PARAM_SAMPLERATE:
  199. param_value = sensor->gyroSensor->GetSampleRate();
  200. break;
  201. case PARAM_RANGE:
  202. param_value = sensor->gyroSensor->GetRange();
  203. break;
  204. case PARAM_FILTER:
  205. param_value = sensor->gyroSensor->GetLowPassFilter();
  206. break;
  207. default:
  208. param_value = PARAM_VALUE_NONE;
  209. }
  210. }
  211. return param_value;
  212. }
  213. uint8_t mcu_spi_hasParam(uint8_t sensor_index, nBus_param_t param){
  214. if(sensor_index == 1 || sensor_index == 2){
  215. switch(param){
  216. case PARAM_SAMPLERATE:
  217. case PARAM_RANGE:
  218. case PARAM_FILTER:
  219. return 1;
  220. default:
  221. return 0;
  222. }
  223. return 0;
  224. }
  225. return 0;
  226. }
  227. nBus_param_t mcu_spi_setParam(uint8_t sensor_index, nBus_param_t param, int32_t value) {
  228. // to module
  229. if(sensor_index == 0) {
  230. return PARAM_NONE;
  231. }
  232. if(sensor_index == 1) {
  233. switch(param){
  234. case PARAM_SAMPLERATE:
  235. {
  236. accel_samplerate sr = getAccelParamSamplerate(value);
  237. if(sr != ACCEL_samplerate_None) {
  238. sensor->accSensor->SetSampleRate(sr);
  239. } else {
  240. return PARAM_NONE;
  241. }
  242. }
  243. break;
  244. case PARAM_RANGE:
  245. {
  246. accel_full_scale fs = getAccelParamFullScale(value);
  247. if(fs != ACCEL_FS_NoneG) {
  248. sensor->accSensor->SetRange(fs);
  249. } else {
  250. return PARAM_NONE;
  251. }
  252. }
  253. break;
  254. case PARAM_FILTER:
  255. {
  256. accel_dlp_cfg lpf = getAccelParamLowPassFilter(value);
  257. if(lpf != ACCEL_lpf_None) {
  258. sensor->accSensor->SetLowPassFilter(lpf);
  259. } else {
  260. return PARAM_NONE;
  261. }
  262. }
  263. break;
  264. default:
  265. return PARAM_NONE;
  266. }
  267. }
  268. if(sensor_index == 2) {
  269. switch(param){
  270. case PARAM_SAMPLERATE:
  271. {
  272. gyro_samplerate sr = getGyroParamSamplerate(value);
  273. if(sr != GYRO_samplerate_None) {
  274. sensor->gyroSensor->SetSampleRate(sr);
  275. } else {
  276. return PARAM_NONE;
  277. }
  278. }
  279. break;
  280. case PARAM_RANGE:
  281. {
  282. gyro_full_scale fs = getGyroParamFullScale(value);
  283. if(fs != GYRO_FS_None) {
  284. sensor->gyroSensor->SetRange(fs);
  285. } else {
  286. return PARAM_NONE;
  287. }
  288. }
  289. break;
  290. case PARAM_FILTER:
  291. {
  292. gyro_dlp_cfg lpf = getGyroParamLowPassFilter(value);
  293. if(lpf != GYRO_lpf_None) {
  294. sensor->gyroSensor->SetLowPassFilter(lpf);
  295. } else {
  296. return PARAM_NONE;
  297. }
  298. }
  299. break;
  300. default:
  301. return PARAM_NONE;
  302. }
  303. }
  304. return param;
  305. }
  306. /**
  307. * @param sebslaveIndex sensorAccIndex, sensorGyroIndex, sensorAll
  308. */
  309. uint8_t mcu_spi_calibrate(uint8_t subslaveIndex, uint8_t calibrationParamsNum, uint8_t *calibrationParams){
  310. uint8_t wasReady = sensor->IsReady();
  311. sensor->Stop();
  312. uint8_t success = 0;
  313. if (subslaveIndex == (uint8_t) sensorAccIndex){
  314. sensor->accSensor->Calibrate();
  315. success = 1;
  316. }
  317. if (subslaveIndex == (uint8_t) sensorGyroIndex){
  318. sensor->gyroSensor->Calibrate();
  319. success = 1;
  320. }
  321. // if (subslaveIndex == sensorMagIndex){
  322. // sensor->magSensor->Calibrate();
  323. // }
  324. if (subslaveIndex == (uint8_t) sensorAll){
  325. sensor->accSensor->Calibrate();
  326. sensor->gyroSensor->Calibrate();
  327. // sensor->magSensor->Calibrate();
  328. success = 1;
  329. }
  330. if (wasReady !=0 ) {
  331. sensor->Start();
  332. }
  333. return success;
  334. }
  335. /*
  336. uint8_t mcu_spi_store(void){
  337. return 0;
  338. }
  339. */