Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: X_NUCLEO_IKS01A1 MLX90614 d7a_1x wizzi-utils
Fork of D7A_1x_demo_sensors_OS5 by
main.cpp@12:6a1158950a9e, 2017-02-08 (annotated)
- 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?
| User | Revision | Line number | New 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*)÷r); |
| 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 | } |
