paparazzi-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[paparazzi-commits] [4898] adding support for Lisa/L dual barometer


From: antoine drouin
Subject: [paparazzi-commits] [4898] adding support for Lisa/L dual barometer
Date: Sun, 02 May 2010 21:55:21 +0000

Revision: 4898
          http://svn.sv.gnu.org/viewvc/?view=rev&root=paparazzi&revision=4898
Author:   poine
Date:     2010-05-02 21:55:21 +0000 (Sun, 02 May 2010)
Log Message:
-----------
adding support for Lisa/L dual barometer

Added Paths:
-----------
    paparazzi3/trunk/sw/airborne/lisa/lisa_baro.c
    paparazzi3/trunk/sw/airborne/lisa/lisa_baro.h

Added: paparazzi3/trunk/sw/airborne/lisa/lisa_baro.c
===================================================================
--- paparazzi3/trunk/sw/airborne/lisa/lisa_baro.c                               
(rev 0)
+++ paparazzi3/trunk/sw/airborne/lisa/lisa_baro.c       2010-05-02 21:55:21 UTC 
(rev 4898)
@@ -0,0 +1,90 @@
+#include "lisa_baro.h"
+
+#include "i2c.h"
+
+static inline void baro_write_to_register(uint8_t baro_addr, uint8_t reg_addr, 
uint8_t val_msb, uint8_t val_lsb);
+static inline void baro_read_from_register(uint8_t baro_addr, uint8_t 
reg_addr);
+static inline void baro_set_current_register(uint8_t baro_addr, uint8_t 
reg_addr);
+static inline void baro_read_from_current_register(uint8_t baro_addr);
+
+struct LisaBaro baro;
+// absolute
+#define BARO_ABS_ADDR  0x90   
+// differential
+#define BARO_DIFF_ADDR 0x92
+
+void baro_init(void) {
+  baro.status = LBS_UNINITIALIZED;
+}
+
+void baro_periodic(void) {
+  // check i2c_done
+  switch (baro.status) {
+  case LBS_UNINITIALIZED:
+    baro_send_reset();
+    baro.status = LBS_RESETED;
+    break;
+  case LBS_RESETED:
+    baro_send_config_abs();
+    baro.status = LBS_INITIALIZING_ABS;
+    break;
+  case LBS_INITIALIZING_ABS:
+    baro_set_current_register(BARO_ABS_ADDR, 0x00);
+    baro.status = LBS_INITIALIZING_ABS_1;
+    break;
+  case LBS_INITIALIZING_ABS_1:
+    baro_send_config_diff();
+    baro.status = LBS_INITIALIZING_DIFF;
+    break;
+  case LBS_INITIALIZING_DIFF:
+    baro_set_current_register(BARO_DIFF_ADDR, 0x00);
+    baro.status = LBS_INITIALIZING_DIFF_1;
+    break;
+  case LBS_INITIALIZING_DIFF_1:
+  case LBS_READ_DIFF:
+    baro_read_from_current_register(BARO_ABS_ADDR);
+    baro.status = LBS_READING_ABS;
+    break;
+  case LBS_READ_ABS:
+    baro_read_from_current_register(BARO_DIFF_ADDR);
+    baro.status = LBS_READING_DIFF;
+    break;
+  default:
+    break;
+  }
+
+}
+
+void baro_send_reset(void) {
+  i2c2.buf[0] = 0x06;
+  i2c2_transmit(0x00, 1, &baro.i2c_done);
+}
+
+void baro_send_config_abs(void) {
+  baro_write_to_register(BARO_ABS_ADDR, 0x01, 0x86, 0x83);
+}
+
+void baro_send_config_diff(void) {
+  baro_write_to_register(BARO_DIFF_ADDR, 0x01, 0x84, 0x83);
+}
+
+static inline void baro_write_to_register(uint8_t baro_addr, uint8_t reg_addr, 
uint8_t val_msb, uint8_t val_lsb) {
+  i2c2.buf[0] = reg_addr;
+  i2c2.buf[1] = val_msb;
+  i2c2.buf[2] = val_lsb;
+  i2c2_transmit(baro_addr, 3, &baro.i2c_done);
+}
+
+static inline void baro_read_from_register(uint8_t baro_addr, uint8_t 
reg_addr) {
+  i2c2.buf[0] = reg_addr;
+  i2c2_transceive(baro_addr, 1, 2, &baro.i2c_done);
+}
+
+static inline void baro_set_current_register(uint8_t baro_addr, uint8_t 
reg_addr) {
+  i2c2.buf[0] = reg_addr;
+  i2c2_transmit(baro_addr, 1, &baro.i2c_done);
+}
+
+static inline void baro_read_from_current_register(uint8_t baro_addr) {
+  i2c2_receive(baro_addr, 2, &baro.i2c_done);
+}

Added: paparazzi3/trunk/sw/airborne/lisa/lisa_baro.h
===================================================================
--- paparazzi3/trunk/sw/airborne/lisa/lisa_baro.h                               
(rev 0)
+++ paparazzi3/trunk/sw/airborne/lisa/lisa_baro.h       2010-05-02 21:55:21 UTC 
(rev 4898)
@@ -0,0 +1,53 @@
+#ifndef LISA_BARO_H
+#define LISA_BARO_H
+
+#include <inttypes.h>
+
+enum LisaBaroStatus {
+  LBS_UNINITIALIZED, 
+  LBS_RESETED, 
+  LBS_INITIALIZING_ABS, 
+  LBS_INITIALIZING_ABS_1, 
+  LBS_INITIALIZING_DIFF, 
+  LBS_INITIALIZING_DIFF_1, 
+  LBS_IDLE,
+  LBS_READING_ABS,
+  LBS_READ_ABS,
+  LBS_READING_DIFF,
+  LBS_READ_DIFF
+};
+
+struct LisaBaro {
+  int16_t abs_raw;
+  int16_t diff_raw;
+  enum LisaBaroStatus status;
+  uint8_t i2c_done;
+};
+
+extern struct LisaBaro baro;
+
+extern void baro_init(void);
+extern void baro_periodic(void);
+
+extern void baro_send_reset(void);
+extern void baro_send_config_abs(void);
+extern void baro_send_config_diff(void);
+
+
+#define BaroEvent(_b_abs_handler, _b_diff_handler) {                   \
+    if (baro.status == LBS_READING_ABS && baro.i2c_done) {             \
+      baro.abs_raw = i2c2.buf[0]<<8 | i2c2.buf[1];                     \
+      baro.status = LBS_READ_ABS;                                      \
+      _b_abs_handler();                                                        
\
+    }                                                                  \
+    else  if (baro.status == LBS_READING_DIFF && baro.i2c_done) {      \
+      baro.diff_raw = i2c2.buf[0]<<8 | i2c2.buf[1];                    \
+      baro.status = LBS_READ_DIFF;                                     \
+      _b_diff_handler();                                               \
+    }                                                                  \
+  }
+
+
+#endif /* LISA_BARO_H */
+
+





reply via email to

[Prev in Thread] Current Thread [Next in Thread]