Statistics
| Branch: | Tag: | Revision:

amiro-os / components / gyro / l3g4200d.cpp @ 58fe0e0b

History | View | Annotate | Download (2.854 KB)

1 58fe0e0b Thomas Schöpping
#include <string.h>
2
3
#include <amiro/util/util.h>
4
#include <amiro/bus/spi/HWSPIDriver.hpp>
5
#include <amiro/gyro/l3g4200d.hpp>
6
7
namespace amiro {
8
9
L3G4200D::L3G4200D(HWSPIDriver *driver)
10
    : driver(driver) {
11
12
}
13
14
L3G4200D::~L3G4200D() {
15
16
}
17
18
chibios_rt::EvtSource*
19
L3G4200D::getEventSource() {
20
  return &this->eventSource;
21
}
22
23
msg_t L3G4200D::main() {
24
25
  this->setName("L3g4200d");
26
27
  while (!this->shouldTerminate()) {
28
29
    updateSensorData();
30
31
    this->eventSource.broadcastFlags(1);
32
33
    this->waitAnyEventTimeout(ALL_EVENTS, MS2ST(200));
34
35
  }
36
  return RDY_OK;
37
}
38
39
int16_t
40
L3G4200D::
41
getAngularRate(const uint8_t axis) {
42
43
  return this->angularRate[axis];
44
45
}
46
47
void L3G4200D::updateSensorData() {
48
49
  const size_t buffer_size = offsetof(L3G4200D::registers, OUT_Z)
50
                             - offsetof(L3G4200D::registers, STATUS_REG)
51
                             + MEMBER_SIZE(L3G4200D::registers, OUT_Z)
52
                             + 1; /* addressing */
53
  uint8_t buffer[buffer_size];
54
  uint8_t sreg;
55
56
  /*Address of first data register*/
57
  memset(buffer, 0xFF, sizeof(buffer));
58
  buffer[0] = offsetof(L3G4200D::registers, STATUS_REG) | L3G4200D::SPI_READ | L3G4200D::SPI_MULT;
59
60
  this->driver->exchange(buffer, buffer, buffer_size);
61
62
  // assemble data
63
  sreg = buffer[1];
64
65
  if (sreg & L3G4200D::XDA)
66
    this->angularRate[L3G4200D::AXIS_X] = (buffer[3] << 8) + buffer[2];
67
68
  if (sreg & L3G4200D::YDA)
69
    this->angularRate[L3G4200D::AXIS_Y] = (buffer[5] << 8) + buffer[4];
70
71
  if (sreg & L3G4200D::ZDA)
72
    this->angularRate[L3G4200D::AXIS_Z] = (buffer[7] << 8) + buffer[6];
73
74
}
75
76
msg_t L3G4200D::configure(const L3G4200DConfig *config) {
77
78
  const size_t ctrl_reg_size = offsetof(L3G4200D::registers, CTRL_REG5)
79
                               - offsetof(L3G4200D::registers, CTRL_REG1)
80
                               + MEMBER_SIZE(L3G4200D::registers, CTRL_REG5)
81
                               + 1; /* addressing */
82
83
  const size_t buffer_size = ctrl_reg_size;
84
85
  uint8_t buffer[buffer_size];
86
87
  // write control config
88
  // this might be three-wire so we need to send ones
89
  memset(buffer, 0xFFu, buffer_size);
90
  buffer[0] = offsetof(L3G4200D::registers, CTRL_REG1) | L3G4200D::SPI_MULT | L3G4200D::SPI_WRITE;
91
  buffer[1] = config->ctrl1;
92
  buffer[2] = config->ctrl2;
93
  buffer[3] = config->ctrl3;
94
  buffer[4] = config->ctrl4;
95
  buffer[5] = config->ctrl5;
96
  this->driver->write(buffer, 6);
97
98
  return RDY_OK;
99
100
}
101
102
uint8_t L3G4200D::getCheck() {
103
104
  const size_t buffer_size = 1 /* addressing */
105
  + 1; /* who am i */
106
  uint8_t buffer[buffer_size];
107
108
  // Exchange the data with the L3G4200D gyroscope
109
  // Specify the adress and the mode
110
  buffer[0] = offsetof(L3G4200D::registers, WHO_AM_I) | L3G4200D::SPI_READ;
111
  this->driver->exchange(buffer, buffer, buffer_size);
112
  // Check
113
  if (buffer[1] == L3G4200D::L3G4200D_ID) {
114
    return L3G4200D::CHECK_OK;
115
  } else {
116
    return L3G4200D::CHECK_FAIL;
117
  }
118
119
}
120
121
} /* amiro */