app_imu.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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. };
  24. axisesI *sensor_dataI; // int16 values
  25. Icm20948 *sensor;
  26. nBusAppInterface_t *getImuDriver(){
  27. return &mcu_spi_driver;
  28. }
  29. void mcu_spi_init(void *hw_interface, void *hw_config){
  30. IcmSpiManager manager((SPI_HandleTypeDef*)hw_interface); // TODO toto ma byt o uroven vyssie, ale je to c subor
  31. Icm20948 sens(&manager, (icm20948_Config*)hw_config);
  32. sensor = &sens;
  33. }
  34. void mcu_spi_reset(){
  35. sensor->Reset();
  36. }
  37. void mcu_spi_start(){
  38. sensor->Start();
  39. }
  40. void mcu_spi_stop(){
  41. sensor->Stop();
  42. }
  43. nBus_sensorType_t mcu_spi_getType(uint8_t sensor_index){
  44. if (sensor_index > mcu_spi_getSensorCount())
  45. return TYPE_UNKNOWN;
  46. if (sensor_index == 1)
  47. return TYPE_ACCELEROMETER;
  48. if (sensor_index == 2)
  49. return TYPE_GYROSCOPE;
  50. return TYPE_UNKNOWN;
  51. }
  52. uint8_t mcu_spi_getSensorCount(){
  53. return 2;
  54. }
  55. uint8_t mcu_spi_getData(uint8_t sensor_index, uint8_t *data){
  56. if(sensor_index == 1){
  57. sensor_dataI = sensor->accSensor->GetData();
  58. }
  59. if(sensor_index == 2){
  60. sensor_dataI = sensor->gyroSensor->GetData();
  61. }
  62. data[0] = sensor_index;
  63. data[1] = (uint8_t)sensor_dataI->x & 0xFF;
  64. data[2] = (uint8_t)((sensor_dataI->x >> 8) & 0xFF);
  65. data[3] = (uint8_t)sensor_dataI->y & 0xFF;
  66. data[4] = (uint8_t)((sensor_dataI->y >> 8) & 0xFF);
  67. data[5] = (uint8_t)sensor_dataI->z & 0xFF;
  68. data[6] = (uint8_t)((sensor_dataI->z >> 8) & 0xFF);
  69. return 7;
  70. }
  71. uint8_t mcu_spi_setData(uint8_t *data){
  72. return 0;
  73. }
  74. uint8_t mcu_spi_getParam(uint8_t sensor_index, nBus_param_t param){
  75. return 0x00;
  76. }
  77. uint8_t mcu_spi_hasParam(uint8_t sensor_index, nBus_param_t param){
  78. return 0;
  79. }
  80. nBus_param_t mcu_spi_setParam(uint8_t sensor_index, nBus_param_t param, uint8_t value){
  81. return PARAM_NONE;
  82. }