47 #include "isr_compat.h"
50 void (*accm_int1_cb)(uint8_t reg);
51 void (*accm_int2_cb)(uint8_t reg);
53 process_event_t int1_event, int2_event;
56 static uint16_t int1_mask = 0, int2_mask = 0;
65 enum ADXL345_STATUSTYPES {
76 static enum ADXL345_STATUSTYPES _ADXL345_STATUS = 0x00;
80 static uint8_t adxl345_default_settings[] = {
85 ADXL345_THRESH_TAP_DEFAULT,
90 ADXL345_LATENT_DEFAULT,
91 ADXL345_WINDOW_DEFAULT,
92 ADXL345_THRESH_ACT_DEFAULT,
93 ADXL345_THRESH_INACT_DEFAULT,
94 ADXL345_TIME_INACT_DEFAULT,
95 ADXL345_ACT_INACT_CTL_DEFAULT,
96 ADXL345_THRESH_FF_DEFAULT,
97 ADXL345_TIME_FF_DEFAULT,
98 ADXL345_TAP_AXES_DEFAULT,
102 ADXL345_BW_RATE_DEFAULT,
103 ADXL345_POWER_CTL_DEFAULT,
104 ADXL345_INT_ENABLE_DEFAULT,
105 ADXL345_INT_MAP_DEFAULT,
108 ADXL345_DATA_FORMAT_DEFAULT,
109 ADXL345_FIFO_CTL_DEFAULT
114 PROCESS(accmeter_process,
"Accelerometer process");
123 accm_write_reg(uint8_t reg, uint8_t val) {
124 uint8_t tx_buf[] = {reg, val};
126 i2c_transmitinit(ADXL345_ADDR);
128 PRINTFDEBUG(
"I2C Ready to TX\n");
130 i2c_transmit_n(2, tx_buf);
132 PRINTFDEBUG(
"WRITE_REG 0x%02X @ reg 0x%02X\n", val, reg);
144 accm_write_stream(uint8_t len, uint8_t *data) {
145 i2c_transmitinit(ADXL345_ADDR);
147 PRINTFDEBUG(
"I2C Ready to TX(stream)\n");
149 i2c_transmit_n(len, data);
151 PRINTFDEBUG(
"WRITE_STR %u B to 0x%02X\n", len, data[0]);
162 accm_read_reg(uint8_t reg) {
165 PRINTFDEBUG(
"READ_REG 0x%02X\n", reg);
168 i2c_transmitinit(ADXL345_ADDR);
170 i2c_transmit_n(1, &rtx);
174 i2c_receiveinit(ADXL345_ADDR);
176 i2c_receive_n(1, &retVal);
191 accm_read_stream(uint8_t reg, uint8_t len, uint8_t *whereto) {
193 PRINTFDEBUG(
"READ_STR %u B from 0x%02X\n", len, reg);
196 i2c_transmitinit(ADXL345_ADDR);
198 i2c_transmit_n(1, &rtx);
202 i2c_receiveinit(ADXL345_ADDR);
204 i2c_receive_n(len, whereto);
215 accm_read_axis(
enum ADXL345_AXIS axis){
221 accm_read_stream(ADXL345_DATAX0 + axis, 2, &tmp[0]);
222 rd = (int16_t)(tmp[0] | (tmp[1]<<8));
238 accm_set_grange(uint8_t grange){
239 if(grange > ADXL345_RANGE_16G) {
241 PRINTFDEBUG(
"ADXL grange invalid: %u\n", grange);
247 tempreg = (accm_read_reg(ADXL345_DATA_FORMAT) & 0xFC);
249 accm_write_reg(ADXL345_DATA_FORMAT, tempreg);
258 if(!(_ADXL345_STATUS & INITED)){
259 PRINTFDEBUG(
"ADXL345 init\n");
260 _ADXL345_STATUS |= INITED;
267 ADXL345_DIR &=~ (ADXL345_INT1_PIN | ADXL345_INT2_PIN);
268 ADXL345_SEL &=~ (ADXL345_INT1_PIN | ADXL345_INT2_PIN);
269 ADXL345_SEL2 &=~ (ADXL345_INT1_PIN | ADXL345_INT2_PIN);
275 accm_write_stream(15, &adxl345_default_settings[0]);
276 accm_write_stream(5, &adxl345_default_settings[15]);
277 accm_write_reg(ADXL345_DATA_FORMAT, adxl345_default_settings[20]);
278 accm_write_reg(ADXL345_FIFO_CTL, adxl345_default_settings[21]);
284 ADXL345_IES &=~ (ADXL345_INT1_PIN | ADXL345_INT2_PIN);
285 ADXL345_IE |= (ADXL345_INT1_PIN | ADXL345_INT2_PIN);
295 accm_set_irq(uint8_t int1, uint8_t int2){
297 PRINTFDEBUG(
"IRQs set to INT1: 0x%02X IRQ2: 0x%02X\n", int1, int2);
302 accm_write_reg(ADXL345_INT_ENABLE, (int1 | int2));
303 accm_write_reg(ADXL345_INT_MAP, int2);
314 static volatile clock_time_t ints_backoffs[] = {ADXL345_INT_OVERRUN_BACKOFF, ADXL345_INT_WATERMARK_BACKOFF,
315 ADXL345_INT_FREEFALL_BACKOFF, ADXL345_INT_INACTIVITY_BACKOFF,
316 ADXL345_INT_ACTIVITY_BACKOFF, ADXL345_INT_DOUBLETAP_BACKOFF,
317 ADXL345_INT_TAP_BACKOFF, ADXL345_INT_DATAREADY_BACKOFF};
324 backoff_passed(clocktime_t happenedAt,
const clocktime_t backoff){
325 if(timenow-lasttime >= backoff) {
328 return (timenow-lasttime);
341 ireg = accm_read_reg(ADXL345_INT_SOURCE);
345 if(ireg & int1_mask){
346 if(accm_int1_cb !=
NULL){
347 PRINTFDEBUG(
"INT1 cb invoked\n");
350 }
else if(ireg & int2_mask){
351 if(accm_int2_cb !=
NULL){
352 PRINTFDEBUG(
"INT2 cb invoked\n");
377 static struct timer suppressTimer1, suppressTimer2;
379 ISR(PORT1, port1_isr)
381 ENERGEST_ON(ENERGEST_TYPE_IRQ);
383 if ((ADXL345_IFG & ADXL345_INT1_PIN) && !(ADXL345_IFG & BV(CC2420_FIFOP_PIN))){
386 timer_set(&suppressTimer1, SUPPRESS_TIME_INT1);
387 ADXL345_IFG &= ~ADXL345_INT1_PIN;
391 }
else if ((ADXL345_IFG & ADXL345_INT2_PIN) && !(ADXL345_IFG & BV(CC2420_FIFOP_PIN))){
394 timer_set(&suppressTimer2, SUPPRESS_TIME_INT2);
395 ADXL345_IFG &= ~ADXL345_INT2_PIN;
401 if(cc2420_interrupt()) {
405 ENERGEST_OFF(ENERGEST_TYPE_IRQ);
void process_poll(struct process *p)
Request a process to be polled.
#define PROCESS_BEGIN()
Define the beginning of a process.
void timer_set(struct timer *t, clock_time_t interval)
Set a timer.
#define NULL
The null pointer.
process_event_t process_alloc_event(void)
Allocate a global event number.
#define PROCESS_THREAD(name, ev, data)
Define the body of a process.
#define PROCESS_END()
Define the end of a process.
void i2c_enable(void)
Configure serial controller in I2C mode and set I2C speed.
Device drivers header file for adxl345 accelerometer in Zolertia Z1.
#define PROCESS_EXITHANDLER(handler)
Specify an action when a process exits.
#define PROCESS_POLLHANDLER(handler)
Specify an action when a process is polled.
#define PROCESS_WAIT_EVENT_UNTIL(c)
Wait for an event to be posted to the process, with an extra condition.
#define PROCESS(name, strname)
Declare a process.
void process_start(struct process *p, process_data_t data)
Start a process.
int timer_expired(struct timer *t)
Check if a timer has expired.
I2C communication device driver header file for Zolertia Z1 sensor node.