Simon Hawe / D7_MLX_AND_BAT

Dependencies:   X_NUCLEO_IKS01A1 MLX90614 d7a_1x wizzi-utils

Fork of D7A_1x_demo_sensors_OS5 by WizziLab

Committer:
Jeej
Date:
Wed Feb 08 15:59:12 2017 +0000
Revision:
12:6a1158950a9e
Parent:
9:25180d6a4c3a
Parent:
11:7938e138cb7a
Child:
14:c652f8f098e2
Integrated LSM303C.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jeej 0:7e1fdc4d6e1c 1 // This project is a demo of the DASH7 1.x stack
Jeej 0:7e1fdc4d6e1c 2 // @autor: jeremie@wizzilab.com
Jeej 0:7e1fdc4d6e1c 3 // @date: 2016-12-20
Jeej 0:7e1fdc4d6e1c 4 //
Jeej 0:7e1fdc4d6e1c 5 // ----- SETUP -----
Jeej 0:7e1fdc4d6e1c 6 // This programm has been tested with the following hardware:
Jeej 0:7e1fdc4d6e1c 7 // --> NUCLEO-L152RE + DASH7 enabled SHIELD_SP1ML_v1.0
Jeej 0:7e1fdc4d6e1c 8 // For this demo to work, you need the previously described hardware.
Jeej 0:7e1fdc4d6e1c 9 // A DASH7 1.x gateway have to be available in your area in order to retreive the data.
Jeej 0:7e1fdc4d6e1c 10 //
Jeej 0:7e1fdc4d6e1c 11 // ----- FILE SYSTEM -----
Jeej 0:7e1fdc4d6e1c 12 // DASH7 is a file system based protocol. You read and write in files that are present on your device or your modem.
Jeej 0:7e1fdc4d6e1c 13 // Some callbacks can be implemented by the user for allowing the stack to acceed the local file system. (See description of the callbacks for more details)
Jeej 0:7e1fdc4d6e1c 14 // The file system is user defined and can be changed to fit your needs.
Jeej 0:7e1fdc4d6e1c 15 // This demo uses a simple RAM file system.
Jeej 0:7e1fdc4d6e1c 16 // The files are defined in files.h
Jeej 0:7e1fdc4d6e1c 17 // The files values are initialized in files.cpp
Jeej 0:7e1fdc4d6e1c 18 //
Jeej 0:7e1fdc4d6e1c 19 // ----- SENSORS -----
Jeej 0:7e1fdc4d6e1c 20 // The sensors can be simulated (random data).
Jeej 0:7e1fdc4d6e1c 21 //
Jeej 0:7e1fdc4d6e1c 22 // ----- DEMO -----
Jeej 0:7e1fdc4d6e1c 23 // This demo starts 7 threads (one for each sensor value) that will periodically read the sensor value
Jeej 0:7e1fdc4d6e1c 24 // and depending on the sensor configuration file, will send the data to the DASH7 network (notification)
Jeej 0:7e1fdc4d6e1c 25 // You can also report the alarm status by pushing the board's button (blue)
Jeej 0:7e1fdc4d6e1c 26 //
Jeej 0:7e1fdc4d6e1c 27 // ----- DEBUG -----
Jeej 0:7e1fdc4d6e1c 28 // Several debugging options are available in wizzi-utils/dbg/dbg.h
Jeej 0:7e1fdc4d6e1c 29 // An ASSERT is a fatal error. By default, this error will reboot the device.
Jeej 0:7e1fdc4d6e1c 30
Jeej 0:7e1fdc4d6e1c 31 #include "mbed.h"
Jeej 0:7e1fdc4d6e1c 32 #include "rtos.h"
Jeej 0:7e1fdc4d6e1c 33 #include "rtos_idle.h"
Jeej 0:7e1fdc4d6e1c 34 #include "d7a.h"
Jeej 0:7e1fdc4d6e1c 35 #include "sensors.h"
Jeej 0:7e1fdc4d6e1c 36 #include "simul.h"
Jeej 0:7e1fdc4d6e1c 37 #include "dbg.h"
Jeej 0:7e1fdc4d6e1c 38 #include "DebouncedInterrupt.h"
Jeej 0:7e1fdc4d6e1c 39 #include "files.h"
Jeej 0:7e1fdc4d6e1c 40
yordan 9:25180d6a4c3a 41 // -----------------------------------------------
yordan 9:25180d6a4c3a 42 // TARGET Options
yordan 9:25180d6a4c3a 43 // -----------------------------------------------
yordan 9:25180d6a4c3a 44 #if defined(TARGET_STM32L152RE)
yordan 9:25180d6a4c3a 45 // Enable this if a IKS01A1 shield is connected
yordan 9:25180d6a4c3a 46 // #define TARGET_HAS_IKS01A1
yordan 9:25180d6a4c3a 47 #elif defined(TARGET_STM32L432KC)
yordan 9:25180d6a4c3a 48 // Enable this if WISENSE2 is populated with LSM303C (instead of LSM303AGR)
yordan 9:25180d6a4c3a 49 #define TARGET_HAS_LSM303C
yordan 9:25180d6a4c3a 50 #endif
yordan 8:01f0225408cf 51
Jeej 1:711fb7d8127b 52 #if defined(TARGET_STM32L152RE)
yordan 8:01f0225408cf 53
yordan 8:01f0225408cf 54 // -----------------------------------------------
yordan 8:01f0225408cf 55 // Hardware configuration for sh2001 / sh2030
yordan 8:01f0225408cf 56 // -----------------------------------------------
Jeej 1:711fb7d8127b 57 #define D7A_PIN_TX (D10)
Jeej 1:711fb7d8127b 58 #define D7A_PIN_RX (D2)
Jeej 1:711fb7d8127b 59 #define D7A_PIN_RTS (D13)
Jeej 1:711fb7d8127b 60 #define D7A_PIN_CTS (D9)
Jeej 1:711fb7d8127b 61 #define D7A_PIN_RESET (A3)
Jeej 3:5f2917933ece 62 #define DEBUG_LED (NC)
Jeej 3:5f2917933ece 63 #define DEBUG_BUTTON (USER_BUTTON)
yordan 7:8de29807f970 64 #define SENSOR_I2C_SDA (D14)
yordan 7:8de29807f970 65 #define SENSOR_I2C_SCL (D15)
yordan 8:01f0225408cf 66
yordan 8:01f0225408cf 67 // -----------------------------------------------
yordan 8:01f0225408cf 68 // Select the sensors
yordan 8:01f0225408cf 69 // -1 : disable, 0 : simu, 1 : hardware
yordan 8:01f0225408cf 70 // -----------------------------------------------
yordan 8:01f0225408cf 71 #ifdef TARGET_HAS_IKS01A1
yordan 8:01f0225408cf 72 // use all sensors from IKS01A1 shield for Nucleo-64
yordan 8:01f0225408cf 73 #define _MAG_EN_ (1)
yordan 8:01f0225408cf 74 #define _ACC_EN_ (1)
yordan 8:01f0225408cf 75 #define _GYR_EN_ (1)
yordan 8:01f0225408cf 76 #define _PRE_EN_ (1)
yordan 8:01f0225408cf 77 #define _HUM_EN_ (1)
yordan 8:01f0225408cf 78 #define _TEM1_EN_ (1)
yordan 8:01f0225408cf 79 #define _TEM2_EN_ (1)
yordan 8:01f0225408cf 80 #else
yordan 8:01f0225408cf 81 // simulate sensors
yordan 8:01f0225408cf 82 #define _MAG_EN_ (0)
yordan 8:01f0225408cf 83 #define _ACC_EN_ (0)
yordan 8:01f0225408cf 84 #define _GYR_EN_ (0)
yordan 8:01f0225408cf 85 #define _PRE_EN_ (0)
yordan 8:01f0225408cf 86 #define _HUM_EN_ (0)
yordan 8:01f0225408cf 87 #define _TEM1_EN_ (0)
yordan 8:01f0225408cf 88 #define _TEM2_EN_ (0)
yordan 8:01f0225408cf 89 #endif // TARGET_HAS_IKS01A1
yordan 8:01f0225408cf 90
Jeej 1:711fb7d8127b 91 #elif defined(TARGET_STM32L432KC)
yordan 8:01f0225408cf 92
yordan 8:01f0225408cf 93 // -----------------------------------------------
yordan 8:01f0225408cf 94 // Hardware configuration for sh2050
yordan 8:01f0225408cf 95 // -----------------------------------------------
Jeej 1:711fb7d8127b 96 #define D7A_PIN_TX (D5)
Jeej 1:711fb7d8127b 97 #define D7A_PIN_RX (D4)
Jeej 1:711fb7d8127b 98 #define D7A_PIN_RTS (D11)
Jeej 1:711fb7d8127b 99 #define D7A_PIN_CTS (D10)
Jeej 1:711fb7d8127b 100 #define D7A_PIN_RESET (D12)
Jeej 3:5f2917933ece 101 #define DEBUG_LED (D13) // LED1
yordan 5:ef4b5c422d3a 102 #define DEBUG_BUTTON (D9)
yordan 7:8de29807f970 103 #define SENSOR_I2C_SDA (D0)
yordan 7:8de29807f970 104 #define SENSOR_I2C_SCL (D1)
yordan 8:01f0225408cf 105 #define SENSOR_LIGHT_EN (A1)
yordan 8:01f0225408cf 106 #define SENSOR_LIGHT_MEAS (A4)
yordan 8:01f0225408cf 107
yordan 8:01f0225408cf 108 // -----------------------------------------------
yordan 8:01f0225408cf 109 // Select the sensors available on the sh2050
yordan 8:01f0225408cf 110 // -1 : disable, 0 : simu, 1 : hardware
yordan 8:01f0225408cf 111 // -----------------------------------------------
Jeej 11:7938e138cb7a 112 #define _MAG_EN_ (1)
Jeej 11:7938e138cb7a 113 #define _ACC_EN_ (1)
yordan 8:01f0225408cf 114 #define _PRE_EN_ (1)
yordan 8:01f0225408cf 115 #define _HUM_EN_ (1)
yordan 8:01f0225408cf 116 #define _TEM1_EN_ (1)
yordan 8:01f0225408cf 117 #define _TEM2_EN_ (1)
yordan 8:01f0225408cf 118 #define _LIGHT_EN_ (1)
yordan 8:01f0225408cf 119
yordan 8:01f0225408cf 120 // -----------------------------------------------
yordan 8:01f0225408cf 121 // Hardware I/O
yordan 8:01f0225408cf 122 // -----------------------------------------------
yordan 8:01f0225408cf 123 AnalogIn g_light_meas(SENSOR_LIGHT_MEAS);
yordan 9:25180d6a4c3a 124 DigitalOut g_light_en_l(SENSOR_LIGHT_EN);
yordan 8:01f0225408cf 125
Jeej 1:711fb7d8127b 126 #else
Jeej 1:711fb7d8127b 127 #error "Please choose or add the right platform."
Jeej 1:711fb7d8127b 128 #endif
Jeej 1:711fb7d8127b 129
yordan 7:8de29807f970 130 // Enable DBG led blinking (ms)
Jeej 11:7938e138cb7a 131 #define DGB_LED_BLINK_PERIOD (200)
yordan 7:8de29807f970 132
yordan 8:01f0225408cf 133 // Defaults
yordan 8:01f0225408cf 134 #ifndef _MAG_EN_
yordan 8:01f0225408cf 135 #define _MAG_EN_ (-1)
yordan 8:01f0225408cf 136 #endif // _MAG_EN_
yordan 8:01f0225408cf 137 #ifndef _ACC_EN_
yordan 8:01f0225408cf 138 #define _ACC_EN_ (-1)
yordan 8:01f0225408cf 139 #endif // _ACC_EN_
yordan 8:01f0225408cf 140 #ifndef _GYR_EN_
yordan 8:01f0225408cf 141 #define _GYR_EN_ (-1)
yordan 8:01f0225408cf 142 #endif // _GYR_EN_
yordan 8:01f0225408cf 143 #ifndef _PRE_EN_
yordan 8:01f0225408cf 144 #define _PRE_EN_ (-1)
yordan 8:01f0225408cf 145 #endif // _PRE_EN_
yordan 8:01f0225408cf 146 #ifndef _HUM_EN_
yordan 8:01f0225408cf 147 #define _HUM_EN_ (-1)
yordan 8:01f0225408cf 148 #endif // _HUM_EN_
yordan 8:01f0225408cf 149 #ifndef _TEM1_EN_
yordan 8:01f0225408cf 150 #define _TEM1_EN_ (-1)
yordan 8:01f0225408cf 151 #endif // _TEM1_EN_
yordan 8:01f0225408cf 152 #ifndef _TEM2_EN_
yordan 8:01f0225408cf 153 #define _TEM2_EN_ (-1)
yordan 8:01f0225408cf 154 #endif // _TEM2_EN_
yordan 8:01f0225408cf 155 #ifndef _LIGHT_EN_
yordan 8:01f0225408cf 156 #define _LIGHT_EN_ (-1)
yordan 8:01f0225408cf 157 #endif // _LIGHT_EN_
yordan 7:8de29807f970 158
yordan 7:8de29807f970 159
Jeej 0:7e1fdc4d6e1c 160 Semaphore button_user(0);
Jeej 0:7e1fdc4d6e1c 161 Semaphore thread_ready(0);
Jeej 0:7e1fdc4d6e1c 162
Jeej 0:7e1fdc4d6e1c 163 // Interrupt Service Routine on button press.
Jeej 0:7e1fdc4d6e1c 164 void button_push_isr( void )
Jeej 0:7e1fdc4d6e1c 165 {
Jeej 0:7e1fdc4d6e1c 166 button_user.release();
Jeej 0:7e1fdc4d6e1c 167 }
Jeej 0:7e1fdc4d6e1c 168
Jeej 0:7e1fdc4d6e1c 169 // file modified queue
Jeej 0:7e1fdc4d6e1c 170 Queue<void, 8> fm_queue;
Jeej 0:7e1fdc4d6e1c 171
Jeej 0:7e1fdc4d6e1c 172 // -----------------------------------------------
Jeej 0:7e1fdc4d6e1c 173 // callbacks
Jeej 0:7e1fdc4d6e1c 174 // -----------------------------------------------
Jeej 0:7e1fdc4d6e1c 175 /**
Jeej 0:7e1fdc4d6e1c 176 Write data into a file.
Jeej 0:7e1fdc4d6e1c 177
Jeej 0:7e1fdc4d6e1c 178 @param const uint8_t File ID
Jeej 0:7e1fdc4d6e1c 179 @param const uint16_t Offset from start of data
Jeej 0:7e1fdc4d6e1c 180 @param const uint16_t Size of data to be written
Jeej 0:7e1fdc4d6e1c 181 @param const uint8_t* const Pointer to the data to write
Jeej 0:7e1fdc4d6e1c 182 @return uint32_t Size of written data
Jeej 0:7e1fdc4d6e1c 183 */
Jeej 0:7e1fdc4d6e1c 184 uint32_t write_file_callback(const uint8_t file_id,
Jeej 0:7e1fdc4d6e1c 185 const uint16_t offset,
Jeej 0:7e1fdc4d6e1c 186 const uint16_t size,
Jeej 0:7e1fdc4d6e1c 187 const uint8_t* const content)
Jeej 0:7e1fdc4d6e1c 188 {
Jeej 0:7e1fdc4d6e1c 189 uint32_t ret = 0;
Jeej 0:7e1fdc4d6e1c 190
Jeej 0:7e1fdc4d6e1c 191 IPRINT("Write file %d offset:%d size:%d\r\n", file_id, offset, size);
Jeej 0:7e1fdc4d6e1c 192
Jeej 0:7e1fdc4d6e1c 193 ret = fs_write_file(file_id, offset, size, content);
Jeej 0:7e1fdc4d6e1c 194
Jeej 0:7e1fdc4d6e1c 195 WARNING(ret, "File %d not found\r\n", file_id);
Jeej 0:7e1fdc4d6e1c 196
Jeej 0:7e1fdc4d6e1c 197 // Indicate that the file has been modified
Jeej 0:7e1fdc4d6e1c 198 fm_queue.put((void*)file_id);
Jeej 0:7e1fdc4d6e1c 199
Jeej 0:7e1fdc4d6e1c 200 return ret;
Jeej 0:7e1fdc4d6e1c 201 }
Jeej 0:7e1fdc4d6e1c 202
Jeej 0:7e1fdc4d6e1c 203 /**
Jeej 0:7e1fdc4d6e1c 204 Read data from a file.
Jeej 0:7e1fdc4d6e1c 205
Jeej 0:7e1fdc4d6e1c 206 @param const uint8_t File ID
Jeej 0:7e1fdc4d6e1c 207 @param const uint16_t Offset from start of data
Jeej 0:7e1fdc4d6e1c 208 @param const uint16_t Size of data to be read
Jeej 0:7e1fdc4d6e1c 209 @param const uint8_t* const Pointer to the reading buffer
Jeej 0:7e1fdc4d6e1c 210 @return uint32_t Size of read data
Jeej 0:7e1fdc4d6e1c 211 */
Jeej 0:7e1fdc4d6e1c 212 uint32_t read_file_callback(const uint8_t file_id,
Jeej 0:7e1fdc4d6e1c 213 const uint16_t offset,
Jeej 0:7e1fdc4d6e1c 214 const uint16_t size,
Jeej 0:7e1fdc4d6e1c 215 uint8_t* buf)
Jeej 0:7e1fdc4d6e1c 216 {
Jeej 0:7e1fdc4d6e1c 217 uint32_t ret = 0;
Jeej 0:7e1fdc4d6e1c 218
Jeej 0:7e1fdc4d6e1c 219 IPRINT("Read file %d offset:%d size:%d\r\n", file_id, offset, size);
Jeej 0:7e1fdc4d6e1c 220
Jeej 0:7e1fdc4d6e1c 221 ret = fs_read_file(file_id, offset, size, buf);
Jeej 0:7e1fdc4d6e1c 222
Jeej 0:7e1fdc4d6e1c 223 WARNING(ret, "File %d not found\r\n", file_id);
Jeej 0:7e1fdc4d6e1c 224
Jeej 0:7e1fdc4d6e1c 225 return ret;
Jeej 0:7e1fdc4d6e1c 226 }
Jeej 0:7e1fdc4d6e1c 227
Jeej 0:7e1fdc4d6e1c 228 /**
Jeej 0:7e1fdc4d6e1c 229 Called when a notification is finished
Jeej 0:7e1fdc4d6e1c 230
Jeej 0:7e1fdc4d6e1c 231 @param const uint8_t File ID
Jeej 0:7e1fdc4d6e1c 232 @param const uint8_t Error code
Jeej 0:7e1fdc4d6e1c 233 @return void
Jeej 0:7e1fdc4d6e1c 234 */
Jeej 0:7e1fdc4d6e1c 235 void notif_done_callback(const uint8_t file_id, const uint8_t error)
Jeej 0:7e1fdc4d6e1c 236 {
Jeej 0:7e1fdc4d6e1c 237 PRINT("Notif FID %d done. err %d\r\n", file_id, error);
Jeej 0:7e1fdc4d6e1c 238 }
Jeej 0:7e1fdc4d6e1c 239
Jeej 0:7e1fdc4d6e1c 240 void unsolicited_callback(d7a_msg_t** uns)
Jeej 0:7e1fdc4d6e1c 241 {
Jeej 0:7e1fdc4d6e1c 242 PRINT("UNSOLICITED MESSAGE:\r\n");
Jeej 0:7e1fdc4d6e1c 243 d7a_print_msg(uns);
Jeej 0:7e1fdc4d6e1c 244 d7a_free_msg(uns);
Jeej 0:7e1fdc4d6e1c 245 }
Jeej 0:7e1fdc4d6e1c 246
Jeej 0:7e1fdc4d6e1c 247 // callbacks structure
Jeej 0:7e1fdc4d6e1c 248 const d7a_callbacks_t callbacks = {
Jeej 0:7e1fdc4d6e1c 249 .write_file = write_file_callback, // If NULL you cannot declare files
Jeej 0:7e1fdc4d6e1c 250 .read_file = read_file_callback, // If NULL you cannot declare files
Jeej 0:7e1fdc4d6e1c 251 .notif_done = notif_done_callback,
Jeej 0:7e1fdc4d6e1c 252 .unsolicited_msg = unsolicited_callback,
Jeej 0:7e1fdc4d6e1c 253 };
Jeej 0:7e1fdc4d6e1c 254
Jeej 0:7e1fdc4d6e1c 255 // Com configuration for the DASH7 shield
Jeej 0:7e1fdc4d6e1c 256 const d7a_com_config_t shield_config = {
Jeej 1:711fb7d8127b 257 .tx = D7A_PIN_TX,
Jeej 1:711fb7d8127b 258 .rx = D7A_PIN_RX,
Jeej 1:711fb7d8127b 259 .rts = D7A_PIN_RTS,
Jeej 1:711fb7d8127b 260 .cts = D7A_PIN_CTS,
Jeej 0:7e1fdc4d6e1c 261 };
Jeej 0:7e1fdc4d6e1c 262
Jeej 0:7e1fdc4d6e1c 263 // Check parameters to see if data should be send
Jeej 0:7e1fdc4d6e1c 264 static bool report_needed(sensor_config_t* cfg, int32_t value, int32_t last_value, uint32_t last_report_time)
Jeej 0:7e1fdc4d6e1c 265 {
Jeej 0:7e1fdc4d6e1c 266 switch (cfg->report_type)
Jeej 0:7e1fdc4d6e1c 267 {
Jeej 0:7e1fdc4d6e1c 268 case REPORT_ALWAYS:
Jeej 0:7e1fdc4d6e1c 269 // Send a report at each measure
Jeej 0:7e1fdc4d6e1c 270 IPRINT("Notif cause 1\r\n");
Jeej 0:7e1fdc4d6e1c 271 return true;
Jeej 0:7e1fdc4d6e1c 272 case REPORT_ON_DIFFERENCE:
Jeej 0:7e1fdc4d6e1c 273 // Send a report when the difference between the last reported measure and the current mesure is greater than max_diff
Jeej 0:7e1fdc4d6e1c 274 if (abs(last_value - value) >= cfg->max_diff)
Jeej 0:7e1fdc4d6e1c 275 {
Jeej 0:7e1fdc4d6e1c 276 IPRINT("Notif cause 2 last:%d new:%d max_diff:%d\r\n", last_value, value, cfg->max_diff);
Jeej 0:7e1fdc4d6e1c 277 return true;
Jeej 0:7e1fdc4d6e1c 278 }
Jeej 0:7e1fdc4d6e1c 279 break;
Jeej 0:7e1fdc4d6e1c 280 case REPORT_ON_THRESHOLD:
Jeej 0:7e1fdc4d6e1c 281 // Send a report when crossing a threshold
Jeej 0:7e1fdc4d6e1c 282 if ( (value >= cfg->threshold_high && last_value < cfg->threshold_high)
Jeej 0:7e1fdc4d6e1c 283 || (value <= cfg->threshold_low && last_value > cfg->threshold_low)
Jeej 0:7e1fdc4d6e1c 284 || (value < cfg->threshold_high && last_value >= cfg->threshold_high)
Jeej 0:7e1fdc4d6e1c 285 || (value > cfg->threshold_low && last_value <= cfg->threshold_low))
Jeej 0:7e1fdc4d6e1c 286 {
Jeej 0:7e1fdc4d6e1c 287 IPRINT("Notif cause 3 last:%d new:%d th:%d tl:%d\r\n", last_value, value, cfg->threshold_high, cfg->threshold_low);
Jeej 0:7e1fdc4d6e1c 288 return true;
Jeej 0:7e1fdc4d6e1c 289 }
Jeej 0:7e1fdc4d6e1c 290 break;
Jeej 0:7e1fdc4d6e1c 291 default:
Jeej 0:7e1fdc4d6e1c 292 break;
Jeej 0:7e1fdc4d6e1c 293 }
Jeej 0:7e1fdc4d6e1c 294
Jeej 0:7e1fdc4d6e1c 295 // Send a report if it's been more than max_period since the last report
Jeej 0:7e1fdc4d6e1c 296 if (((last_report_time/1000) >= cfg->max_period) && (cfg->max_period != 0))
Jeej 0:7e1fdc4d6e1c 297 {
Jeej 0:7e1fdc4d6e1c 298 IPRINT("Notif cause 4 max_period:%d time:%d\r\n", cfg->max_period, last_report_time);
Jeej 0:7e1fdc4d6e1c 299 return true;
Jeej 0:7e1fdc4d6e1c 300 }
Jeej 0:7e1fdc4d6e1c 301
Jeej 0:7e1fdc4d6e1c 302 return false;
Jeej 0:7e1fdc4d6e1c 303 }
Jeej 0:7e1fdc4d6e1c 304
yordan 7:8de29807f970 305 // -----------------------------------------------
yordan 7:8de29807f970 306 // Sensor Threads
yordan 7:8de29807f970 307 // -----------------------------------------------
yordan 7:8de29807f970 308 typedef struct
yordan 7:8de29807f970 309 {
yordan 7:8de29807f970 310 // Number of data fields
yordan 7:8de29807f970 311 uint32_t nb_values;
yordan 7:8de29807f970 312 // Total size of data
yordan 7:8de29807f970 313 uint32_t data_size;
yordan 7:8de29807f970 314 // Read value function
yordan 7:8de29807f970 315 bool (*read_value)(int32_t*);
yordan 7:8de29807f970 316 // Last reported value
yordan 7:8de29807f970 317 int32_t* last_report_value;
yordan 7:8de29807f970 318 // Current measured value
yordan 7:8de29807f970 319 int32_t* current_value;
yordan 7:8de29807f970 320
yordan 7:8de29807f970 321 // File ID of the sensor value file
yordan 7:8de29807f970 322 uint8_t value_file_id;
yordan 7:8de29807f970 323 // Sensor configuration file ID
yordan 7:8de29807f970 324 uint8_t cfg_file_id;
yordan 7:8de29807f970 325 // Sensor configuration context
yordan 7:8de29807f970 326 sensor_config_t cfg;
yordan 7:8de29807f970 327
yordan 7:8de29807f970 328 } sensor_thread_ctx_t;
yordan 7:8de29807f970 329
yordan 7:8de29807f970 330 sensor_thread_ctx_t* g_thread_ctx;
yordan 7:8de29807f970 331
yordan 7:8de29807f970 332 // Initialisation of the sensor thread's context
yordan 7:8de29807f970 333 #define SENSOR_THREAD_CTX(_name,_vfid,_cfid,_read_func,_nb_values) \
yordan 7:8de29807f970 334 int32_t _name##_last_report[_nb_values];\
yordan 7:8de29807f970 335 int32_t _name##_current_value[_nb_values];\
yordan 7:8de29807f970 336 sensor_thread_ctx_t _name##_thread_ctx = {\
yordan 7:8de29807f970 337 .nb_values = _nb_values,\
yordan 7:8de29807f970 338 .data_size = _nb_values * sizeof(int32_t),\
yordan 7:8de29807f970 339 .read_value = _read_func,\
yordan 7:8de29807f970 340 .last_report_value = (int32_t*)&_name##_last_report,\
yordan 7:8de29807f970 341 .current_value = (int32_t*)&_name##_current_value,\
yordan 7:8de29807f970 342 .value_file_id = _vfid,\
yordan 7:8de29807f970 343 .cfg_file_id = _cfid\
yordan 7:8de29807f970 344 }
yordan 7:8de29807f970 345
yordan 7:8de29807f970 346 // Cal method
yordan 7:8de29807f970 347 #define CALL_METH(obj, meth, param, ret) ((obj == NULL) ? \
yordan 7:8de29807f970 348 ((*(param) = (ret)), 0) : \
yordan 7:8de29807f970 349 ((obj)->meth(param)) \
yordan 7:8de29807f970 350 )
yordan 7:8de29807f970 351
yordan 7:8de29807f970 352 __inline int32_t float2_to_int(float v)
yordan 7:8de29807f970 353 {
yordan 7:8de29807f970 354 return (int32_t)(v*100);
yordan 7:8de29807f970 355 }
yordan 8:01f0225408cf 356
yordan 7:8de29807f970 357 bool mag_get_value(int32_t* buf)
yordan 7:8de29807f970 358 {
yordan 8:01f0225408cf 359 #if (_MAG_EN_ == 0)
yordan 7:8de29807f970 360 return simul_sensor_value(buf, 3, -1900, 1900);
yordan 8:01f0225408cf 361 #elif (_MAG_EN_ == 1)
yordan 7:8de29807f970 362 return CALL_METH(magnetometer, Get_M_Axes, buf, 0)? true : false;
yordan 8:01f0225408cf 363 #else
yordan 8:01f0225408cf 364 return false;
yordan 7:8de29807f970 365 #endif
yordan 7:8de29807f970 366 }
yordan 8:01f0225408cf 367 SENSOR_THREAD_CTX(mag, MAG_VALUE_FILE_ID, MAG_CFG_FILE_ID, mag_get_value, 3);
yordan 8:01f0225408cf 368
yordan 7:8de29807f970 369
yordan 7:8de29807f970 370 bool acc_get_value(int32_t* buf)
yordan 7:8de29807f970 371 {
yordan 8:01f0225408cf 372 #if (_ACC_EN_ == 0)
yordan 7:8de29807f970 373 return simul_sensor_value(buf, 3, -1900, 1900);
yordan 8:01f0225408cf 374 #elif (_ACC_EN_ == 1)
yordan 7:8de29807f970 375 return CALL_METH(accelerometer, Get_X_Axes, buf, 0)? true : false;
yordan 8:01f0225408cf 376 #else
yordan 8:01f0225408cf 377 return false;
yordan 7:8de29807f970 378 #endif
yordan 7:8de29807f970 379 }
yordan 8:01f0225408cf 380 SENSOR_THREAD_CTX(acc, ACC_VALUE_FILE_ID, ACC_CFG_FILE_ID, acc_get_value, 3);
yordan 8:01f0225408cf 381
yordan 7:8de29807f970 382
yordan 7:8de29807f970 383 bool gyr_get_value(int32_t* buf)
yordan 7:8de29807f970 384 {
yordan 8:01f0225408cf 385 #if (_GYR_EN_ == 0)
yordan 7:8de29807f970 386 return simul_sensor_value(buf, 3, -40000, 40000);
yordan 8:01f0225408cf 387 #elif (_GYR_EN_ == 1)
yordan 7:8de29807f970 388 return CALL_METH(gyroscope, Get_G_Axes, buf, 0)? true : false;
yordan 8:01f0225408cf 389 #else
yordan 8:01f0225408cf 390 return false;
yordan 7:8de29807f970 391 #endif
yordan 7:8de29807f970 392 }
yordan 8:01f0225408cf 393 SENSOR_THREAD_CTX(gyr, GYR_VALUE_FILE_ID, GYR_CFG_FILE_ID, gyr_get_value, 3);
yordan 8:01f0225408cf 394
yordan 7:8de29807f970 395
yordan 7:8de29807f970 396 bool pre_get_value(int32_t* buf)
yordan 7:8de29807f970 397 {
yordan 8:01f0225408cf 398 #if (_PRE_EN_ == 0)
yordan 7:8de29807f970 399 return simul_sensor_value(buf, 1, 96000, 104000);
yordan 8:01f0225408cf 400 #elif (_PRE_EN_ == 1)
yordan 7:8de29807f970 401 bool err;
yordan 7:8de29807f970 402 float tmp;
yordan 7:8de29807f970 403 err = CALL_METH(pressure_sensor, GetPressure, &tmp, 0.0f)? true : false;
yordan 7:8de29807f970 404 buf[0] = float2_to_int(tmp);
yordan 7:8de29807f970 405 return err;
yordan 8:01f0225408cf 406 #else
yordan 8:01f0225408cf 407 return false;
yordan 7:8de29807f970 408 #endif
yordan 7:8de29807f970 409 }
yordan 8:01f0225408cf 410 SENSOR_THREAD_CTX(pre, PRE_VALUE_FILE_ID, PRE_CFG_FILE_ID, pre_get_value, 1);
yordan 8:01f0225408cf 411
yordan 7:8de29807f970 412
yordan 7:8de29807f970 413 bool hum_get_value(int32_t* buf)
yordan 7:8de29807f970 414 {
yordan 8:01f0225408cf 415 #if (_HUM_EN_ == 0)
yordan 7:8de29807f970 416 return simul_sensor_value(buf, 1, 1000, 9000);
yordan 8:01f0225408cf 417 #elif (_HUM_EN_ == 1)
yordan 7:8de29807f970 418 bool err;
yordan 7:8de29807f970 419 float tmp;
yordan 7:8de29807f970 420 err = CALL_METH(humidity_sensor, GetHumidity, &tmp, 0.0f)? true : false;
yordan 7:8de29807f970 421 buf[0] = float2_to_int(tmp);
yordan 7:8de29807f970 422 return err;
yordan 8:01f0225408cf 423 #else
yordan 8:01f0225408cf 424 return false;
yordan 7:8de29807f970 425 #endif
yordan 7:8de29807f970 426 }
yordan 8:01f0225408cf 427 SENSOR_THREAD_CTX(hum, HUM_VALUE_FILE_ID, HUM_CFG_FILE_ID, hum_get_value, 1);
yordan 7:8de29807f970 428
yordan 7:8de29807f970 429 bool tem1_get_value(int32_t* buf)
yordan 7:8de29807f970 430 {
yordan 8:01f0225408cf 431 #if (_TEM1_EN_ == 0)
yordan 7:8de29807f970 432 return simul_sensor_value(buf, 1, 1100, 3900);
yordan 8:01f0225408cf 433 #elif (_TEM1_EN_ == 1)
yordan 7:8de29807f970 434 bool err;
yordan 7:8de29807f970 435 float tmp;
yordan 7:8de29807f970 436 err = CALL_METH(temp_sensor1, GetTemperature, &tmp, 0.0f)? true : false;
yordan 8:01f0225408cf 437 buf[0] = float2_to_int(tmp);
yordan 7:8de29807f970 438 return err;
Jeej 12:6a1158950a9e 439 #else
Jeej 12:6a1158950a9e 440 return false;
yordan 7:8de29807f970 441 #endif
yordan 7:8de29807f970 442 }
yordan 8:01f0225408cf 443 SENSOR_THREAD_CTX(tem1, TEM1_VALUE_FILE_ID, TEM1_CFG_FILE_ID, tem1_get_value, 1);
yordan 8:01f0225408cf 444
yordan 7:8de29807f970 445
yordan 7:8de29807f970 446 bool tem2_get_value(int32_t* buf)
yordan 7:8de29807f970 447 {
yordan 8:01f0225408cf 448 #if (_TEM2_EN_ == 0)
yordan 7:8de29807f970 449 return simul_sensor_value(buf, 1, 5100, 10100);
yordan 8:01f0225408cf 450 #elif (_TEM2_EN_ == 1)
yordan 7:8de29807f970 451 bool err;
yordan 7:8de29807f970 452 float tmp;
yordan 7:8de29807f970 453 err = CALL_METH(temp_sensor2, GetFahrenheit, &tmp, 0.0f)? true : false;
yordan 7:8de29807f970 454 buf[0] = float2_to_int(tmp);
yordan 7:8de29807f970 455 return err;
yordan 8:01f0225408cf 456 #else
yordan 8:01f0225408cf 457 return false;
yordan 7:8de29807f970 458 #endif
yordan 7:8de29807f970 459 }
yordan 8:01f0225408cf 460 SENSOR_THREAD_CTX(tem2, TEM2_VALUE_FILE_ID, TEM2_CFG_FILE_ID, tem2_get_value, 1);
Jeej 0:7e1fdc4d6e1c 461
yordan 8:01f0225408cf 462
yordan 8:01f0225408cf 463 bool light_get_value(int32_t* buf)
yordan 8:01f0225408cf 464 {
yordan 8:01f0225408cf 465 #if (_LIGHT_EN_ == 0)
yordan 8:01f0225408cf 466 return simul_sensor_value(buf, 1, 0, 100);
yordan 8:01f0225408cf 467 #elif (_LIGHT_EN_ == 1)
yordan 8:01f0225408cf 468 float tmp;
yordan 9:25180d6a4c3a 469 g_light_en_l = 0;
yordan 8:01f0225408cf 470 Thread::wait(10);
yordan 8:01f0225408cf 471 tmp = g_light_meas;
yordan 9:25180d6a4c3a 472 g_light_en_l = 1;
yordan 8:01f0225408cf 473 buf[0] = float2_to_int(tmp);
yordan 8:01f0225408cf 474 return false;
yordan 8:01f0225408cf 475 #else
yordan 8:01f0225408cf 476 return false;
yordan 8:01f0225408cf 477 #endif
yordan 8:01f0225408cf 478 }
yordan 8:01f0225408cf 479 SENSOR_THREAD_CTX(light, LIGHT_VALUE_FILE_ID, LIGHT_CFG_FILE_ID, light_get_value, 1);
yordan 8:01f0225408cf 480
Jeej 0:7e1fdc4d6e1c 481
Jeej 0:7e1fdc4d6e1c 482 void sensor_thread()
Jeej 0:7e1fdc4d6e1c 483 {
Jeej 1:711fb7d8127b 484 FPRINT("(id:0x%08x)\r\n", osThreadGetId());
Jeej 1:711fb7d8127b 485
Jeej 0:7e1fdc4d6e1c 486 // Get thread context
Jeej 0:7e1fdc4d6e1c 487 sensor_thread_ctx_t* th_ctx = g_thread_ctx;
Jeej 4:8ac150ec1532 488
Jeej 0:7e1fdc4d6e1c 489 d7a_msg_t** resp = NULL;
Jeej 0:7e1fdc4d6e1c 490 uint32_t last_report_time = 0;
Jeej 0:7e1fdc4d6e1c 491
Jeej 0:7e1fdc4d6e1c 492 // Force a first notification
Jeej 0:7e1fdc4d6e1c 493 bool first_notif = true;
Jeej 0:7e1fdc4d6e1c 494
Jeej 0:7e1fdc4d6e1c 495 // Retrieve notification config from local file
Jeej 0:7e1fdc4d6e1c 496 fs_read_file(th_ctx->cfg_file_id, 0, sizeof(sensor_config_t), (uint8_t*)&(th_ctx->cfg));
Jeej 0:7e1fdc4d6e1c 497
Jeej 0:7e1fdc4d6e1c 498 // Declare the config file to allow it to be accessed via the modem
Jeej 0:7e1fdc4d6e1c 499 d7a_declare(th_ctx->cfg_file_id, VOLATILE, RW_RW, sizeof(sensor_config_t), sizeof(sensor_config_t));
Jeej 0:7e1fdc4d6e1c 500
Jeej 0:7e1fdc4d6e1c 501 // Create a file on the modem to store and notify the sensor value
Jeej 0:7e1fdc4d6e1c 502 d7a_create(th_ctx->value_file_id, VOLATILE, RW_R, th_ctx->data_size, th_ctx->data_size, D7A_NOTIFICATION_FULL, D7A_ITF_REPORT_CHECKED);
Jeej 0:7e1fdc4d6e1c 503
Jeej 4:8ac150ec1532 504 thread_ready.release();
Jeej 4:8ac150ec1532 505
Jeej 0:7e1fdc4d6e1c 506 while (true)
Jeej 0:7e1fdc4d6e1c 507 {
Jeej 0:7e1fdc4d6e1c 508 // Read the sensor values
Jeej 0:7e1fdc4d6e1c 509 bool err = th_ctx->read_value(th_ctx->current_value);
Jeej 0:7e1fdc4d6e1c 510
Jeej 1:711fb7d8127b 511 ASSERT(!err, "Failed to read sensor value for FID: %d\r\n", th_ctx->value_file_id);
Jeej 0:7e1fdc4d6e1c 512
Jeej 0:7e1fdc4d6e1c 513 // Check if data should be send
Jeej 0:7e1fdc4d6e1c 514 for (uint8_t i = 0; i < th_ctx->nb_values; i++)
Jeej 0:7e1fdc4d6e1c 515 {
Jeej 0:7e1fdc4d6e1c 516 if (report_needed(&(th_ctx->cfg),
Jeej 0:7e1fdc4d6e1c 517 th_ctx->current_value[i],
Jeej 0:7e1fdc4d6e1c 518 th_ctx->last_report_value[i],
Jeej 0:7e1fdc4d6e1c 519 last_report_time) || first_notif)
Jeej 0:7e1fdc4d6e1c 520 {
Jeej 0:7e1fdc4d6e1c 521 first_notif = false;
Jeej 0:7e1fdc4d6e1c 522
Jeej 0:7e1fdc4d6e1c 523 PRINT("NOTIFY %3d: ", th_ctx->value_file_id);
Jeej 0:7e1fdc4d6e1c 524 for (uint8_t i = 0; i < th_ctx->nb_values; i++)
Jeej 0:7e1fdc4d6e1c 525 {
Jeej 0:7e1fdc4d6e1c 526 PRINT("%9ld ", (int32_t)th_ctx->current_value[i]);
Jeej 0:7e1fdc4d6e1c 527 }
Jeej 0:7e1fdc4d6e1c 528 PRINT("\r\n");
Jeej 0:7e1fdc4d6e1c 529
Jeej 0:7e1fdc4d6e1c 530 // Send data to the modem
Jeej 0:7e1fdc4d6e1c 531 resp = d7a_write(th_ctx->value_file_id, 0, th_ctx->data_size, (uint8_t*)th_ctx->current_value);
Jeej 0:7e1fdc4d6e1c 532 d7a_free_msg(resp);
Jeej 0:7e1fdc4d6e1c 533
Jeej 0:7e1fdc4d6e1c 534 // Update last report value
Jeej 0:7e1fdc4d6e1c 535 memcpy(th_ctx->last_report_value, th_ctx->current_value, th_ctx->data_size);
Jeej 0:7e1fdc4d6e1c 536 // Reset last report time
Jeej 0:7e1fdc4d6e1c 537 last_report_time = 0;
Jeej 0:7e1fdc4d6e1c 538 break;
Jeej 0:7e1fdc4d6e1c 539 }
Jeej 0:7e1fdc4d6e1c 540 }
Jeej 0:7e1fdc4d6e1c 541
Jeej 0:7e1fdc4d6e1c 542 // Update last report time
Jeej 0:7e1fdc4d6e1c 543 last_report_time += th_ctx->cfg.period;
Jeej 0:7e1fdc4d6e1c 544
Jeej 0:7e1fdc4d6e1c 545 // Wait for period
Jeej 0:7e1fdc4d6e1c 546 Thread::wait(th_ctx->cfg.period);
Jeej 0:7e1fdc4d6e1c 547 }
Jeej 0:7e1fdc4d6e1c 548 }
Jeej 0:7e1fdc4d6e1c 549
Jeej 0:7e1fdc4d6e1c 550 void file_modified_thread()
Jeej 0:7e1fdc4d6e1c 551 {
Jeej 0:7e1fdc4d6e1c 552 FPRINT("(id:0x%08x)\r\n", osThreadGetId());
Jeej 0:7e1fdc4d6e1c 553
Jeej 0:7e1fdc4d6e1c 554 while (true)
Jeej 0:7e1fdc4d6e1c 555 {
Jeej 0:7e1fdc4d6e1c 556 // Wait for a file modified event
Jeej 0:7e1fdc4d6e1c 557 osEvent evt = fm_queue.get();
Jeej 0:7e1fdc4d6e1c 558
Jeej 0:7e1fdc4d6e1c 559 // Retrieve FID of modified file
Jeej 0:7e1fdc4d6e1c 560 uint8_t fid = (uint8_t)(uint32_t)evt.value.p;
Jeej 0:7e1fdc4d6e1c 561
Jeej 0:7e1fdc4d6e1c 562 PRINT("File %d has been modified\r\n", fid);
Jeej 0:7e1fdc4d6e1c 563
Jeej 0:7e1fdc4d6e1c 564 switch (fid)
Jeej 0:7e1fdc4d6e1c 565 {
Jeej 0:7e1fdc4d6e1c 566 // If a configuration file has been modified, update the context
Jeej 0:7e1fdc4d6e1c 567 case MAG_CFG_FILE_ID:
Jeej 0:7e1fdc4d6e1c 568 fs_read_file(fid, 0, sizeof(sensor_config_t), (uint8_t*)&(mag_thread_ctx.cfg));
Jeej 0:7e1fdc4d6e1c 569 break;
Jeej 0:7e1fdc4d6e1c 570 case ACC_CFG_FILE_ID:
Jeej 0:7e1fdc4d6e1c 571 fs_read_file(fid, 0, sizeof(sensor_config_t), (uint8_t*)&(acc_thread_ctx.cfg));
Jeej 0:7e1fdc4d6e1c 572 break;
Jeej 0:7e1fdc4d6e1c 573 case GYR_CFG_FILE_ID:
Jeej 0:7e1fdc4d6e1c 574 fs_read_file(fid, 0, sizeof(sensor_config_t), (uint8_t*)&(gyr_thread_ctx.cfg));
Jeej 0:7e1fdc4d6e1c 575 break;
Jeej 0:7e1fdc4d6e1c 576 case PRE_CFG_FILE_ID:
Jeej 0:7e1fdc4d6e1c 577 fs_read_file(fid, 0, sizeof(sensor_config_t), (uint8_t*)&(pre_thread_ctx.cfg));
Jeej 0:7e1fdc4d6e1c 578 break;
Jeej 0:7e1fdc4d6e1c 579 case HUM_CFG_FILE_ID:
Jeej 0:7e1fdc4d6e1c 580 fs_read_file(fid, 0, sizeof(sensor_config_t), (uint8_t*)&(hum_thread_ctx.cfg));
Jeej 0:7e1fdc4d6e1c 581 break;
Jeej 0:7e1fdc4d6e1c 582 case TEM1_CFG_FILE_ID:
Jeej 0:7e1fdc4d6e1c 583 fs_read_file(fid, 0, sizeof(sensor_config_t), (uint8_t*)&(tem1_thread_ctx.cfg));
Jeej 0:7e1fdc4d6e1c 584 break;
Jeej 0:7e1fdc4d6e1c 585 case TEM2_CFG_FILE_ID:
Jeej 0:7e1fdc4d6e1c 586 fs_read_file(fid, 0, sizeof(sensor_config_t), (uint8_t*)&(tem2_thread_ctx.cfg));
Jeej 0:7e1fdc4d6e1c 587 break;
yordan 8:01f0225408cf 588 case LIGHT_CFG_FILE_ID:
yordan 8:01f0225408cf 589 fs_read_file(fid, 0, sizeof(sensor_config_t), (uint8_t*)&(light_thread_ctx.cfg));
yordan 8:01f0225408cf 590 break;
Jeej 0:7e1fdc4d6e1c 591 default:
Jeej 0:7e1fdc4d6e1c 592 break;
Jeej 0:7e1fdc4d6e1c 593 }
Jeej 0:7e1fdc4d6e1c 594 }
Jeej 0:7e1fdc4d6e1c 595 }
Jeej 0:7e1fdc4d6e1c 596
Jeej 0:7e1fdc4d6e1c 597 void button_user_thread()
Jeej 0:7e1fdc4d6e1c 598 {
Jeej 0:7e1fdc4d6e1c 599 FPRINT("(id:0x%08x)\r\n", osThreadGetId());
Jeej 0:7e1fdc4d6e1c 600
Jeej 0:7e1fdc4d6e1c 601 uint8_t alarm = 255;
Jeej 0:7e1fdc4d6e1c 602 d7a_msg_t** resp = NULL;
Jeej 0:7e1fdc4d6e1c 603
Jeej 0:7e1fdc4d6e1c 604 // Create the alarm file
Jeej 0:7e1fdc4d6e1c 605 d7a_create(ALARM_FILE_ID, VOLATILE, RW_R, sizeof(uint8_t), sizeof(uint8_t), D7A_NOTIFICATION_FULL, D7A_ITF_SINGLE);
Jeej 0:7e1fdc4d6e1c 606
Jeej 0:7e1fdc4d6e1c 607 // Update it with the default value
Jeej 0:7e1fdc4d6e1c 608 resp = d7a_write(ALARM_FILE_ID, 0, sizeof(uint8_t), (uint8_t*)&alarm);
Jeej 0:7e1fdc4d6e1c 609 d7a_free_msg(resp);
Jeej 0:7e1fdc4d6e1c 610
Jeej 0:7e1fdc4d6e1c 611 while (true)
Jeej 0:7e1fdc4d6e1c 612 {
Jeej 0:7e1fdc4d6e1c 613 // Wait for button press
Jeej 0:7e1fdc4d6e1c 614 button_user.wait();
Jeej 0:7e1fdc4d6e1c 615
Jeej 0:7e1fdc4d6e1c 616 // Toggle alarm state
Jeej 0:7e1fdc4d6e1c 617 alarm = !alarm;
Jeej 0:7e1fdc4d6e1c 618
Jeej 0:7e1fdc4d6e1c 619 PRINT("BUTTON ALARM %d\r\n", alarm);
Jeej 0:7e1fdc4d6e1c 620 #if 1 // Switch between Notify and Distant Read/Write example
Jeej 0:7e1fdc4d6e1c 621
Jeej 0:7e1fdc4d6e1c 622 // Send alarm state to the modem
Jeej 0:7e1fdc4d6e1c 623 resp = d7a_write(ALARM_FILE_ID, 0, sizeof(uint8_t), (uint8_t*)&alarm);
Jeej 0:7e1fdc4d6e1c 624 WARNING(!resp[0]->err, "BUTTON ALARM ERR %d\r\n", resp[0]->err);
Jeej 0:7e1fdc4d6e1c 625 d7a_free_msg(resp);
Jeej 0:7e1fdc4d6e1c 626 #else
Jeej 0:7e1fdc4d6e1c 627 // Distant device that I want to acceed
Jeej 0:7e1fdc4d6e1c 628 #if 0 // Unicast / Broadcast
Jeej 0:7e1fdc4d6e1c 629 // Unicast
Jeej 0:7e1fdc4d6e1c 630 d7a_addressee_t target = {
Jeej 0:7e1fdc4d6e1c 631 // Access Class
Jeej 0:7e1fdc4d6e1c 632 .xcl.byte = D7A_XCL_ENDPOINT_NO,
Jeej 0:7e1fdc4d6e1c 633 // Type of security you want to use
Jeej 0:7e1fdc4d6e1c 634 .ctrl.bf.nls = D7A_NLS_AES_CCM_64,
Jeej 0:7e1fdc4d6e1c 635 // Type of ID
Jeej 0:7e1fdc4d6e1c 636 .ctrl.bf.idf = D7A_ID_UID,
Jeej 0:7e1fdc4d6e1c 637 // Device ID
Jeej 0:7e1fdc4d6e1c 638 .id = { 0x00, 0x1B, 0xC5, 0x0C, 0x70, 0x00, 0x07, 0xA3 },
Jeej 0:7e1fdc4d6e1c 639 };
Jeej 0:7e1fdc4d6e1c 640 #else
Jeej 0:7e1fdc4d6e1c 641 // Broadcast
Jeej 0:7e1fdc4d6e1c 642 d7a_addressee_t target = {
Jeej 0:7e1fdc4d6e1c 643 // Access Class
Jeej 0:7e1fdc4d6e1c 644 .xcl.byte = D7A_XCL_ENDPOINT_NO,
Jeej 0:7e1fdc4d6e1c 645 // Type of security you want to use
Jeej 0:7e1fdc4d6e1c 646 .ctrl.bf.nls = D7A_NLS_AES_CCM_64,
Jeej 0:7e1fdc4d6e1c 647 // Type of ID
Jeej 0:7e1fdc4d6e1c 648 .ctrl.bf.idf = D7A_ID_NBID,
Jeej 0:7e1fdc4d6e1c 649 // Maximum number of responses (1-32)
Jeej 0:7e1fdc4d6e1c 650 .id[0] = D7A_NBID(8),
Jeej 0:7e1fdc4d6e1c 651 };
Jeej 0:7e1fdc4d6e1c 652 #endif
Jeej 0:7e1fdc4d6e1c 653
Jeej 0:7e1fdc4d6e1c 654 #if 1 // Read / Write
Jeej 0:7e1fdc4d6e1c 655 // Read example
Jeej 0:7e1fdc4d6e1c 656 //resp = d7a_read(MAG_CFG_FILE_ID, 12, 5, &target, D7A_ITF_ONESHOT);
Jeej 0:7e1fdc4d6e1c 657 resp = d7a_read(ALARM_FILE_ID, 0, 1, NULL, &target, D7A_ITF_ONESHOT);
Jeej 0:7e1fdc4d6e1c 658 #else
Jeej 0:7e1fdc4d6e1c 659 // Write example
Jeej 0:7e1fdc4d6e1c 660 uint8_t v = 0x01;
Jeej 0:7e1fdc4d6e1c 661 resp = d7a_write(ALARM_FILE_ID, 0, 1, &v, NULL, &target, D7A_ITF_ONESHOT);
Jeej 0:7e1fdc4d6e1c 662 #endif
Jeej 0:7e1fdc4d6e1c 663 // Check received response(s)
Jeej 0:7e1fdc4d6e1c 664 d7a_print_msg(resp);
Jeej 0:7e1fdc4d6e1c 665
Jeej 0:7e1fdc4d6e1c 666 PRINT("Resp done.\r\n");
Jeej 0:7e1fdc4d6e1c 667 d7a_free_msg(resp);
Jeej 0:7e1fdc4d6e1c 668 #endif
Jeej 0:7e1fdc4d6e1c 669 }
Jeej 0:7e1fdc4d6e1c 670 }
Jeej 0:7e1fdc4d6e1c 671
Jeej 0:7e1fdc4d6e1c 672 /*** Main function ------------------------------------------------------------- ***/
Jeej 0:7e1fdc4d6e1c 673 int main()
Jeej 0:7e1fdc4d6e1c 674 {
yordan 8:01f0225408cf 675 // I/O defaults
yordan 8:01f0225408cf 676 #if defined(TARGET_STM32L152RE)
yordan 8:01f0225408cf 677 // xxx
yordan 8:01f0225408cf 678 #elif defined(TARGET_STM32L432KC)
yordan 9:25180d6a4c3a 679 // Disable light sensing
yordan 9:25180d6a4c3a 680 g_light_en_l = 1;
yordan 8:01f0225408cf 681 #else
yordan 8:01f0225408cf 682 #error "Unsupported target"
yordan 8:01f0225408cf 683 #endif
yordan 8:01f0225408cf 684
Jeej 0:7e1fdc4d6e1c 685 // Start & initialize
Jeej 3:5f2917933ece 686 DBG_OPEN(DEBUG_LED);
Jeej 0:7e1fdc4d6e1c 687 PRINT("\r\n--- Starting new run ---\r\n");
Jeej 0:7e1fdc4d6e1c 688
Jeej 0:7e1fdc4d6e1c 689 extern uint16_t const os_maxtaskrun;
Jeej 0:7e1fdc4d6e1c 690 //IPRINT("Max user threads: %d\r\n", os_maxtaskrun-1-9);
Jeej 0:7e1fdc4d6e1c 691
Jeej 1:711fb7d8127b 692 d7a_open(&shield_config, D7A_PIN_RESET, &callbacks);
Jeej 0:7e1fdc4d6e1c 693 d7a_modem_print_infos();
Jeej 0:7e1fdc4d6e1c 694
Jeej 0:7e1fdc4d6e1c 695 // Create the revision file for the Dash7board
Jeej 0:7e1fdc4d6e1c 696 d7a_create(65, PERMANENT, RW_R, sizeof(d7a_revision_t), sizeof(d7a_revision_t), D7A_NOTIFICATION_FULL, D7A_ITF_REPORT_CHECKED);
Jeej 0:7e1fdc4d6e1c 697 // Notify revision
Jeej 0:7e1fdc4d6e1c 698 d7a_msg_t** resp = d7a_write(65, 0, sizeof(d7a_revision_t), (uint8_t*)&f_dev_rev);
Jeej 0:7e1fdc4d6e1c 699 d7a_free_msg(resp);
Jeej 0:7e1fdc4d6e1c 700
Jeej 0:7e1fdc4d6e1c 701 uint32_t divider;
Jeej 0:7e1fdc4d6e1c 702
Jeej 0:7e1fdc4d6e1c 703 // Retreive the simulation parameter from local file
Jeej 0:7e1fdc4d6e1c 704 fs_read_file(SIMUL_FILE_ID, 0, sizeof(uint32_t), (uint8_t*)&divider);
Jeej 0:7e1fdc4d6e1c 705
Jeej 0:7e1fdc4d6e1c 706 // Update the simulation parameters
Jeej 0:7e1fdc4d6e1c 707 simul_update_param(divider);
Jeej 0:7e1fdc4d6e1c 708
Jeej 0:7e1fdc4d6e1c 709 // Declare the simulation parameter file
Jeej 0:7e1fdc4d6e1c 710 d7a_declare(SIMUL_FILE_ID, PERMANENT, RW_RW, sizeof(sensor_config_t), sizeof(sensor_config_t));
Jeej 0:7e1fdc4d6e1c 711
yordan 8:01f0225408cf 712 #if (_HUM_EN_ > 0 || _TEM1_EN_ > 0 || _MAG_EN_ > 0 || _ACC_EN_ > 0 || _GYR_EN_ > 0 || _PRE_EN_ > 0 || _TEM2_EN_ > 0)
yordan 8:01f0225408cf 713 // Open I2C and initialise the sensors
Jeej 11:7938e138cb7a 714 DevI2C ext_i2c(SENSOR_I2C_SDA, SENSOR_I2C_SCL);
yordan 8:01f0225408cf 715 #endif
yordan 8:01f0225408cf 716
yordan 8:01f0225408cf 717 #if (_HUM_EN_ > 0 || _TEM1_EN_ > 0)
Jeej 4:8ac150ec1532 718 humidity_sensor = new HTS221(ext_i2c);
Jeej 4:8ac150ec1532 719 ASSERT(Init_HTS221(humidity_sensor), "Failed to init HTS221\r\n");
Jeej 4:8ac150ec1532 720 temp_sensor1 = humidity_sensor;
Jeej 4:8ac150ec1532 721 #endif // _TEM_EN_
yordan 8:01f0225408cf 722 #if (_PRE_EN_ > 0 || _TEM2_EN_ > 0)
Jeej 4:8ac150ec1532 723 pressure_sensor = new LPS25H(ext_i2c);
Jeej 4:8ac150ec1532 724 ASSERT(Init_LPS25H(pressure_sensor), "Failed to init LPS25H\r\n");
Jeej 4:8ac150ec1532 725 temp_sensor2 = pressure_sensor;
Jeej 4:8ac150ec1532 726 #endif // _PRE_EN_
Jeej 0:7e1fdc4d6e1c 727
Jeej 11:7938e138cb7a 728 #if defined(TARGET_STM32L152RE)
Jeej 11:7938e138cb7a 729 #if (_MAG_EN_ > 0)
Jeej 11:7938e138cb7a 730 magnetometer = new LIS3MDL(ext_i2c);
Jeej 11:7938e138cb7a 731 ASSERT(Init_LIS3MDL(magnetometer), "Failed to init LIS3MDL\r\n");
Jeej 11:7938e138cb7a 732 #endif // _MAG_EN_
Jeej 11:7938e138cb7a 733 #if (_ACC_EN_ > 0 || _GYR_EN_ > 0)
Jeej 11:7938e138cb7a 734 accelerometer = new LSM6DS0(ext_i2c);
Jeej 11:7938e138cb7a 735 ASSERT(Init_LSM6DS0(accelerometer), "Failed to init LSM6DS0\r\n");
Jeej 11:7938e138cb7a 736 gyroscope = accelerometer;
Jeej 11:7938e138cb7a 737 #endif // _ACC_EN_ || _GYR_EN_
Jeej 11:7938e138cb7a 738 #elif defined(TARGET_STM32L432KC)
Jeej 11:7938e138cb7a 739 #if (_ACC_EN_ > 0)
Jeej 11:7938e138cb7a 740 accelerometer = new LSM303C_ACC_Sensor(ext_i2c);
Jeej 11:7938e138cb7a 741 ASSERT(Init_LSM303C_ACC(accelerometer), "Failed to init LSM303C_ACC\r\n");
Jeej 11:7938e138cb7a 742 #endif // _ACC_EN_
Jeej 11:7938e138cb7a 743 #if (_MAG_EN_ > 0)
Jeej 11:7938e138cb7a 744 magnetometer = new LSM303C_MAG_Sensor(ext_i2c);
Jeej 11:7938e138cb7a 745 ASSERT(Init_LSM303C_MAG(magnetometer), "Failed to init LSM303C_MAG\r\n");
Jeej 11:7938e138cb7a 746 #endif // _MAG_EN_
Jeej 11:7938e138cb7a 747 #endif
Jeej 11:7938e138cb7a 748
Jeej 0:7e1fdc4d6e1c 749 osStatus status;
Jeej 0:7e1fdc4d6e1c 750
Jeej 0:7e1fdc4d6e1c 751 // Start sensors threads
Jeej 1:711fb7d8127b 752 #define THREAD_START(_name) Thread _name##_th(osPriorityNormal, 1024, NULL);\
Jeej 0:7e1fdc4d6e1c 753 g_thread_ctx = &_name##_thread_ctx;\
Jeej 0:7e1fdc4d6e1c 754 status = _name##_th.start(sensor_thread);\
Jeej 1:711fb7d8127b 755 ASSERT(status == osOK, "Failed to start ##_name## thread (err: %d)\r\n", status);\
Jeej 0:7e1fdc4d6e1c 756 thread_ready.wait();
Jeej 0:7e1fdc4d6e1c 757
yordan 8:01f0225408cf 758 #if (_MAG_EN_ >= 0)
Jeej 0:7e1fdc4d6e1c 759 THREAD_START(mag);
Jeej 0:7e1fdc4d6e1c 760 #endif // _MAG_EN_
yordan 8:01f0225408cf 761 #if (_ACC_EN_ >= 0)
Jeej 0:7e1fdc4d6e1c 762 THREAD_START(acc);
Jeej 0:7e1fdc4d6e1c 763 #endif // _ACC_EN_
yordan 8:01f0225408cf 764 #if (_GYR_EN_ >= 0)
Jeej 0:7e1fdc4d6e1c 765 THREAD_START(gyr);
Jeej 0:7e1fdc4d6e1c 766 #endif // _GYR_EN_
yordan 8:01f0225408cf 767 #if (_PRE_EN_ >= 0)
Jeej 0:7e1fdc4d6e1c 768 THREAD_START(pre);
Jeej 0:7e1fdc4d6e1c 769 #endif // _PRE_EN_
yordan 8:01f0225408cf 770 #if (_HUM_EN_ >= 0)
Jeej 0:7e1fdc4d6e1c 771 THREAD_START(hum);
Jeej 0:7e1fdc4d6e1c 772 #endif // _HUM_EN_
yordan 8:01f0225408cf 773 #if (_TEM1_EN_ >= 0)
Jeej 0:7e1fdc4d6e1c 774 THREAD_START(tem1);
Jeej 0:7e1fdc4d6e1c 775 #endif // _TEM1_EN_
yordan 8:01f0225408cf 776 #if (_TEM2_EN_ >= 0)
Jeej 0:7e1fdc4d6e1c 777 THREAD_START(tem2);
Jeej 0:7e1fdc4d6e1c 778 #endif // _TEM2_EN_
yordan 8:01f0225408cf 779 #if (_LIGHT_EN_ >= 0)
yordan 8:01f0225408cf 780 THREAD_START(light);
yordan 8:01f0225408cf 781 #endif // _LIGHT_EN_
Jeej 0:7e1fdc4d6e1c 782
Jeej 0:7e1fdc4d6e1c 783 // File modified thread
Jeej 1:711fb7d8127b 784 Thread fm_th(osPriorityNormal, 512, NULL);
Jeej 1:711fb7d8127b 785 status = fm_th.start(file_modified_thread);
Jeej 1:711fb7d8127b 786 ASSERT(status == osOK, "Failed to start fm thread (err: %d)\r\n", status);
Jeej 0:7e1fdc4d6e1c 787
Jeej 1:711fb7d8127b 788 // For button
Jeej 3:5f2917933ece 789 #ifdef DEBUG_BUTTON
Jeej 3:5f2917933ece 790 DebouncedInterrupt user_interrupt(DEBUG_BUTTON);
yordan 5:ef4b5c422d3a 791 user_interrupt.attach(button_push_isr, IRQ_FALL, 500, true);
Jeej 1:711fb7d8127b 792
Jeej 1:711fb7d8127b 793 Thread but_th(osPriorityNormal, 512, NULL);
Jeej 1:711fb7d8127b 794 status = but_th.start(button_user_thread);
Jeej 1:711fb7d8127b 795 ASSERT(status == osOK, "Failed to start but thread (err: %d)\r\n", status);
Jeej 1:711fb7d8127b 796 #endif
yordan 5:ef4b5c422d3a 797
yordan 5:ef4b5c422d3a 798 #ifdef DGB_LED_BLINK_PERIOD
yordan 5:ef4b5c422d3a 799 DigitalOut my_led(DEBUG_LED);
yordan 5:ef4b5c422d3a 800 #endif
yordan 5:ef4b5c422d3a 801
Jeej 0:7e1fdc4d6e1c 802 // Set main task to lowest priority
Jeej 0:7e1fdc4d6e1c 803 osThreadSetPriority(osThreadGetId(), osPriorityIdle);
Jeej 0:7e1fdc4d6e1c 804 while(true)
Jeej 0:7e1fdc4d6e1c 805 {
yordan 5:ef4b5c422d3a 806 #ifdef DGB_LED_BLINK_PERIOD
Jeej 0:7e1fdc4d6e1c 807 // Wait to avoid beeing stuck in loop
yordan 6:55244aef7c67 808 Thread::wait(DGB_LED_BLINK_PERIOD);
yordan 5:ef4b5c422d3a 809 my_led = !my_led;
yordan 5:ef4b5c422d3a 810 #else
Jeej 3:5f2917933ece 811 Thread::wait(osWaitForever);
yordan 5:ef4b5c422d3a 812 #endif
Jeej 0:7e1fdc4d6e1c 813 }
Jeej 0:7e1fdc4d6e1c 814 }