Pulsating LEDs

Dependencies:   BLE_API mbed nRF51822

Fork of BLE_BADGE by David Adkins

Committer:
davidadkins1
Date:
Mon Jan 16 18:08:54 2017 +0000
Revision:
10:fdf87f019389
Parent:
9:5f0732aa3008
Pulsating function

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rgrover1 0:2130d7f559dc 1 /* mbed Microcontroller Library
rgrover1 0:2130d7f559dc 2 * Copyright (c) 2006-2013 ARM Limited
rgrover1 0:2130d7f559dc 3 *
rgrover1 0:2130d7f559dc 4 * Licensed under the Apache License, Version 2.0 (the "License");
rgrover1 0:2130d7f559dc 5 * you may not use this file except in compliance with the License.
rgrover1 0:2130d7f559dc 6 * You may obtain a copy of the License at
rgrover1 0:2130d7f559dc 7 *
rgrover1 0:2130d7f559dc 8 * http://www.apache.org/licenses/LICENSE-2.0
rgrover1 0:2130d7f559dc 9 *
rgrover1 0:2130d7f559dc 10 * Unless required by applicable law or agreed to in writing, software
rgrover1 0:2130d7f559dc 11 * distributed under the License is distributed on an "AS IS" BASIS,
rgrover1 0:2130d7f559dc 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rgrover1 0:2130d7f559dc 13 * See the License for the specific language governing permissions and
rgrover1 0:2130d7f559dc 14 * limitations under the License.
rgrover1 0:2130d7f559dc 15 */
rgrover1 0:2130d7f559dc 16
rgrover1 5:2607923acfa1 17 #include <string.h>
rgrover1 0:2130d7f559dc 18 #include "mbed.h"
rgrover1 8:f9bf6d403cde 19 #include "BLE.h"
rgrover1 0:2130d7f559dc 20
rgrover1 0:2130d7f559dc 21 #include "UARTService.h"
rgrover1 0:2130d7f559dc 22
davidadkins1 10:fdf87f019389 23 #define NEED_CONSOLE_OUTPUT 0 /* Set this if you need debug messages on the console;
rgrover1 0:2130d7f559dc 24 * it will have an impact on code-size and power consumption. */
davidadkins1 10:fdf87f019389 25
davidadkins1 10:fdf87f019389 26 #define TXRX_BUF_LEN 20
davidadkins1 10:fdf87f019389 27
davidadkins1 10:fdf87f019389 28 // sinetable is loaded with a progressive tick time
davidadkins1 10:fdf87f019389 29 // designed to continuesly vary the PWM period
davidadkins1 10:fdf87f019389 30 // for a 5 secound time frame.
davidadkins1 10:fdf87f019389 31 extern float sinetable[256];
davidadkins1 10:fdf87f019389 32
davidadkins1 10:fdf87f019389 33 // LED defines and variables
davidadkins1 10:fdf87f019389 34 #define GREEN_LED_PIN P0_7
davidadkins1 10:fdf87f019389 35 #define RED_LED_PIN P0_3
davidadkins1 10:fdf87f019389 36
davidadkins1 10:fdf87f019389 37 #define LED_ON 0x00
davidadkins1 10:fdf87f019389 38 #define LED_OFF 0x01
davidadkins1 10:fdf87f019389 39 #define MAX_LED_LEVEL 0x0A
davidadkins1 10:fdf87f019389 40
davidadkins1 10:fdf87f019389 41 // Command set
davidadkins1 10:fdf87f019389 42 #define CMD_GREEN 0x01
davidadkins1 10:fdf87f019389 43 #define CMD_RED 0x02
davidadkins1 10:fdf87f019389 44 #define CMD_OFF 0x03
davidadkins1 10:fdf87f019389 45
davidadkins1 10:fdf87f019389 46 #define TICK_FRAME 0.02
davidadkins1 10:fdf87f019389 47
davidadkins1 10:fdf87f019389 48 DigitalOut LED_SET_GREEN(GREEN_LED_PIN);
davidadkins1 10:fdf87f019389 49 DigitalOut LED_SET_RED(RED_LED_PIN);
davidadkins1 10:fdf87f019389 50 Ticker led_pwm_tick; // for LED PWM
davidadkins1 10:fdf87f019389 51
davidadkins1 10:fdf87f019389 52 uint8_t next_angle = 0; // Counter for 5 secound pulsating
davidadkins1 10:fdf87f019389 53 float next_tick; // Current PWM pulse width
davidadkins1 10:fdf87f019389 54 uint8_t led_brightness = 0; // Used to scale the PWM period
davidadkins1 10:fdf87f019389 55 // 0 is off, 10 is always on
rgrover1 0:2130d7f559dc 56
rgrover1 0:2130d7f559dc 57 #if NEED_CONSOLE_OUTPUT
rgrover1 5:2607923acfa1 58 #define DEBUG(STR) { if (uart) uart->write(STR, strlen(STR)); }
rgrover1 0:2130d7f559dc 59 #else
rgrover1 0:2130d7f559dc 60 #define DEBUG(...) /* nothing */
rgrover1 0:2130d7f559dc 61 #endif /* #if NEED_CONSOLE_OUTPUT */
rgrover1 0:2130d7f559dc 62
rgrover1 0:2130d7f559dc 63 BLEDevice ble;
rgrover1 5:2607923acfa1 64 UARTService *uart;
davidadkins1 10:fdf87f019389 65 uint8_t txPayload[TXRX_BUF_LEN] = {0,};
davidadkins1 10:fdf87f019389 66 //static const uint8_t uart_tx_uuid[] = {0x71, 0x3D, 0, 3, 0x50, 0x3E, 0x4C, 0x75, 0xBA, 0x94, 0x31, 0x48, 0xF1, 0x8D, 0x94, 0x1E};
davidadkins1 10:fdf87f019389 67
davidadkins1 10:fdf87f019389 68 //GattCharacteristic txCharacteristic (uart_tx_uuid, txPayload, 1, TXRX_BUF_LEN, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE);
davidadkins1 10:fdf87f019389 69
davidadkins1 10:fdf87f019389 70 // Local prototypes
davidadkins1 10:fdf87f019389 71 void green_pwm_tick_off(void);
davidadkins1 10:fdf87f019389 72 void green_pwm_tick_on(void);
davidadkins1 10:fdf87f019389 73 void red_pwm_tick_off(void);
davidadkins1 10:fdf87f019389 74 void red_pwm_tick_on(void);
davidadkins1 10:fdf87f019389 75 void pwm_tick_min(void);
davidadkins1 10:fdf87f019389 76
rgrover1 0:2130d7f559dc 77
rgrover1 9:5f0732aa3008 78 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
rgrover1 0:2130d7f559dc 79 {
davidadkins1 10:fdf87f019389 80 //DEBUG("Disconnected!\n\r");
davidadkins1 10:fdf87f019389 81 //DEBUG("Restarting the advertising process\n\r");
rgrover1 0:2130d7f559dc 82 ble.startAdvertising();
rgrover1 0:2130d7f559dc 83 }
rgrover1 0:2130d7f559dc 84
davidadkins1 10:fdf87f019389 85 void WrittenHandler(const GattWriteCallbackParams *Handler)
davidadkins1 10:fdf87f019389 86 {
davidadkins1 10:fdf87f019389 87 uint8_t buf[TXRX_BUF_LEN];
davidadkins1 10:fdf87f019389 88 //uint16_t bytesRead;
davidadkins1 10:fdf87f019389 89 //uint16_t index;
davidadkins1 10:fdf87f019389 90 //if (Handler->handle == txCharacteristic.getValueAttribute().getHandle())
davidadkins1 10:fdf87f019389 91 {
davidadkins1 10:fdf87f019389 92 //ble.readCharacteristicValue(txCharacteristic.getValueAttribute().getHandle(), buf, &bytesRead);
davidadkins1 10:fdf87f019389 93 //memset(txPayload, 0, TXRX_BUF_LEN);
davidadkins1 10:fdf87f019389 94 //memcpy(txPayload, buf, TXRX_BUF_LEN);
davidadkins1 10:fdf87f019389 95 buf[0] = uart->_getc();
davidadkins1 10:fdf87f019389 96
davidadkins1 10:fdf87f019389 97
davidadkins1 10:fdf87f019389 98 if(CMD_GREEN == buf[0])
davidadkins1 10:fdf87f019389 99 {
davidadkins1 10:fdf87f019389 100 led_brightness = uart->_getc();
davidadkins1 10:fdf87f019389 101
davidadkins1 10:fdf87f019389 102 if(led_brightness > MAX_LED_LEVEL)
davidadkins1 10:fdf87f019389 103 {
davidadkins1 10:fdf87f019389 104 led_brightness = MAX_LED_LEVEL;
davidadkins1 10:fdf87f019389 105 }
davidadkins1 10:fdf87f019389 106
davidadkins1 10:fdf87f019389 107 if(MAX_LED_LEVEL == led_brightness)
davidadkins1 10:fdf87f019389 108 {
davidadkins1 10:fdf87f019389 109 LED_SET_GREEN = LED_ON;
davidadkins1 10:fdf87f019389 110 led_pwm_tick.attach(pwm_tick_min, 5.0);
davidadkins1 10:fdf87f019389 111 }
davidadkins1 10:fdf87f019389 112 else if(0 == led_brightness)
davidadkins1 10:fdf87f019389 113 {
davidadkins1 10:fdf87f019389 114 LED_SET_GREEN = LED_OFF;
davidadkins1 10:fdf87f019389 115 led_pwm_tick.attach(pwm_tick_min, 5.0);
davidadkins1 10:fdf87f019389 116 }
davidadkins1 10:fdf87f019389 117 else
davidadkins1 10:fdf87f019389 118 {
davidadkins1 10:fdf87f019389 119 led_pwm_tick.attach(green_pwm_tick_on, .001);
davidadkins1 10:fdf87f019389 120 next_angle = 0;
davidadkins1 10:fdf87f019389 121 }
davidadkins1 10:fdf87f019389 122
davidadkins1 10:fdf87f019389 123 LED_SET_RED = LED_OFF;
davidadkins1 10:fdf87f019389 124 }
davidadkins1 10:fdf87f019389 125 else if(CMD_RED == buf[0])
davidadkins1 10:fdf87f019389 126 {
davidadkins1 10:fdf87f019389 127 led_brightness = uart->_getc();
davidadkins1 10:fdf87f019389 128
davidadkins1 10:fdf87f019389 129 if(led_brightness > MAX_LED_LEVEL)
davidadkins1 10:fdf87f019389 130 {
davidadkins1 10:fdf87f019389 131 led_brightness = MAX_LED_LEVEL;
davidadkins1 10:fdf87f019389 132 }
davidadkins1 10:fdf87f019389 133
davidadkins1 10:fdf87f019389 134 if(MAX_LED_LEVEL == led_brightness)
davidadkins1 10:fdf87f019389 135 {
davidadkins1 10:fdf87f019389 136 LED_SET_RED = LED_ON;
davidadkins1 10:fdf87f019389 137 led_pwm_tick.attach(pwm_tick_min, 5.0);
davidadkins1 10:fdf87f019389 138 }
davidadkins1 10:fdf87f019389 139 else if(0 == led_brightness)
davidadkins1 10:fdf87f019389 140 {
davidadkins1 10:fdf87f019389 141 LED_SET_RED = LED_OFF;
davidadkins1 10:fdf87f019389 142 led_pwm_tick.attach(pwm_tick_min, 5.0);
davidadkins1 10:fdf87f019389 143 }
davidadkins1 10:fdf87f019389 144 else
davidadkins1 10:fdf87f019389 145 {
davidadkins1 10:fdf87f019389 146 LED_SET_RED = LED_ON;
davidadkins1 10:fdf87f019389 147 led_pwm_tick.attach(red_pwm_tick_on, .001);
davidadkins1 10:fdf87f019389 148 }
davidadkins1 10:fdf87f019389 149
davidadkins1 10:fdf87f019389 150 LED_SET_GREEN = LED_OFF;
davidadkins1 10:fdf87f019389 151 }
davidadkins1 10:fdf87f019389 152 else if(CMD_OFF == buf[0])
davidadkins1 10:fdf87f019389 153 {
davidadkins1 10:fdf87f019389 154 LED_SET_GREEN = LED_OFF;
davidadkins1 10:fdf87f019389 155 LED_SET_RED = LED_OFF;
davidadkins1 10:fdf87f019389 156 led_pwm_tick.attach(pwm_tick_min, 5.0);
davidadkins1 10:fdf87f019389 157 }
davidadkins1 10:fdf87f019389 158 }
davidadkins1 10:fdf87f019389 159 }
davidadkins1 10:fdf87f019389 160
davidadkins1 10:fdf87f019389 161 void pwm_tick_min()
rgrover1 0:2130d7f559dc 162 {
davidadkins1 10:fdf87f019389 163 // do nothing in this tick while LED's are off
davidadkins1 10:fdf87f019389 164 // 5 second tick to allow processor max sleep time
davidadkins1 10:fdf87f019389 165 }
davidadkins1 10:fdf87f019389 166
davidadkins1 10:fdf87f019389 167 void green_pwm_tick_on(void)
davidadkins1 10:fdf87f019389 168 {
davidadkins1 10:fdf87f019389 169 next_tick = sinetable[next_angle] * ((float)led_brightness / (MAX_LED_LEVEL - 1));
davidadkins1 10:fdf87f019389 170
davidadkins1 10:fdf87f019389 171 LED_SET_GREEN = LED_ON;
davidadkins1 10:fdf87f019389 172 led_pwm_tick.attach(green_pwm_tick_off, next_tick);
davidadkins1 10:fdf87f019389 173 }
davidadkins1 10:fdf87f019389 174
davidadkins1 10:fdf87f019389 175 void green_pwm_tick_off()
davidadkins1 10:fdf87f019389 176 {
davidadkins1 10:fdf87f019389 177 next_tick = TICK_FRAME - next_tick;
davidadkins1 10:fdf87f019389 178
davidadkins1 10:fdf87f019389 179 LED_SET_GREEN = LED_OFF;
davidadkins1 10:fdf87f019389 180 led_pwm_tick.attach(green_pwm_tick_on, next_tick);
davidadkins1 10:fdf87f019389 181
davidadkins1 10:fdf87f019389 182 ++next_angle;
davidadkins1 10:fdf87f019389 183 }
davidadkins1 10:fdf87f019389 184
davidadkins1 10:fdf87f019389 185 void red_pwm_tick_on(void)
davidadkins1 10:fdf87f019389 186 {
davidadkins1 10:fdf87f019389 187 next_tick = sinetable[next_angle] * ((float)led_brightness / (MAX_LED_LEVEL - 1));
davidadkins1 10:fdf87f019389 188
davidadkins1 10:fdf87f019389 189 LED_SET_RED = LED_ON;
davidadkins1 10:fdf87f019389 190 led_pwm_tick.attach(red_pwm_tick_off, next_tick);
davidadkins1 10:fdf87f019389 191 }
davidadkins1 10:fdf87f019389 192
davidadkins1 10:fdf87f019389 193 void red_pwm_tick_off()
davidadkins1 10:fdf87f019389 194 {
davidadkins1 10:fdf87f019389 195 next_tick = TICK_FRAME - next_tick;
davidadkins1 10:fdf87f019389 196
davidadkins1 10:fdf87f019389 197 LED_SET_RED = LED_OFF;
davidadkins1 10:fdf87f019389 198 led_pwm_tick.attach(red_pwm_tick_on, next_tick);
davidadkins1 10:fdf87f019389 199
davidadkins1 10:fdf87f019389 200 ++next_angle;
rgrover1 0:2130d7f559dc 201 }
rgrover1 0:2130d7f559dc 202
rgrover1 0:2130d7f559dc 203 int main(void)
rgrover1 0:2130d7f559dc 204 {
davidadkins1 10:fdf87f019389 205 LED_SET_GREEN = LED_OFF;
davidadkins1 10:fdf87f019389 206 LED_SET_RED = LED_OFF;
davidadkins1 10:fdf87f019389 207
rgrover1 0:2130d7f559dc 208 ble.init();
rgrover1 0:2130d7f559dc 209 ble.onDisconnection(disconnectionCallback);
davidadkins1 10:fdf87f019389 210 ble.onDataWritten(WrittenHandler);
davidadkins1 10:fdf87f019389 211
davidadkins1 10:fdf87f019389 212 //led_brightness = 5;
davidadkins1 10:fdf87f019389 213 led_pwm_tick.attach(pwm_tick_min, 5.0); //
rgrover1 5:2607923acfa1 214
rgrover1 5:2607923acfa1 215 uart = new UARTService(ble);
rgrover1 0:2130d7f559dc 216
rgrover1 0:2130d7f559dc 217 /* setup advertising */
rgrover1 0:2130d7f559dc 218 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
rgrover1 0:2130d7f559dc 219 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
rgrover1 0:2130d7f559dc 220 ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
davidadkins1 10:fdf87f019389 221 (const uint8_t *)"Smart Badge", sizeof("Smart Badge") - 1);
rgrover1 0:2130d7f559dc 222 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
davidadkins1 10:fdf87f019389 223 (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
rgrover1 0:2130d7f559dc 224
davidadkins1 10:fdf87f019389 225 ble.gap().setAdvertisingInterval(2000); /* in multiples of 1 ms. */
davidadkins1 10:fdf87f019389 226 ble.gap().setTxPower(-40);
rgrover1 0:2130d7f559dc 227
davidadkins1 10:fdf87f019389 228 ble.gap().startAdvertising();
davidadkins1 10:fdf87f019389 229
davidadkins1 10:fdf87f019389 230 while (true)
davidadkins1 10:fdf87f019389 231 {
rgrover1 0:2130d7f559dc 232 ble.waitForEvent();
rgrover1 0:2130d7f559dc 233 }
rgrover1 0:2130d7f559dc 234 }