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@10:3d3dfc12f674, 2017-02-17 (annotated)
- Committer:
- shawe
- Date:
- Fri Feb 17 12:53:06 2017 +0000
- Revision:
- 10:3d3dfc12f674
- Parent:
- 9:25180d6a4c3a
- Child:
- 15:f8e5805c696c
first commit;
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" | 
| shawe | 10:3d3dfc12f674 | 40 | #include "MLX90614.h" | 
| shawe | 10:3d3dfc12f674 | 41 | #include "DevI2C.h" | 
| Jeej | 0:7e1fdc4d6e1c | 42 | |
| yordan | 8:01f0225408cf | 43 | |
| shawe | 10:3d3dfc12f674 | 44 | #define D7A_PIN_TX (D10) | 
| shawe | 10:3d3dfc12f674 | 45 | #define D7A_PIN_RX (D2) | 
| shawe | 10:3d3dfc12f674 | 46 | #define D7A_PIN_RTS (D13) | 
| shawe | 10:3d3dfc12f674 | 47 | #define D7A_PIN_CTS (D9) | 
| shawe | 10:3d3dfc12f674 | 48 | #define D7A_PIN_RESET (A3) | 
| shawe | 10:3d3dfc12f674 | 49 | #define DEBUG_LED (LED1) | 
| shawe | 10:3d3dfc12f674 | 50 | #define DEBUG_BUTTON (USER_BUTTON) | 
| shawe | 10:3d3dfc12f674 | 51 | #define SENSOR_I2C_SDA (D14) | 
| shawe | 10:3d3dfc12f674 | 52 | #define SENSOR_I2C_SCL (D15) | 
| yordan | 8:01f0225408cf | 53 | |
| shawe | 10:3d3dfc12f674 | 54 | #define _TEM1_EN_ (1) | 
| shawe | 10:3d3dfc12f674 | 55 | #define _VOLTAGE_EN_ (1) | 
| shawe | 10:3d3dfc12f674 | 56 | MLX90614 *temp_sensor1; | 
| yordan | 8:01f0225408cf | 57 | |
| yordan | 7:8de29807f970 | 58 | // Enable DBG led blinking (ms) | 
| yordan | 7:8de29807f970 | 59 | #define DGB_LED_BLINK_PERIOD (1000) | 
| yordan | 7:8de29807f970 | 60 | |
| shawe | 10:3d3dfc12f674 | 61 | #if (_VOLTAGE_EN_ == 1) | 
| shawe | 10:3d3dfc12f674 | 62 | AnalogIn volt_pin(A0); | 
| shawe | 10:3d3dfc12f674 | 63 | #endif | 
| yordan | 7:8de29807f970 | 64 | |
| Jeej | 0:7e1fdc4d6e1c | 65 | Semaphore button_user(0); | 
| Jeej | 0:7e1fdc4d6e1c | 66 | Semaphore thread_ready(0); | 
| Jeej | 0:7e1fdc4d6e1c | 67 | |
| Jeej | 0:7e1fdc4d6e1c | 68 | // Interrupt Service Routine on button press. | 
| Jeej | 0:7e1fdc4d6e1c | 69 | void button_push_isr( void ) | 
| Jeej | 0:7e1fdc4d6e1c | 70 | { | 
| Jeej | 0:7e1fdc4d6e1c | 71 | button_user.release(); | 
| Jeej | 0:7e1fdc4d6e1c | 72 | } | 
| Jeej | 0:7e1fdc4d6e1c | 73 | |
| Jeej | 0:7e1fdc4d6e1c | 74 | // file modified queue | 
| Jeej | 0:7e1fdc4d6e1c | 75 | Queue<void, 8> fm_queue; | 
| Jeej | 0:7e1fdc4d6e1c | 76 | |
| Jeej | 0:7e1fdc4d6e1c | 77 | // ----------------------------------------------- | 
| Jeej | 0:7e1fdc4d6e1c | 78 | // callbacks | 
| Jeej | 0:7e1fdc4d6e1c | 79 | // ----------------------------------------------- | 
| Jeej | 0:7e1fdc4d6e1c | 80 | /** | 
| Jeej | 0:7e1fdc4d6e1c | 81 | Write data into a file. | 
| Jeej | 0:7e1fdc4d6e1c | 82 | |
| Jeej | 0:7e1fdc4d6e1c | 83 | @param const uint8_t File ID | 
| Jeej | 0:7e1fdc4d6e1c | 84 | @param const uint16_t Offset from start of data | 
| Jeej | 0:7e1fdc4d6e1c | 85 | @param const uint16_t Size of data to be written | 
| Jeej | 0:7e1fdc4d6e1c | 86 | @param const uint8_t* const Pointer to the data to write | 
| Jeej | 0:7e1fdc4d6e1c | 87 | @return uint32_t Size of written data | 
| Jeej | 0:7e1fdc4d6e1c | 88 | */ | 
| Jeej | 0:7e1fdc4d6e1c | 89 | uint32_t write_file_callback(const uint8_t file_id, | 
| Jeej | 0:7e1fdc4d6e1c | 90 | const uint16_t offset, | 
| Jeej | 0:7e1fdc4d6e1c | 91 | const uint16_t size, | 
| Jeej | 0:7e1fdc4d6e1c | 92 | const uint8_t* const content) | 
| Jeej | 0:7e1fdc4d6e1c | 93 | { | 
| Jeej | 0:7e1fdc4d6e1c | 94 | uint32_t ret = 0; | 
| Jeej | 0:7e1fdc4d6e1c | 95 | |
| Jeej | 0:7e1fdc4d6e1c | 96 | IPRINT("Write file %d offset:%d size:%d\r\n", file_id, offset, size); | 
| Jeej | 0:7e1fdc4d6e1c | 97 | |
| Jeej | 0:7e1fdc4d6e1c | 98 | ret = fs_write_file(file_id, offset, size, content); | 
| Jeej | 0:7e1fdc4d6e1c | 99 | |
| Jeej | 0:7e1fdc4d6e1c | 100 | WARNING(ret, "File %d not found\r\n", file_id); | 
| Jeej | 0:7e1fdc4d6e1c | 101 | |
| Jeej | 0:7e1fdc4d6e1c | 102 | // Indicate that the file has been modified | 
| Jeej | 0:7e1fdc4d6e1c | 103 | fm_queue.put((void*)file_id); | 
| Jeej | 0:7e1fdc4d6e1c | 104 | |
| Jeej | 0:7e1fdc4d6e1c | 105 | return ret; | 
| Jeej | 0:7e1fdc4d6e1c | 106 | } | 
| Jeej | 0:7e1fdc4d6e1c | 107 | |
| Jeej | 0:7e1fdc4d6e1c | 108 | /** | 
| Jeej | 0:7e1fdc4d6e1c | 109 | Read data from a file. | 
| Jeej | 0:7e1fdc4d6e1c | 110 | |
| Jeej | 0:7e1fdc4d6e1c | 111 | @param const uint8_t File ID | 
| Jeej | 0:7e1fdc4d6e1c | 112 | @param const uint16_t Offset from start of data | 
| Jeej | 0:7e1fdc4d6e1c | 113 | @param const uint16_t Size of data to be read | 
| Jeej | 0:7e1fdc4d6e1c | 114 | @param const uint8_t* const Pointer to the reading buffer | 
| Jeej | 0:7e1fdc4d6e1c | 115 | @return uint32_t Size of read data | 
| Jeej | 0:7e1fdc4d6e1c | 116 | */ | 
| Jeej | 0:7e1fdc4d6e1c | 117 | uint32_t read_file_callback(const uint8_t file_id, | 
| Jeej | 0:7e1fdc4d6e1c | 118 | const uint16_t offset, | 
| Jeej | 0:7e1fdc4d6e1c | 119 | const uint16_t size, | 
| Jeej | 0:7e1fdc4d6e1c | 120 | uint8_t* buf) | 
| Jeej | 0:7e1fdc4d6e1c | 121 | { | 
| shawe | 10:3d3dfc12f674 | 122 | PRINT("Read file %d offset:%d size:%d\r\n", file_id, offset, size); | 
| shawe | 10:3d3dfc12f674 | 123 | uint32_t ret = fs_read_file(file_id, offset, size, buf); | 
| Jeej | 0:7e1fdc4d6e1c | 124 | WARNING(ret, "File %d not found\r\n", file_id); | 
| Jeej | 0:7e1fdc4d6e1c | 125 | return ret; | 
| Jeej | 0:7e1fdc4d6e1c | 126 | } | 
| Jeej | 0:7e1fdc4d6e1c | 127 | |
| Jeej | 0:7e1fdc4d6e1c | 128 | /** | 
| Jeej | 0:7e1fdc4d6e1c | 129 | Called when a notification is finished | 
| Jeej | 0:7e1fdc4d6e1c | 130 | |
| Jeej | 0:7e1fdc4d6e1c | 131 | @param const uint8_t File ID | 
| Jeej | 0:7e1fdc4d6e1c | 132 | @param const uint8_t Error code | 
| Jeej | 0:7e1fdc4d6e1c | 133 | @return void | 
| Jeej | 0:7e1fdc4d6e1c | 134 | */ | 
| Jeej | 0:7e1fdc4d6e1c | 135 | void notif_done_callback(const uint8_t file_id, const uint8_t error) | 
| Jeej | 0:7e1fdc4d6e1c | 136 | { | 
| Jeej | 0:7e1fdc4d6e1c | 137 | PRINT("Notif FID %d done. err %d\r\n", file_id, error); | 
| Jeej | 0:7e1fdc4d6e1c | 138 | } | 
| Jeej | 0:7e1fdc4d6e1c | 139 | |
| Jeej | 0:7e1fdc4d6e1c | 140 | void unsolicited_callback(d7a_msg_t** uns) | 
| Jeej | 0:7e1fdc4d6e1c | 141 | { | 
| Jeej | 0:7e1fdc4d6e1c | 142 | PRINT("UNSOLICITED MESSAGE:\r\n"); | 
| Jeej | 0:7e1fdc4d6e1c | 143 | d7a_print_msg(uns); | 
| Jeej | 0:7e1fdc4d6e1c | 144 | d7a_free_msg(uns); | 
| Jeej | 0:7e1fdc4d6e1c | 145 | } | 
| Jeej | 0:7e1fdc4d6e1c | 146 | |
| Jeej | 0:7e1fdc4d6e1c | 147 | // callbacks structure | 
| Jeej | 0:7e1fdc4d6e1c | 148 | const d7a_callbacks_t callbacks = { | 
| Jeej | 0:7e1fdc4d6e1c | 149 | .write_file = write_file_callback, // If NULL you cannot declare files | 
| Jeej | 0:7e1fdc4d6e1c | 150 | .read_file = read_file_callback, // If NULL you cannot declare files | 
| Jeej | 0:7e1fdc4d6e1c | 151 | .notif_done = notif_done_callback, | 
| Jeej | 0:7e1fdc4d6e1c | 152 | .unsolicited_msg = unsolicited_callback, | 
| Jeej | 0:7e1fdc4d6e1c | 153 | }; | 
| Jeej | 0:7e1fdc4d6e1c | 154 | |
| Jeej | 0:7e1fdc4d6e1c | 155 | // Com configuration for the DASH7 shield | 
| Jeej | 0:7e1fdc4d6e1c | 156 | const d7a_com_config_t shield_config = { | 
| Jeej | 1:711fb7d8127b | 157 | .tx = D7A_PIN_TX, | 
| Jeej | 1:711fb7d8127b | 158 | .rx = D7A_PIN_RX, | 
| Jeej | 1:711fb7d8127b | 159 | .rts = D7A_PIN_RTS, | 
| Jeej | 1:711fb7d8127b | 160 | .cts = D7A_PIN_CTS, | 
| Jeej | 0:7e1fdc4d6e1c | 161 | }; | 
| Jeej | 0:7e1fdc4d6e1c | 162 | |
| Jeej | 0:7e1fdc4d6e1c | 163 | // Check parameters to see if data should be send | 
| Jeej | 0:7e1fdc4d6e1c | 164 | static bool report_needed(sensor_config_t* cfg, int32_t value, int32_t last_value, uint32_t last_report_time) | 
| Jeej | 0:7e1fdc4d6e1c | 165 | { | 
| Jeej | 0:7e1fdc4d6e1c | 166 | switch (cfg->report_type) | 
| Jeej | 0:7e1fdc4d6e1c | 167 | { | 
| Jeej | 0:7e1fdc4d6e1c | 168 | case REPORT_ALWAYS: | 
| Jeej | 0:7e1fdc4d6e1c | 169 | // Send a report at each measure | 
| Jeej | 0:7e1fdc4d6e1c | 170 | IPRINT("Notif cause 1\r\n"); | 
| Jeej | 0:7e1fdc4d6e1c | 171 | return true; | 
| Jeej | 0:7e1fdc4d6e1c | 172 | case REPORT_ON_DIFFERENCE: | 
| Jeej | 0:7e1fdc4d6e1c | 173 | // Send a report when the difference between the last reported measure and the current mesure is greater than max_diff | 
| Jeej | 0:7e1fdc4d6e1c | 174 | if (abs(last_value - value) >= cfg->max_diff) | 
| Jeej | 0:7e1fdc4d6e1c | 175 | { | 
| Jeej | 0:7e1fdc4d6e1c | 176 | IPRINT("Notif cause 2 last:%d new:%d max_diff:%d\r\n", last_value, value, cfg->max_diff); | 
| Jeej | 0:7e1fdc4d6e1c | 177 | return true; | 
| Jeej | 0:7e1fdc4d6e1c | 178 | } | 
| Jeej | 0:7e1fdc4d6e1c | 179 | break; | 
| Jeej | 0:7e1fdc4d6e1c | 180 | case REPORT_ON_THRESHOLD: | 
| Jeej | 0:7e1fdc4d6e1c | 181 | // Send a report when crossing a threshold | 
| Jeej | 0:7e1fdc4d6e1c | 182 | if ( (value >= cfg->threshold_high && last_value < cfg->threshold_high) | 
| Jeej | 0:7e1fdc4d6e1c | 183 | || (value <= cfg->threshold_low && last_value > cfg->threshold_low) | 
| Jeej | 0:7e1fdc4d6e1c | 184 | || (value < cfg->threshold_high && last_value >= cfg->threshold_high) | 
| Jeej | 0:7e1fdc4d6e1c | 185 | || (value > cfg->threshold_low && last_value <= cfg->threshold_low)) | 
| Jeej | 0:7e1fdc4d6e1c | 186 | { | 
| Jeej | 0:7e1fdc4d6e1c | 187 | 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 | 188 | return true; | 
| Jeej | 0:7e1fdc4d6e1c | 189 | } | 
| Jeej | 0:7e1fdc4d6e1c | 190 | break; | 
| Jeej | 0:7e1fdc4d6e1c | 191 | default: | 
| Jeej | 0:7e1fdc4d6e1c | 192 | break; | 
| Jeej | 0:7e1fdc4d6e1c | 193 | } | 
| Jeej | 0:7e1fdc4d6e1c | 194 | |
| Jeej | 0:7e1fdc4d6e1c | 195 | // Send a report if it's been more than max_period since the last report | 
| Jeej | 0:7e1fdc4d6e1c | 196 | if (((last_report_time/1000) >= cfg->max_period) && (cfg->max_period != 0)) | 
| Jeej | 0:7e1fdc4d6e1c | 197 | { | 
| Jeej | 0:7e1fdc4d6e1c | 198 | IPRINT("Notif cause 4 max_period:%d time:%d\r\n", cfg->max_period, last_report_time); | 
| Jeej | 0:7e1fdc4d6e1c | 199 | return true; | 
| Jeej | 0:7e1fdc4d6e1c | 200 | } | 
| Jeej | 0:7e1fdc4d6e1c | 201 | |
| Jeej | 0:7e1fdc4d6e1c | 202 | return false; | 
| Jeej | 0:7e1fdc4d6e1c | 203 | } | 
| Jeej | 0:7e1fdc4d6e1c | 204 | |
| yordan | 7:8de29807f970 | 205 | // ----------------------------------------------- | 
| yordan | 7:8de29807f970 | 206 | // Sensor Threads | 
| yordan | 7:8de29807f970 | 207 | // ----------------------------------------------- | 
| yordan | 7:8de29807f970 | 208 | typedef struct | 
| yordan | 7:8de29807f970 | 209 | { | 
| yordan | 7:8de29807f970 | 210 | // Number of data fields | 
| yordan | 7:8de29807f970 | 211 | uint32_t nb_values; | 
| yordan | 7:8de29807f970 | 212 | // Total size of data | 
| yordan | 7:8de29807f970 | 213 | uint32_t data_size; | 
| yordan | 7:8de29807f970 | 214 | // Read value function | 
| yordan | 7:8de29807f970 | 215 | bool (*read_value)(int32_t*); | 
| yordan | 7:8de29807f970 | 216 | // Last reported value | 
| yordan | 7:8de29807f970 | 217 | int32_t* last_report_value; | 
| yordan | 7:8de29807f970 | 218 | // Current measured value | 
| yordan | 7:8de29807f970 | 219 | int32_t* current_value; | 
| yordan | 7:8de29807f970 | 220 | |
| yordan | 7:8de29807f970 | 221 | // File ID of the sensor value file | 
| yordan | 7:8de29807f970 | 222 | uint8_t value_file_id; | 
| yordan | 7:8de29807f970 | 223 | // Sensor configuration file ID | 
| yordan | 7:8de29807f970 | 224 | uint8_t cfg_file_id; | 
| yordan | 7:8de29807f970 | 225 | // Sensor configuration context | 
| yordan | 7:8de29807f970 | 226 | sensor_config_t cfg; | 
| yordan | 7:8de29807f970 | 227 | |
| yordan | 7:8de29807f970 | 228 | } sensor_thread_ctx_t; | 
| yordan | 7:8de29807f970 | 229 | |
| yordan | 7:8de29807f970 | 230 | sensor_thread_ctx_t* g_thread_ctx; | 
| yordan | 7:8de29807f970 | 231 | |
| yordan | 7:8de29807f970 | 232 | // Initialisation of the sensor thread's context | 
| yordan | 7:8de29807f970 | 233 | #define SENSOR_THREAD_CTX(_name,_vfid,_cfid,_read_func,_nb_values) \ | 
| yordan | 7:8de29807f970 | 234 | int32_t _name##_last_report[_nb_values];\ | 
| yordan | 7:8de29807f970 | 235 | int32_t _name##_current_value[_nb_values];\ | 
| yordan | 7:8de29807f970 | 236 | sensor_thread_ctx_t _name##_thread_ctx = {\ | 
| yordan | 7:8de29807f970 | 237 | .nb_values = _nb_values,\ | 
| yordan | 7:8de29807f970 | 238 | .data_size = _nb_values * sizeof(int32_t),\ | 
| yordan | 7:8de29807f970 | 239 | .read_value = _read_func,\ | 
| yordan | 7:8de29807f970 | 240 | .last_report_value = (int32_t*)&_name##_last_report,\ | 
| yordan | 7:8de29807f970 | 241 | .current_value = (int32_t*)&_name##_current_value,\ | 
| yordan | 7:8de29807f970 | 242 | .value_file_id = _vfid,\ | 
| yordan | 7:8de29807f970 | 243 | .cfg_file_id = _cfid\ | 
| yordan | 7:8de29807f970 | 244 | } | 
| yordan | 7:8de29807f970 | 245 | |
| yordan | 7:8de29807f970 | 246 | __inline int32_t float2_to_int(float v) | 
| yordan | 7:8de29807f970 | 247 | { | 
| yordan | 7:8de29807f970 | 248 | return (int32_t)(v*100); | 
| yordan | 7:8de29807f970 | 249 | } | 
| yordan | 8:01f0225408cf | 250 | |
| yordan | 7:8de29807f970 | 251 | bool tem1_get_value(int32_t* buf) | 
| yordan | 7:8de29807f970 | 252 | { | 
| yordan | 8:01f0225408cf | 253 | #if (_TEM1_EN_ == 0) | 
| yordan | 7:8de29807f970 | 254 | return simul_sensor_value(buf, 1, 1100, 3900); | 
| yordan | 8:01f0225408cf | 255 | #elif (_TEM1_EN_ == 1) | 
| shawe | 10:3d3dfc12f674 | 256 | float ambient = temp_sensor1->ambientTemp(); | 
| shawe | 10:3d3dfc12f674 | 257 | float object = temp_sensor1->objectTemp(); | 
| shawe | 10:3d3dfc12f674 | 258 | PRINT("Got %f || %f\r\n", ambient, object); | 
| shawe | 10:3d3dfc12f674 | 259 | buf[0] = float2_to_int(object); | 
| shawe | 10:3d3dfc12f674 | 260 | buf[1] = float2_to_int(ambient); | 
| yordan | 8:01f0225408cf | 261 | return false; | 
| yordan | 7:8de29807f970 | 262 | #endif | 
| yordan | 7:8de29807f970 | 263 | } | 
| shawe | 10:3d3dfc12f674 | 264 | SENSOR_THREAD_CTX(tem1, TEM1_VALUE_FILE_ID, TEM1_CFG_FILE_ID, tem1_get_value, 2); | 
| Jeej | 0:7e1fdc4d6e1c | 265 | |
| shawe | 10:3d3dfc12f674 | 266 | bool volt_get_value(int32_t* buf) | 
| yordan | 8:01f0225408cf | 267 | { | 
| shawe | 10:3d3dfc12f674 | 268 | #if (_VOLTAGE_EN_ == 0) | 
| shawe | 10:3d3dfc12f674 | 269 | return simul_sensor_value(buf, 1, 0, 1000); | 
| shawe | 10:3d3dfc12f674 | 270 | #elif (_VOLTAGE_EN_ == 1) | 
| shawe | 10:3d3dfc12f674 | 271 | float voltage = volt_pin*1000; | 
| shawe | 10:3d3dfc12f674 | 272 | PRINT("Voltage value %f\r\n", voltage); | 
| shawe | 10:3d3dfc12f674 | 273 | buf[0] = float2_to_int(voltage); | 
| yordan | 8:01f0225408cf | 274 | return false; | 
| yordan | 8:01f0225408cf | 275 | #else | 
| yordan | 8:01f0225408cf | 276 | return false; | 
| yordan | 8:01f0225408cf | 277 | #endif | 
| yordan | 8:01f0225408cf | 278 | } | 
| shawe | 10:3d3dfc12f674 | 279 | SENSOR_THREAD_CTX(volt, VOLT_VALUE_FILE_ID, VOLT_CFG_FILE_ID, volt_get_value, 1); | 
| yordan | 8:01f0225408cf | 280 | |
| Jeej | 0:7e1fdc4d6e1c | 281 | |
| Jeej | 0:7e1fdc4d6e1c | 282 | void sensor_thread() | 
| Jeej | 0:7e1fdc4d6e1c | 283 | { | 
| Jeej | 1:711fb7d8127b | 284 | FPRINT("(id:0x%08x)\r\n", osThreadGetId()); | 
| Jeej | 1:711fb7d8127b | 285 | |
| Jeej | 0:7e1fdc4d6e1c | 286 | // Get thread context | 
| Jeej | 0:7e1fdc4d6e1c | 287 | sensor_thread_ctx_t* th_ctx = g_thread_ctx; | 
| Jeej | 4:8ac150ec1532 | 288 | |
| Jeej | 0:7e1fdc4d6e1c | 289 | d7a_msg_t** resp = NULL; | 
| Jeej | 0:7e1fdc4d6e1c | 290 | uint32_t last_report_time = 0; | 
| Jeej | 0:7e1fdc4d6e1c | 291 | |
| Jeej | 0:7e1fdc4d6e1c | 292 | // Force a first notification | 
| Jeej | 0:7e1fdc4d6e1c | 293 | bool first_notif = true; | 
| Jeej | 0:7e1fdc4d6e1c | 294 | |
| Jeej | 0:7e1fdc4d6e1c | 295 | // Retrieve notification config from local file | 
| Jeej | 0:7e1fdc4d6e1c | 296 | fs_read_file(th_ctx->cfg_file_id, 0, sizeof(sensor_config_t), (uint8_t*)&(th_ctx->cfg)); | 
| Jeej | 0:7e1fdc4d6e1c | 297 | |
| Jeej | 0:7e1fdc4d6e1c | 298 | // Declare the config file to allow it to be accessed via the modem | 
| Jeej | 0:7e1fdc4d6e1c | 299 | d7a_declare(th_ctx->cfg_file_id, VOLATILE, RW_RW, sizeof(sensor_config_t), sizeof(sensor_config_t)); | 
| Jeej | 0:7e1fdc4d6e1c | 300 | |
| Jeej | 0:7e1fdc4d6e1c | 301 | // Create a file on the modem to store and notify the sensor value | 
| Jeej | 0:7e1fdc4d6e1c | 302 | 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 | 303 | |
| Jeej | 4:8ac150ec1532 | 304 | thread_ready.release(); | 
| Jeej | 4:8ac150ec1532 | 305 | |
| Jeej | 0:7e1fdc4d6e1c | 306 | while (true) | 
| Jeej | 0:7e1fdc4d6e1c | 307 | { | 
| Jeej | 0:7e1fdc4d6e1c | 308 | // Read the sensor values | 
| Jeej | 0:7e1fdc4d6e1c | 309 | bool err = th_ctx->read_value(th_ctx->current_value); | 
| Jeej | 0:7e1fdc4d6e1c | 310 | |
| Jeej | 1:711fb7d8127b | 311 | ASSERT(!err, "Failed to read sensor value for FID: %d\r\n", th_ctx->value_file_id); | 
| Jeej | 0:7e1fdc4d6e1c | 312 | |
| Jeej | 0:7e1fdc4d6e1c | 313 | // Check if data should be send | 
| Jeej | 0:7e1fdc4d6e1c | 314 | for (uint8_t i = 0; i < th_ctx->nb_values; i++) | 
| Jeej | 0:7e1fdc4d6e1c | 315 | { | 
| Jeej | 0:7e1fdc4d6e1c | 316 | if (report_needed(&(th_ctx->cfg), | 
| Jeej | 0:7e1fdc4d6e1c | 317 | th_ctx->current_value[i], | 
| Jeej | 0:7e1fdc4d6e1c | 318 | th_ctx->last_report_value[i], | 
| Jeej | 0:7e1fdc4d6e1c | 319 | last_report_time) || first_notif) | 
| Jeej | 0:7e1fdc4d6e1c | 320 | { | 
| Jeej | 0:7e1fdc4d6e1c | 321 | first_notif = false; | 
| Jeej | 0:7e1fdc4d6e1c | 322 | |
| Jeej | 0:7e1fdc4d6e1c | 323 | PRINT("NOTIFY %3d: ", th_ctx->value_file_id); | 
| Jeej | 0:7e1fdc4d6e1c | 324 | for (uint8_t i = 0; i < th_ctx->nb_values; i++) | 
| Jeej | 0:7e1fdc4d6e1c | 325 | { | 
| Jeej | 0:7e1fdc4d6e1c | 326 | PRINT("%9ld ", (int32_t)th_ctx->current_value[i]); | 
| Jeej | 0:7e1fdc4d6e1c | 327 | } | 
| Jeej | 0:7e1fdc4d6e1c | 328 | PRINT("\r\n"); | 
| Jeej | 0:7e1fdc4d6e1c | 329 | |
| Jeej | 0:7e1fdc4d6e1c | 330 | // Send data to the modem | 
| Jeej | 0:7e1fdc4d6e1c | 331 | resp = d7a_write(th_ctx->value_file_id, 0, th_ctx->data_size, (uint8_t*)th_ctx->current_value); | 
| Jeej | 0:7e1fdc4d6e1c | 332 | d7a_free_msg(resp); | 
| Jeej | 0:7e1fdc4d6e1c | 333 | |
| Jeej | 0:7e1fdc4d6e1c | 334 | // Update last report value | 
| Jeej | 0:7e1fdc4d6e1c | 335 | memcpy(th_ctx->last_report_value, th_ctx->current_value, th_ctx->data_size); | 
| Jeej | 0:7e1fdc4d6e1c | 336 | // Reset last report time | 
| Jeej | 0:7e1fdc4d6e1c | 337 | last_report_time = 0; | 
| Jeej | 0:7e1fdc4d6e1c | 338 | break; | 
| Jeej | 0:7e1fdc4d6e1c | 339 | } | 
| Jeej | 0:7e1fdc4d6e1c | 340 | } | 
| Jeej | 0:7e1fdc4d6e1c | 341 | |
| Jeej | 0:7e1fdc4d6e1c | 342 | // Update last report time | 
| Jeej | 0:7e1fdc4d6e1c | 343 | last_report_time += th_ctx->cfg.period; | 
| Jeej | 0:7e1fdc4d6e1c | 344 | |
| Jeej | 0:7e1fdc4d6e1c | 345 | // Wait for period | 
| Jeej | 0:7e1fdc4d6e1c | 346 | Thread::wait(th_ctx->cfg.period); | 
| Jeej | 0:7e1fdc4d6e1c | 347 | } | 
| Jeej | 0:7e1fdc4d6e1c | 348 | } | 
| Jeej | 0:7e1fdc4d6e1c | 349 | |
| Jeej | 0:7e1fdc4d6e1c | 350 | void file_modified_thread() | 
| Jeej | 0:7e1fdc4d6e1c | 351 | { | 
| Jeej | 0:7e1fdc4d6e1c | 352 | FPRINT("(id:0x%08x)\r\n", osThreadGetId()); | 
| Jeej | 0:7e1fdc4d6e1c | 353 | |
| Jeej | 0:7e1fdc4d6e1c | 354 | while (true) | 
| Jeej | 0:7e1fdc4d6e1c | 355 | { | 
| Jeej | 0:7e1fdc4d6e1c | 356 | // Wait for a file modified event | 
| shawe | 10:3d3dfc12f674 | 357 | osEvent evt = fm_queue.get(); | 
| Jeej | 0:7e1fdc4d6e1c | 358 | // Retrieve FID of modified file | 
| Jeej | 0:7e1fdc4d6e1c | 359 | uint8_t fid = (uint8_t)(uint32_t)evt.value.p; | 
| Jeej | 0:7e1fdc4d6e1c | 360 | PRINT("File %d has been modified\r\n", fid); | 
| Jeej | 0:7e1fdc4d6e1c | 361 | |
| Jeej | 0:7e1fdc4d6e1c | 362 | switch (fid) | 
| Jeej | 0:7e1fdc4d6e1c | 363 | { | 
| Jeej | 0:7e1fdc4d6e1c | 364 | // If a configuration file has been modified, update the context | 
| shawe | 10:3d3dfc12f674 | 365 | case VOLT_CFG_FILE_ID: | 
| shawe | 10:3d3dfc12f674 | 366 | fs_read_file(fid, 0, sizeof(sensor_config_t), (uint8_t*)&(volt_thread_ctx.cfg)); | 
| Jeej | 0:7e1fdc4d6e1c | 367 | break; | 
| Jeej | 0:7e1fdc4d6e1c | 368 | case TEM1_CFG_FILE_ID: | 
| Jeej | 0:7e1fdc4d6e1c | 369 | fs_read_file(fid, 0, sizeof(sensor_config_t), (uint8_t*)&(tem1_thread_ctx.cfg)); | 
| shawe | 10:3d3dfc12f674 | 370 | break; | 
| Jeej | 0:7e1fdc4d6e1c | 371 | default: | 
| Jeej | 0:7e1fdc4d6e1c | 372 | break; | 
| Jeej | 0:7e1fdc4d6e1c | 373 | } | 
| Jeej | 0:7e1fdc4d6e1c | 374 | } | 
| Jeej | 0:7e1fdc4d6e1c | 375 | } | 
| Jeej | 0:7e1fdc4d6e1c | 376 | |
| Jeej | 0:7e1fdc4d6e1c | 377 | void button_user_thread() | 
| Jeej | 0:7e1fdc4d6e1c | 378 | { | 
| Jeej | 0:7e1fdc4d6e1c | 379 | FPRINT("(id:0x%08x)\r\n", osThreadGetId()); | 
| Jeej | 0:7e1fdc4d6e1c | 380 | |
| Jeej | 0:7e1fdc4d6e1c | 381 | uint8_t alarm = 255; | 
| Jeej | 0:7e1fdc4d6e1c | 382 | d7a_msg_t** resp = NULL; | 
| Jeej | 0:7e1fdc4d6e1c | 383 | |
| Jeej | 0:7e1fdc4d6e1c | 384 | // Create the alarm file | 
| Jeej | 0:7e1fdc4d6e1c | 385 | d7a_create(ALARM_FILE_ID, VOLATILE, RW_R, sizeof(uint8_t), sizeof(uint8_t), D7A_NOTIFICATION_FULL, D7A_ITF_SINGLE); | 
| Jeej | 0:7e1fdc4d6e1c | 386 | |
| Jeej | 0:7e1fdc4d6e1c | 387 | // Update it with the default value | 
| Jeej | 0:7e1fdc4d6e1c | 388 | resp = d7a_write(ALARM_FILE_ID, 0, sizeof(uint8_t), (uint8_t*)&alarm); | 
| Jeej | 0:7e1fdc4d6e1c | 389 | d7a_free_msg(resp); | 
| Jeej | 0:7e1fdc4d6e1c | 390 | |
| Jeej | 0:7e1fdc4d6e1c | 391 | while (true) | 
| Jeej | 0:7e1fdc4d6e1c | 392 | { | 
| Jeej | 0:7e1fdc4d6e1c | 393 | // Wait for button press | 
| Jeej | 0:7e1fdc4d6e1c | 394 | button_user.wait(); | 
| Jeej | 0:7e1fdc4d6e1c | 395 | |
| Jeej | 0:7e1fdc4d6e1c | 396 | // Toggle alarm state | 
| Jeej | 0:7e1fdc4d6e1c | 397 | alarm = !alarm; | 
| Jeej | 0:7e1fdc4d6e1c | 398 | |
| Jeej | 0:7e1fdc4d6e1c | 399 | PRINT("BUTTON ALARM %d\r\n", alarm); | 
| Jeej | 0:7e1fdc4d6e1c | 400 | #if 1 // Switch between Notify and Distant Read/Write example | 
| Jeej | 0:7e1fdc4d6e1c | 401 | // Send alarm state to the modem | 
| Jeej | 0:7e1fdc4d6e1c | 402 | resp = d7a_write(ALARM_FILE_ID, 0, sizeof(uint8_t), (uint8_t*)&alarm); | 
| Jeej | 0:7e1fdc4d6e1c | 403 | WARNING(!resp[0]->err, "BUTTON ALARM ERR %d\r\n", resp[0]->err); | 
| Jeej | 0:7e1fdc4d6e1c | 404 | d7a_free_msg(resp); | 
| Jeej | 0:7e1fdc4d6e1c | 405 | #else | 
| Jeej | 0:7e1fdc4d6e1c | 406 | // Distant device that I want to acceed | 
| Jeej | 0:7e1fdc4d6e1c | 407 | #if 0 // Unicast / Broadcast | 
| Jeej | 0:7e1fdc4d6e1c | 408 | // Unicast | 
| Jeej | 0:7e1fdc4d6e1c | 409 | d7a_addressee_t target = { | 
| Jeej | 0:7e1fdc4d6e1c | 410 | // Access Class | 
| Jeej | 0:7e1fdc4d6e1c | 411 | .xcl.byte = D7A_XCL_ENDPOINT_NO, | 
| Jeej | 0:7e1fdc4d6e1c | 412 | // Type of security you want to use | 
| Jeej | 0:7e1fdc4d6e1c | 413 | .ctrl.bf.nls = D7A_NLS_AES_CCM_64, | 
| Jeej | 0:7e1fdc4d6e1c | 414 | // Type of ID | 
| Jeej | 0:7e1fdc4d6e1c | 415 | .ctrl.bf.idf = D7A_ID_UID, | 
| Jeej | 0:7e1fdc4d6e1c | 416 | // Device ID | 
| Jeej | 0:7e1fdc4d6e1c | 417 | .id = { 0x00, 0x1B, 0xC5, 0x0C, 0x70, 0x00, 0x07, 0xA3 }, | 
| Jeej | 0:7e1fdc4d6e1c | 418 | }; | 
| Jeej | 0:7e1fdc4d6e1c | 419 | #else | 
| Jeej | 0:7e1fdc4d6e1c | 420 | // Broadcast | 
| Jeej | 0:7e1fdc4d6e1c | 421 | d7a_addressee_t target = { | 
| Jeej | 0:7e1fdc4d6e1c | 422 | // Access Class | 
| Jeej | 0:7e1fdc4d6e1c | 423 | .xcl.byte = D7A_XCL_ENDPOINT_NO, | 
| Jeej | 0:7e1fdc4d6e1c | 424 | // Type of security you want to use | 
| Jeej | 0:7e1fdc4d6e1c | 425 | .ctrl.bf.nls = D7A_NLS_AES_CCM_64, | 
| Jeej | 0:7e1fdc4d6e1c | 426 | // Type of ID | 
| Jeej | 0:7e1fdc4d6e1c | 427 | .ctrl.bf.idf = D7A_ID_NBID, | 
| Jeej | 0:7e1fdc4d6e1c | 428 | // Maximum number of responses (1-32) | 
| Jeej | 0:7e1fdc4d6e1c | 429 | .id[0] = D7A_NBID(8), | 
| Jeej | 0:7e1fdc4d6e1c | 430 | }; | 
| Jeej | 0:7e1fdc4d6e1c | 431 | #endif | 
| Jeej | 0:7e1fdc4d6e1c | 432 | |
| Jeej | 0:7e1fdc4d6e1c | 433 | #if 1 // Read / Write | 
| Jeej | 0:7e1fdc4d6e1c | 434 | // Read example | 
| Jeej | 0:7e1fdc4d6e1c | 435 | //resp = d7a_read(MAG_CFG_FILE_ID, 12, 5, &target, D7A_ITF_ONESHOT); | 
| Jeej | 0:7e1fdc4d6e1c | 436 | resp = d7a_read(ALARM_FILE_ID, 0, 1, NULL, &target, D7A_ITF_ONESHOT); | 
| Jeej | 0:7e1fdc4d6e1c | 437 | #else | 
| Jeej | 0:7e1fdc4d6e1c | 438 | // Write example | 
| Jeej | 0:7e1fdc4d6e1c | 439 | uint8_t v = 0x01; | 
| Jeej | 0:7e1fdc4d6e1c | 440 | resp = d7a_write(ALARM_FILE_ID, 0, 1, &v, NULL, &target, D7A_ITF_ONESHOT); | 
| Jeej | 0:7e1fdc4d6e1c | 441 | #endif | 
| Jeej | 0:7e1fdc4d6e1c | 442 | // Check received response(s) | 
| Jeej | 0:7e1fdc4d6e1c | 443 | d7a_print_msg(resp); | 
| Jeej | 0:7e1fdc4d6e1c | 444 | |
| Jeej | 0:7e1fdc4d6e1c | 445 | PRINT("Resp done.\r\n"); | 
| Jeej | 0:7e1fdc4d6e1c | 446 | d7a_free_msg(resp); | 
| Jeej | 0:7e1fdc4d6e1c | 447 | #endif | 
| Jeej | 0:7e1fdc4d6e1c | 448 | } | 
| Jeej | 0:7e1fdc4d6e1c | 449 | } | 
| Jeej | 0:7e1fdc4d6e1c | 450 | |
| Jeej | 0:7e1fdc4d6e1c | 451 | /*** Main function ------------------------------------------------------------- ***/ | 
| Jeej | 0:7e1fdc4d6e1c | 452 | int main() | 
| Jeej | 0:7e1fdc4d6e1c | 453 | { | 
| Jeej | 0:7e1fdc4d6e1c | 454 | // Start & initialize | 
| Jeej | 3:5f2917933ece | 455 | DBG_OPEN(DEBUG_LED); | 
| Jeej | 0:7e1fdc4d6e1c | 456 | PRINT("\r\n--- Starting new run ---\r\n"); | 
| Jeej | 0:7e1fdc4d6e1c | 457 | |
| Jeej | 0:7e1fdc4d6e1c | 458 | extern uint16_t const os_maxtaskrun; | 
| Jeej | 0:7e1fdc4d6e1c | 459 | //IPRINT("Max user threads: %d\r\n", os_maxtaskrun-1-9); | 
| Jeej | 0:7e1fdc4d6e1c | 460 | |
| Jeej | 1:711fb7d8127b | 461 | d7a_open(&shield_config, D7A_PIN_RESET, &callbacks); | 
| Jeej | 0:7e1fdc4d6e1c | 462 | d7a_modem_print_infos(); | 
| Jeej | 0:7e1fdc4d6e1c | 463 | |
| Jeej | 0:7e1fdc4d6e1c | 464 | // Create the revision file for the Dash7board | 
| Jeej | 0:7e1fdc4d6e1c | 465 | d7a_create(65, PERMANENT, RW_R, sizeof(d7a_revision_t), sizeof(d7a_revision_t), D7A_NOTIFICATION_FULL, D7A_ITF_REPORT_CHECKED); | 
| Jeej | 0:7e1fdc4d6e1c | 466 | // Notify revision | 
| Jeej | 0:7e1fdc4d6e1c | 467 | d7a_msg_t** resp = d7a_write(65, 0, sizeof(d7a_revision_t), (uint8_t*)&f_dev_rev); | 
| Jeej | 0:7e1fdc4d6e1c | 468 | d7a_free_msg(resp); | 
| Jeej | 0:7e1fdc4d6e1c | 469 | |
| Jeej | 0:7e1fdc4d6e1c | 470 | uint32_t divider; | 
| Jeej | 0:7e1fdc4d6e1c | 471 | |
| Jeej | 0:7e1fdc4d6e1c | 472 | // Retreive the simulation parameter from local file | 
| Jeej | 0:7e1fdc4d6e1c | 473 | fs_read_file(SIMUL_FILE_ID, 0, sizeof(uint32_t), (uint8_t*)÷r); | 
| Jeej | 0:7e1fdc4d6e1c | 474 | |
| Jeej | 0:7e1fdc4d6e1c | 475 | // Update the simulation parameters | 
| Jeej | 0:7e1fdc4d6e1c | 476 | simul_update_param(divider); | 
| Jeej | 0:7e1fdc4d6e1c | 477 | |
| Jeej | 0:7e1fdc4d6e1c | 478 | // Declare the simulation parameter file | 
| Jeej | 0:7e1fdc4d6e1c | 479 | d7a_declare(SIMUL_FILE_ID, PERMANENT, RW_RW, sizeof(sensor_config_t), sizeof(sensor_config_t)); | 
| Jeej | 0:7e1fdc4d6e1c | 480 | |
| shawe | 10:3d3dfc12f674 | 481 | #if (_TEM1_EN_ == 1) | 
| yordan | 8:01f0225408cf | 482 | // Open I2C and initialise the sensors | 
| yordan | 7:8de29807f970 | 483 | DevI2C ext_i2c(SENSOR_I2C_SDA, SENSOR_I2C_SCL); | 
| shawe | 10:3d3dfc12f674 | 484 | ext_i2c.frequency(100000); | 
| shawe | 10:3d3dfc12f674 | 485 | temp_sensor1 = new MLX90614(&ext_i2c); | 
| yordan | 8:01f0225408cf | 486 | #endif | 
| yordan | 8:01f0225408cf | 487 | |
| Jeej | 0:7e1fdc4d6e1c | 488 | osStatus status; | 
| Jeej | 0:7e1fdc4d6e1c | 489 | |
| Jeej | 0:7e1fdc4d6e1c | 490 | // Start sensors threads | 
| Jeej | 1:711fb7d8127b | 491 | #define THREAD_START(_name) Thread _name##_th(osPriorityNormal, 1024, NULL);\ | 
| Jeej | 0:7e1fdc4d6e1c | 492 | g_thread_ctx = &_name##_thread_ctx;\ | 
| Jeej | 0:7e1fdc4d6e1c | 493 | status = _name##_th.start(sensor_thread);\ | 
| Jeej | 1:711fb7d8127b | 494 | ASSERT(status == osOK, "Failed to start ##_name## thread (err: %d)\r\n", status);\ | 
| Jeej | 0:7e1fdc4d6e1c | 495 | thread_ready.wait(); | 
| Jeej | 0:7e1fdc4d6e1c | 496 | |
| yordan | 8:01f0225408cf | 497 | #if (_TEM1_EN_ >= 0) | 
| Jeej | 0:7e1fdc4d6e1c | 498 | THREAD_START(tem1); | 
| Jeej | 0:7e1fdc4d6e1c | 499 | #endif // _TEM1_EN_ | 
| shawe | 10:3d3dfc12f674 | 500 | |
| shawe | 10:3d3dfc12f674 | 501 | #if (_VOLTAGE_EN_ >=0) | 
| shawe | 10:3d3dfc12f674 | 502 | THREAD_START(volt); | 
| shawe | 10:3d3dfc12f674 | 503 | #endif | 
| Jeej | 0:7e1fdc4d6e1c | 504 | |
| Jeej | 0:7e1fdc4d6e1c | 505 | // File modified thread | 
| Jeej | 1:711fb7d8127b | 506 | Thread fm_th(osPriorityNormal, 512, NULL); | 
| Jeej | 1:711fb7d8127b | 507 | status = fm_th.start(file_modified_thread); | 
| Jeej | 1:711fb7d8127b | 508 | ASSERT(status == osOK, "Failed to start fm thread (err: %d)\r\n", status); | 
| Jeej | 0:7e1fdc4d6e1c | 509 | |
| Jeej | 1:711fb7d8127b | 510 | // For button | 
| Jeej | 3:5f2917933ece | 511 | #ifdef DEBUG_BUTTON | 
| Jeej | 3:5f2917933ece | 512 | DebouncedInterrupt user_interrupt(DEBUG_BUTTON); | 
| yordan | 5:ef4b5c422d3a | 513 | user_interrupt.attach(button_push_isr, IRQ_FALL, 500, true); | 
| Jeej | 1:711fb7d8127b | 514 | |
| Jeej | 1:711fb7d8127b | 515 | Thread but_th(osPriorityNormal, 512, NULL); | 
| Jeej | 1:711fb7d8127b | 516 | status = but_th.start(button_user_thread); | 
| Jeej | 1:711fb7d8127b | 517 | ASSERT(status == osOK, "Failed to start but thread (err: %d)\r\n", status); | 
| Jeej | 1:711fb7d8127b | 518 | #endif | 
| yordan | 5:ef4b5c422d3a | 519 | |
| yordan | 5:ef4b5c422d3a | 520 | #ifdef DGB_LED_BLINK_PERIOD | 
| yordan | 5:ef4b5c422d3a | 521 | DigitalOut my_led(DEBUG_LED); | 
| yordan | 5:ef4b5c422d3a | 522 | #endif | 
| shawe | 10:3d3dfc12f674 | 523 | |
| Jeej | 0:7e1fdc4d6e1c | 524 | // Set main task to lowest priority | 
| Jeej | 0:7e1fdc4d6e1c | 525 | osThreadSetPriority(osThreadGetId(), osPriorityIdle); | 
| Jeej | 0:7e1fdc4d6e1c | 526 | while(true) | 
| Jeej | 0:7e1fdc4d6e1c | 527 | { | 
| yordan | 5:ef4b5c422d3a | 528 | #ifdef DGB_LED_BLINK_PERIOD | 
| Jeej | 0:7e1fdc4d6e1c | 529 | // Wait to avoid beeing stuck in loop | 
| yordan | 6:55244aef7c67 | 530 | Thread::wait(DGB_LED_BLINK_PERIOD); | 
| yordan | 5:ef4b5c422d3a | 531 | my_led = !my_led; | 
| yordan | 5:ef4b5c422d3a | 532 | #else | 
| Jeej | 3:5f2917933ece | 533 | Thread::wait(osWaitForever); | 
| yordan | 5:ef4b5c422d3a | 534 | #endif | 
| Jeej | 0:7e1fdc4d6e1c | 535 | } | 
| Jeej | 0:7e1fdc4d6e1c | 536 | } | 
