Workshop demo program
Dependencies: PinDetect mbed LoRaWAN-lib SX1272Lib
app/app.cpp@10:2eb7b1614bb8, 2017-04-24 (annotated)
- Committer:
- Brandond200
- Date:
- Mon Apr 24 20:38:51 2017 +0000
- Revision:
- 10:2eb7b1614bb8
- Parent:
- 8:fb8b53c490e1
- Child:
- 11:88afd7663dc4
Formatted and commented code for workshop
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sergei11522 | 7:d7cdd6804277 | 1 | #include "main.h" |
sergei11522 | 7:d7cdd6804277 | 2 | #include "mbed.h" |
sergei11522 | 7:d7cdd6804277 | 3 | #include "DebounceIn.h" |
sergei11522 | 7:d7cdd6804277 | 4 | #include "PinNames.h" |
Brandond200 | 8:fb8b53c490e1 | 5 | #include "timer.h" |
Brandond200 | 10:2eb7b1614bb8 | 6 | #include <math.h> |
Brandond200 | 8:fb8b53c490e1 | 7 | #include "app.h" |
Brandond200 | 8:fb8b53c490e1 | 8 | #include "SerialDisplay.h" |
sergei11522 | 7:d7cdd6804277 | 9 | |
sergei11522 | 7:d7cdd6804277 | 10 | //initialize our sensors |
sergei11522 | 7:d7cdd6804277 | 11 | DebounceIn button(D6); |
sergei11522 | 7:d7cdd6804277 | 12 | DigitalOut led(A1); |
sergei11522 | 7:d7cdd6804277 | 13 | AnalogIn rotary(A3); //the potentiometer/rotary sensor |
sergei11522 | 7:d7cdd6804277 | 14 | |
Brandond200 | 10:2eb7b1614bb8 | 15 | |
Brandond200 | 10:2eb7b1614bb8 | 16 | #define ALARM_THRESHOLD 90 /*alarm triggered over this percentage*/ |
Brandond200 | 10:2eb7b1614bb8 | 17 | #define BYTE_TO_PERCENT 655.35/*divisor to convert 2 byte number into number between 0 and 100*/ |
Brandond200 | 10:2eb7b1614bb8 | 18 | #define THIRTY_SECONDS 30 * 1000 * 1000 /*30 seconds in microseconds*/ |
Brandond200 | 10:2eb7b1614bb8 | 19 | #define TWO_HUNDRED_MILLISECONDS 200 * 1000 /*200 miliseconds in microseconds */ |
Brandond200 | 10:2eb7b1614bb8 | 20 | #define ROTATION_DATA_CHANNEL 3 /* myDevices channel to send rotation position on*/ |
Brandond200 | 10:2eb7b1614bb8 | 21 | #define ROTATION_DATA_TYPE 2 /*2 = Analog Input */ |
Brandond200 | 10:2eb7b1614bb8 | 22 | #define ALARM_DATA_CHANNEL 7 /* myDevices channel to send alarm status on*/ |
Brandond200 | 10:2eb7b1614bb8 | 23 | #define ALARM_DATA_TYPE 0 /*0 = Digital Input */ |
Brandond200 | 10:2eb7b1614bb8 | 24 | #define MAX_DATA_LENGTH 64 |
Brandond200 | 10:2eb7b1614bb8 | 25 | #define BLINK_COUNT_EVENT_TRANSMIT 1 |
Brandond200 | 10:2eb7b1614bb8 | 26 | #define BLINK_COUNT_TIMER_TRANSMIT 2 |
Brandond200 | 10:2eb7b1614bb8 | 27 | #define BLINK_COUNT_DOWNLINK_CONFIRMATION 3 |
Brandond200 | 10:2eb7b1614bb8 | 28 | #define BLINK_COUNT_JOINED 10 |
Brandond200 | 10:2eb7b1614bb8 | 29 | |
Brandond200 | 10:2eb7b1614bb8 | 30 | //network variables |
Brandond200 | 10:2eb7b1614bb8 | 31 | bool just_joined = true; //used to determine if this is the first time through the loop |
Brandond200 | 10:2eb7b1614bb8 | 32 | uint8_t data[MAX_DATA_LENGTH] = {0}; //data that will be transmitted |
Brandond200 | 10:2eb7b1614bb8 | 33 | uint8_t dataLength = 0; //length of data that will be transmitted |
Brandond200 | 10:2eb7b1614bb8 | 34 | |
Brandond200 | 10:2eb7b1614bb8 | 35 | //application variables |
Brandond200 | 10:2eb7b1614bb8 | 36 | bool button_pressed = false; //last state of the button |
Brandond200 | 10:2eb7b1614bb8 | 37 | bool alarmThresholdTirggered = false; //last state on the alarm |
Brandond200 | 10:2eb7b1614bb8 | 38 | uint8_t flashCount = 0; //how many more times to flash the LED |
Brandond200 | 10:2eb7b1614bb8 | 39 | |
Brandond200 | 10:2eb7b1614bb8 | 40 | //timers |
Brandond200 | 10:2eb7b1614bb8 | 41 | TimerEvent_t txTimer; //timer so schedule heartbeat transmissions |
Brandond200 | 10:2eb7b1614bb8 | 42 | TimerEvent_t ledTimer; //timer to blink LED |
Brandond200 | 8:fb8b53c490e1 | 43 | |
sergei11522 | 7:d7cdd6804277 | 44 | |
sergei11522 | 7:d7cdd6804277 | 45 | void onDownlinkConfirmation(){ |
Brandond200 | 10:2eb7b1614bb8 | 46 | flashLED(BLINK_COUNT_DOWNLINK_CONFIRMATION); |
sergei11522 | 7:d7cdd6804277 | 47 | } |
sergei11522 | 7:d7cdd6804277 | 48 | |
sergei11522 | 7:d7cdd6804277 | 49 | void start(){ |
Brandond200 | 8:fb8b53c490e1 | 50 | //any initialization here |
Brandond200 | 10:2eb7b1614bb8 | 51 | |
Brandond200 | 10:2eb7b1614bb8 | 52 | //initilize heartbeat timer |
Brandond200 | 8:fb8b53c490e1 | 53 | TimerInit(&txTimer, timerCallback); |
Brandond200 | 10:2eb7b1614bb8 | 54 | TimerSetValue( &txTimer, THIRTY_SECONDS ); |
Brandond200 | 8:fb8b53c490e1 | 55 | TimerStart(&txTimer); |
Brandond200 | 8:fb8b53c490e1 | 56 | |
Brandond200 | 10:2eb7b1614bb8 | 57 | //initilize LED flash timer |
Brandond200 | 8:fb8b53c490e1 | 58 | TimerInit(&ledTimer, flashLEDCallback); |
Brandond200 | 10:2eb7b1614bb8 | 59 | TimerSetValue( &ledTimer, TWO_HUNDRED_MILLISECONDS ); |
sergei11522 | 7:d7cdd6804277 | 60 | } |
sergei11522 | 7:d7cdd6804277 | 61 | |
sergei11522 | 7:d7cdd6804277 | 62 | //this loop will start to be called as soon as the device successfully joins the network |
sergei11522 | 7:d7cdd6804277 | 63 | void loop(){ |
sergei11522 | 7:d7cdd6804277 | 64 | //the loop is called as soon as the device joins. Flash the led 10 times when this happens |
sergei11522 | 7:d7cdd6804277 | 65 | if (just_joined){ |
sergei11522 | 7:d7cdd6804277 | 66 | just_joined = false; |
Brandond200 | 10:2eb7b1614bb8 | 67 | flashLED(BLINK_COUNT_JOINED); |
sergei11522 | 7:d7cdd6804277 | 68 | } |
sergei11522 | 7:d7cdd6804277 | 69 | |
sergei11522 | 7:d7cdd6804277 | 70 | //button is pressed. Trigger once so that if we hold the button this block doesnt continously execute |
Brandond200 | 10:2eb7b1614bb8 | 71 | if (button == 1 && button_pressed == false){ |
sergei11522 | 7:d7cdd6804277 | 72 | button_pressed = true; |
Brandond200 | 10:2eb7b1614bb8 | 73 | flashLED(BLINK_COUNT_EVENT_TRANSMIT); |
Brandond200 | 10:2eb7b1614bb8 | 74 | transmitData(rotary.read_u16()); |
sergei11522 | 7:d7cdd6804277 | 75 | } else if (button == 0){ |
sergei11522 | 7:d7cdd6804277 | 76 | button_pressed = false; |
sergei11522 | 7:d7cdd6804277 | 77 | } |
Brandond200 | 8:fb8b53c490e1 | 78 | |
Brandond200 | 10:2eb7b1614bb8 | 79 | //trigger alarm if needed |
Brandond200 | 10:2eb7b1614bb8 | 80 | checkForAlarm(rotary.read_u16()); |
Brandond200 | 10:2eb7b1614bb8 | 81 | } |
Brandond200 | 10:2eb7b1614bb8 | 82 | |
Brandond200 | 10:2eb7b1614bb8 | 83 | //Transmit rotory position and alarm status |
Brandond200 | 10:2eb7b1614bb8 | 84 | void transmitData(uint16_t position){ |
Brandond200 | 10:2eb7b1614bb8 | 85 | addRotaryData(position); |
Brandond200 | 10:2eb7b1614bb8 | 86 | addAlarmData(position); |
Brandond200 | 10:2eb7b1614bb8 | 87 | setDataToSend(data, dataLength); |
Brandond200 | 10:2eb7b1614bb8 | 88 | sendLoraTransmission(); |
Brandond200 | 10:2eb7b1614bb8 | 89 | dataLength = 0; |
Brandond200 | 10:2eb7b1614bb8 | 90 | } |
Brandond200 | 10:2eb7b1614bb8 | 91 | |
Brandond200 | 10:2eb7b1614bb8 | 92 | //read the rotory position and add to data to transmit |
Brandond200 | 10:2eb7b1614bb8 | 93 | void addRotaryData(uint16_t positionArg){ |
Brandond200 | 10:2eb7b1614bb8 | 94 | uint16_t position = positionArg / (BYTE_TO_PERCENT / 100); |
Brandond200 | 10:2eb7b1614bb8 | 95 | |
Brandond200 | 10:2eb7b1614bb8 | 96 | data[dataLength++] = ROTATION_DATA_CHANNEL; |
Brandond200 | 10:2eb7b1614bb8 | 97 | data[dataLength++] = ROTATION_DATA_TYPE; |
Brandond200 | 10:2eb7b1614bb8 | 98 | data[dataLength++] = position >> 8; //add the upper byte of the rotory position |
Brandond200 | 10:2eb7b1614bb8 | 99 | data[dataLength++] = position & 0xFF; //add the lower byte of the rotory position |
Brandond200 | 10:2eb7b1614bb8 | 100 | } |
Brandond200 | 10:2eb7b1614bb8 | 101 | |
Brandond200 | 10:2eb7b1614bb8 | 102 | //read the rotory position and add alarm status to data to transmit |
Brandond200 | 10:2eb7b1614bb8 | 103 | void addAlarmData(uint16_t positionArg){ |
Brandond200 | 10:2eb7b1614bb8 | 104 | int16_t position = positionArg / BYTE_TO_PERCENT; |
Brandond200 | 10:2eb7b1614bb8 | 105 | |
Brandond200 | 10:2eb7b1614bb8 | 106 | data[dataLength++] = ALARM_DATA_CHANNEL; |
Brandond200 | 10:2eb7b1614bb8 | 107 | data[dataLength++] = ALARM_DATA_TYPE; |
Brandond200 | 10:2eb7b1614bb8 | 108 | data[dataLength++] = (uint8_t)position >= ALARM_THRESHOLD; //add binary for it allar triggered or not |
Brandond200 | 10:2eb7b1614bb8 | 109 | } |
Brandond200 | 10:2eb7b1614bb8 | 110 | |
Brandond200 | 10:2eb7b1614bb8 | 111 | //callback for transmission timer |
Brandond200 | 10:2eb7b1614bb8 | 112 | void timerCallback(){ |
Brandond200 | 10:2eb7b1614bb8 | 113 | flashLED(BLINK_COUNT_TIMER_TRANSMIT); |
Brandond200 | 10:2eb7b1614bb8 | 114 | transmitData(rotary.read_u16()); |
Brandond200 | 10:2eb7b1614bb8 | 115 | } |
Brandond200 | 10:2eb7b1614bb8 | 116 | |
Brandond200 | 10:2eb7b1614bb8 | 117 | //start flash LED |
Brandond200 | 10:2eb7b1614bb8 | 118 | void flashLED(uint8_t times){ |
Brandond200 | 10:2eb7b1614bb8 | 119 | flashCount = times; //ste the number of times to flash |
Brandond200 | 10:2eb7b1614bb8 | 120 | led.write(1);//turn on LED |
Brandond200 | 10:2eb7b1614bb8 | 121 | TimerStart(&ledTimer);//start timer to toggle LED state |
Brandond200 | 10:2eb7b1614bb8 | 122 | } |
Brandond200 | 10:2eb7b1614bb8 | 123 | |
Brandond200 | 10:2eb7b1614bb8 | 124 | //callback to change state of LED for blinking |
Brandond200 | 10:2eb7b1614bb8 | 125 | void flashLEDCallback(){ |
Brandond200 | 10:2eb7b1614bb8 | 126 | //if the LED is on, turn it off |
Brandond200 | 10:2eb7b1614bb8 | 127 | if(led.read() == 1){ |
Brandond200 | 10:2eb7b1614bb8 | 128 | led.write(0); |
Brandond200 | 10:2eb7b1614bb8 | 129 | flashCount--; |
Brandond200 | 10:2eb7b1614bb8 | 130 | //if done flashing turn off the timer |
Brandond200 | 10:2eb7b1614bb8 | 131 | if(flashCount <= 0){ |
Brandond200 | 10:2eb7b1614bb8 | 132 | TimerStop(&ledTimer); |
Brandond200 | 10:2eb7b1614bb8 | 133 | } |
Brandond200 | 10:2eb7b1614bb8 | 134 | } |
Brandond200 | 10:2eb7b1614bb8 | 135 | //if LED is off, turn it on |
Brandond200 | 10:2eb7b1614bb8 | 136 | else{ |
Brandond200 | 10:2eb7b1614bb8 | 137 | led.write(1); |
Brandond200 | 10:2eb7b1614bb8 | 138 | } |
Brandond200 | 10:2eb7b1614bb8 | 139 | } |
Brandond200 | 10:2eb7b1614bb8 | 140 | |
Brandond200 | 10:2eb7b1614bb8 | 141 | //check if value passed in should trigger the alarm, if so, transmit |
Brandond200 | 10:2eb7b1614bb8 | 142 | void checkForAlarm(uint16_t positionArg){ |
Brandond200 | 10:2eb7b1614bb8 | 143 | //check if should trigger alarm |
Brandond200 | 10:2eb7b1614bb8 | 144 | if(positionArg / BYTE_TO_PERCENT > ALARM_THRESHOLD){ |
Brandond200 | 10:2eb7b1614bb8 | 145 | //if the alarm has not already been triggered |
Brandond200 | 8:fb8b53c490e1 | 146 | if(!alarmThresholdTirggered){ |
Brandond200 | 10:2eb7b1614bb8 | 147 | alarmThresholdTirggered = true;//set the alarm to triggered |
Brandond200 | 10:2eb7b1614bb8 | 148 | flashLED(BLINK_COUNT_EVENT_TRANSMIT); |
Brandond200 | 10:2eb7b1614bb8 | 149 | transmitData(positionArg);//transmit data |
Brandond200 | 8:fb8b53c490e1 | 150 | } |
Brandond200 | 8:fb8b53c490e1 | 151 | } |
Brandond200 | 8:fb8b53c490e1 | 152 | else if(alarmThresholdTirggered){ |
Brandond200 | 8:fb8b53c490e1 | 153 | alarmThresholdTirggered = false; |
Brandond200 | 8:fb8b53c490e1 | 154 | } |
Brandond200 | 8:fb8b53c490e1 | 155 | } |