app_imu.cpp 2.2 KB

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