tap_detection.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. #include <stdio.h>
  2. #include "bma400.h"
  3. void set_interface(enum bma400_intf intf, struct bma400_dev *dev);
  4. void delay_ms(uint32_t period);
  5. int8_t i2c_reg_write(void *intf_ptr, uint8_t i2c_addr, uint8_t reg_addr, uint8_t *reg_data, uint16_t length);
  6. int8_t i2c_reg_read(void *intf_ptr, uint8_t i2c_addr, uint8_t reg_addr, uint8_t *reg_data, uint16_t length);
  7. int8_t spi_reg_write(void *intf_ptr, uint8_t cs, uint8_t reg_addr, uint8_t *reg_data, uint16_t length);
  8. int8_t spi_reg_read(void *intf_ptr, uint8_t cs, uint8_t reg_addr, uint8_t *reg_data, uint16_t length);
  9. void print_rslt(int8_t rslt);
  10. int main(int argc, char const *argv[])
  11. {
  12. struct bma400_dev bma;
  13. struct bma400_int_enable tap_int[2];
  14. struct bma400_sensor_conf conf[2];
  15. int8_t rslt;
  16. uint32_t poll_period = 5, test_dur_ms = 30000;
  17. uint16_t int_status;
  18. set_interface(BMA400_SPI_INTF, &bma);
  19. rslt = bma400_init(&bma);
  20. print_rslt(rslt);
  21. rslt = bma400_soft_reset(&bma);
  22. print_rslt(rslt);
  23. conf[0].type = BMA400_ACCEL;
  24. conf[1].type = BMA400_TAP_INT;
  25. rslt = bma400_get_sensor_conf(conf, 2, &bma);
  26. print_rslt(rslt);
  27. conf[0].param.accel.odr = BMA400_ODR_200HZ;
  28. conf[0].param.accel.range = BMA400_4G_RANGE;
  29. conf[0].param.accel.data_src = BMA400_DATA_SRC_ACCEL_FILT_1;
  30. conf[0].param.accel.filt1_bw = BMA400_ACCEL_FILT1_BW_1;
  31. conf[1].param.tap.int_chan = BMA400_UNMAP_INT_PIN;
  32. conf[1].param.tap.axes_sel = BMA400_Z_AXIS_EN_TAP;
  33. conf[1].param.tap.sensitivity = BMA400_TAP_SENSITIVITY_0;
  34. rslt = bma400_set_sensor_conf(conf, 2, &bma);
  35. print_rslt(rslt);
  36. bma.delay_ms(100);
  37. tap_int[0].type = BMA400_SINGLE_TAP_INT_EN;
  38. tap_int[0].conf = BMA400_ENABLE;
  39. tap_int[1].type = BMA400_DOUBLE_TAP_INT_EN;
  40. tap_int[1].conf = BMA400_ENABLE;
  41. rslt = bma400_enable_interrupt(tap_int, 2, &bma);
  42. print_rslt(rslt);
  43. bma.delay_ms(100);
  44. rslt = bma400_set_power_mode(BMA400_NORMAL_MODE, &bma);
  45. print_rslt(rslt);
  46. bma.delay_ms(100);
  47. if (rslt == BMA400_OK) {
  48. printf("Tap configured.\r\n");
  49. while (test_dur_ms) {
  50. bma.delay_ms(poll_period);
  51. rslt = bma400_get_interrupt_status(&int_status, &bma);
  52. print_rslt(rslt);
  53. if (int_status & BMA400_S_TAP_INT_ASSERTED) {
  54. printf("Single tap detected!\r\n");
  55. }
  56. if (int_status & BMA400_D_TAP_INT_ASSERTED) {
  57. printf("Double tap detected!\r\n");
  58. }
  59. test_dur_ms -= poll_period;
  60. }
  61. }
  62. return 0;
  63. }
  64. void set_interface(enum bma400_intf intf, struct bma400_dev *dev)
  65. {
  66. switch (intf) {
  67. case BMA400_I2C_INTF:
  68. dev->intf_ptr = NULL; /* To attach your interface device reference */
  69. dev->delay_ms = delay_ms;
  70. dev->dev_id = BMA400_I2C_ADDRESS_SDO_LOW;
  71. dev->read = i2c_reg_read;
  72. dev->write = i2c_reg_write;
  73. dev->intf = BMA400_I2C_INTF;
  74. break;
  75. case BMA400_SPI_INTF:
  76. dev->intf_ptr = NULL; /* To attach your interface device reference */
  77. dev->dev_id = 0; /* Could be used to identify the chip select line. */
  78. dev->read = spi_reg_read;
  79. dev->write = spi_reg_write;
  80. dev->intf = BMA400_SPI_INTF;
  81. break;
  82. default:
  83. printf("Interface not supported.\r\n");
  84. }
  85. }
  86. void delay_ms(uint32_t period)
  87. {
  88. /* Wait for a period amount of ms*/
  89. }
  90. int8_t i2c_reg_write(void *intf_ptr, uint8_t i2c_addr, uint8_t reg_addr, uint8_t *reg_data, uint16_t length)
  91. {
  92. /* Write to registers using I2C. Return 0 for a successful execution. */
  93. return -1;
  94. }
  95. int8_t i2c_reg_read(void *intf_ptr, uint8_t i2c_addr, uint8_t reg_addr, uint8_t *reg_data, uint16_t length)
  96. {
  97. /* Read from registers using I2C. Return 0 for a successful execution. */
  98. return -1;
  99. }
  100. int8_t spi_reg_write(void *intf_ptr, uint8_t cs, uint8_t reg_addr, uint8_t *reg_data, uint16_t length)
  101. {
  102. /* Write to registers using SPI. Return 0 for a successful execution. */
  103. return -1;
  104. }
  105. int8_t spi_reg_read(void *intf_ptr, uint8_t cs, uint8_t reg_addr, uint8_t *reg_data, uint16_t length)
  106. {
  107. /* Read from registers using SPI. Return 0 for a successful execution. */
  108. return -1;
  109. }
  110. void print_rslt(int8_t rslt)
  111. {
  112. switch (rslt) {
  113. case BMA400_OK:
  114. /* Do nothing */
  115. break;
  116. case BMA400_E_NULL_PTR:
  117. printf("Error [%d] : Null pointer\r\n", rslt);
  118. break;
  119. case BMA400_E_COM_FAIL:
  120. printf("Error [%d] : Communication failure\r\n", rslt);
  121. break;
  122. case BMA400_E_DEV_NOT_FOUND:
  123. printf("Error [%d] : Device not found\r\n", rslt);
  124. break;
  125. case BMA400_E_INVALID_CONFIG:
  126. printf("Error [%d] : Invalid configuration\r\n", rslt);
  127. break;
  128. case BMA400_W_SELF_TEST_FAIL:
  129. printf("Warning [%d] : Self test failed\r\n", rslt);
  130. break;
  131. default:
  132. printf("Error [%d] : Unknown error code\r\n", rslt);
  133. break;
  134. }
  135. }