app_imu.cpp 2.2 KB

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