BTLE demo for MAXWSNENV.

Dependencies:   BLE_API BMP180 Si7020 mbed MaximBLE

Committer:
kgills
Date:
Fri Jul 10 21:28:56 2015 +0000
Revision:
0:f71931ae3db1
Adding MAXWSNENV_demo.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kgills 0:f71931ae3db1 1 /*******************************************************************************
kgills 0:f71931ae3db1 2 * Copyright (C) 2015 Maxim Integrated Products, Inc., All Rights Reserved.
kgills 0:f71931ae3db1 3 *
kgills 0:f71931ae3db1 4 * Permission is hereby granted, free of charge, to any person obtaining a
kgills 0:f71931ae3db1 5 * copy of this software and associated documentation files (the "Software"),
kgills 0:f71931ae3db1 6 * to deal in the Software without restriction, including without limitation
kgills 0:f71931ae3db1 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
kgills 0:f71931ae3db1 8 * and/or sell copies of the Software, and to permit persons to whom the
kgills 0:f71931ae3db1 9 * Software is furnished to do so, subject to the following conditions:
kgills 0:f71931ae3db1 10 *
kgills 0:f71931ae3db1 11 * The above copyright notice and this permission notice shall be included
kgills 0:f71931ae3db1 12 * in all copies or substantial portions of the Software.
kgills 0:f71931ae3db1 13 *
kgills 0:f71931ae3db1 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
kgills 0:f71931ae3db1 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
kgills 0:f71931ae3db1 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
kgills 0:f71931ae3db1 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
kgills 0:f71931ae3db1 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
kgills 0:f71931ae3db1 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
kgills 0:f71931ae3db1 20 * OTHER DEALINGS IN THE SOFTWARE.
kgills 0:f71931ae3db1 21 *
kgills 0:f71931ae3db1 22 * Except as contained in this notice, the name of Maxim Integrated
kgills 0:f71931ae3db1 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
kgills 0:f71931ae3db1 24 * Products, Inc. Branding Policy.
kgills 0:f71931ae3db1 25 *
kgills 0:f71931ae3db1 26 * The mere transfer of this software does not imply any licenses
kgills 0:f71931ae3db1 27 * of trade secrets, proprietary technology, copyrights, patents,
kgills 0:f71931ae3db1 28 * trademarks, maskwork rights, or any other form of intellectual
kgills 0:f71931ae3db1 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
kgills 0:f71931ae3db1 30 * ownership rights.
kgills 0:f71931ae3db1 31 *******************************************************************************
kgills 0:f71931ae3db1 32 */
kgills 0:f71931ae3db1 33
kgills 0:f71931ae3db1 34 #ifndef __LOG_CHARACTERISTIC_H__
kgills 0:f71931ae3db1 35 #define __LOG_CHARACTERISTIC_H__
kgills 0:f71931ae3db1 36
kgills 0:f71931ae3db1 37 #ifndef FIFO_SIZE
kgills 0:f71931ae3db1 38 #define FIFO_SIZE 768
kgills 0:f71931ae3db1 39 #endif
kgills 0:f71931ae3db1 40
kgills 0:f71931ae3db1 41 // 92e53a24-c294-406c-b64b-b401ae2e9982
kgills 0:f71931ae3db1 42 static const uint8_t LogCharUUID[] = { 0x82,0x99,0x2e,0xae,0x01,0xb4,0x4b,0xb6,0x6c,0x40,0x94,0xc2,0x24,0x3a,0xe5,0x92 };
kgills 0:f71931ae3db1 43
kgills 0:f71931ae3db1 44 class LogCharacteristic
kgills 0:f71931ae3db1 45 {
kgills 0:f71931ae3db1 46 public:
kgills 0:f71931ae3db1 47
kgills 0:f71931ae3db1 48 typedef struct {
kgills 0:f71931ae3db1 49 float value;
kgills 0:f71931ae3db1 50 time_t time;
kgills 0:f71931ae3db1 51 } qElement_t;
kgills 0:f71931ae3db1 52
kgills 0:f71931ae3db1 53 LogCharacteristic(void) :
kgills 0:f71931ae3db1 54 numValues(0),
kgills 0:f71931ae3db1 55 gattChar(LogCharUUID, (uint8_t*)&numValues, sizeof(numValues),
kgills 0:f71931ae3db1 56 sizeof(numValues), GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ)
kgills 0:f71931ae3db1 57 {
kgills 0:f71931ae3db1 58 clear();
kgills 0:f71931ae3db1 59 }
kgills 0:f71931ae3db1 60
kgills 0:f71931ae3db1 61 GattCharacteristic* getChar(void)
kgills 0:f71931ae3db1 62 {
kgills 0:f71931ae3db1 63 return &gattChar;
kgills 0:f71931ae3db1 64 }
kgills 0:f71931ae3db1 65
kgills 0:f71931ae3db1 66 /**
kgills 0:f71931ae3db1 67 * @brief Clear the log
kgills 0:f71931ae3db1 68 */
kgills 0:f71931ae3db1 69 void clear(void) {
kgills 0:f71931ae3db1 70 // atomic FIFO access
kgills 0:f71931ae3db1 71 __disable_irq();
kgills 0:f71931ae3db1 72
kgills 0:f71931ae3db1 73 rindex = 0;
kgills 0:f71931ae3db1 74 windex = 0;
kgills 0:f71931ae3db1 75 numValues = 0;
kgills 0:f71931ae3db1 76
kgills 0:f71931ae3db1 77 __enable_irq();
kgills 0:f71931ae3db1 78 }
kgills 0:f71931ae3db1 79
kgills 0:f71931ae3db1 80 /**
kgills 0:f71931ae3db1 81 * @brief Add a new element to the log
kgills 0:f71931ae3db1 82 * @param element to add to the log
kgills 0:f71931ae3db1 83 */
kgills 0:f71931ae3db1 84 void put(qElement_t element) {
kgills 0:f71931ae3db1 85
kgills 0:f71931ae3db1 86 // Check if FIFO is full
kgills 0:f71931ae3db1 87 if (numValues == FIFO_SIZE) {
kgills 0:f71931ae3db1 88
kgills 0:f71931ae3db1 89 fifoReduce();
kgills 0:f71931ae3db1 90 }
kgills 0:f71931ae3db1 91
kgills 0:f71931ae3db1 92 // atomic FIFO access
kgills 0:f71931ae3db1 93 __disable_irq();
kgills 0:f71931ae3db1 94
kgills 0:f71931ae3db1 95 // Put data into FIFO
kgills 0:f71931ae3db1 96 element_fifo[windex] = element;
kgills 0:f71931ae3db1 97
kgills 0:f71931ae3db1 98 // Increment pointer
kgills 0:f71931ae3db1 99 windex++;
kgills 0:f71931ae3db1 100 if (windex == FIFO_SIZE) {
kgills 0:f71931ae3db1 101 windex = 0;
kgills 0:f71931ae3db1 102 }
kgills 0:f71931ae3db1 103
kgills 0:f71931ae3db1 104 numValues++;
kgills 0:f71931ae3db1 105
kgills 0:f71931ae3db1 106 __enable_irq();
kgills 0:f71931ae3db1 107 }
kgills 0:f71931ae3db1 108
kgills 0:f71931ae3db1 109 /**
kgills 0:f71931ae3db1 110 * @brief Get the oldest element from the log
kgills 0:f71931ae3db1 111 * @return element from the log
kgills 0:f71931ae3db1 112 */
kgills 0:f71931ae3db1 113 qElement_t get(void) {
kgills 0:f71931ae3db1 114 qElement_t element = {0};
kgills 0:f71931ae3db1 115
kgills 0:f71931ae3db1 116 // Check if empty
kgills 0:f71931ae3db1 117 if (numValues == 0) {
kgills 0:f71931ae3db1 118 return element;
kgills 0:f71931ae3db1 119 }
kgills 0:f71931ae3db1 120
kgills 0:f71931ae3db1 121 // atomic FIFO access
kgills 0:f71931ae3db1 122 __disable_irq();
kgills 0:f71931ae3db1 123
kgills 0:f71931ae3db1 124 // Get data from FIFO
kgills 0:f71931ae3db1 125 element = element_fifo[rindex];
kgills 0:f71931ae3db1 126
kgills 0:f71931ae3db1 127 // Increment pointer
kgills 0:f71931ae3db1 128 rindex++;
kgills 0:f71931ae3db1 129 if (rindex == FIFO_SIZE) {
kgills 0:f71931ae3db1 130 rindex = 0;
kgills 0:f71931ae3db1 131 }
kgills 0:f71931ae3db1 132
kgills 0:f71931ae3db1 133 numValues--;
kgills 0:f71931ae3db1 134
kgills 0:f71931ae3db1 135 __enable_irq();
kgills 0:f71931ae3db1 136
kgills 0:f71931ae3db1 137 return element;
kgills 0:f71931ae3db1 138 }
kgills 0:f71931ae3db1 139
kgills 0:f71931ae3db1 140 /**
kgills 0:f71931ae3db1 141 * @brief Get the length of the log
kgills 0:f71931ae3db1 142 * @return length of the log
kgills 0:f71931ae3db1 143 */
kgills 0:f71931ae3db1 144 int len(void) {
kgills 0:f71931ae3db1 145 return numValues;
kgills 0:f71931ae3db1 146 }
kgills 0:f71931ae3db1 147
kgills 0:f71931ae3db1 148 private:
kgills 0:f71931ae3db1 149
kgills 0:f71931ae3db1 150 // Remove every other element from the FIFO
kgills 0:f71931ae3db1 151 void fifoReduce(void)
kgills 0:f71931ae3db1 152 {
kgills 0:f71931ae3db1 153 // atomic FIFO access
kgills 0:f71931ae3db1 154 __disable_irq();
kgills 0:f71931ae3db1 155
kgills 0:f71931ae3db1 156 // i is the number of reductions
kgills 0:f71931ae3db1 157 int i = 0;
kgills 0:f71931ae3db1 158 while(i < (FIFO_SIZE/2)){
kgills 0:f71931ae3db1 159
kgills 0:f71931ae3db1 160 // Position of new value has not rolled over
kgills 0:f71931ae3db1 161 if(rindex+i < FIFO_SIZE) {
kgills 0:f71931ae3db1 162
kgills 0:f71931ae3db1 163 // Position of reduced value has not rolled over
kgills 0:f71931ae3db1 164 if(rindex+2*i < FIFO_SIZE) {
kgills 0:f71931ae3db1 165 element_fifo[rindex+i] = element_fifo[rindex+2*i];
kgills 0:f71931ae3db1 166 }
kgills 0:f71931ae3db1 167
kgills 0:f71931ae3db1 168 // Position of reduced value has rolled over
kgills 0:f71931ae3db1 169 else {
kgills 0:f71931ae3db1 170 element_fifo[rindex+i] = element_fifo[rindex+2*i-FIFO_SIZE];
kgills 0:f71931ae3db1 171 }
kgills 0:f71931ae3db1 172 }
kgills 0:f71931ae3db1 173
kgills 0:f71931ae3db1 174 // Position of new value has rolled over
kgills 0:f71931ae3db1 175 else {
kgills 0:f71931ae3db1 176 element_fifo[rindex+i-FIFO_SIZE] = element_fifo[rindex+2*i-FIFO_SIZE];
kgills 0:f71931ae3db1 177 }
kgills 0:f71931ae3db1 178
kgills 0:f71931ae3db1 179 i++;
kgills 0:f71931ae3db1 180 }
kgills 0:f71931ae3db1 181
kgills 0:f71931ae3db1 182 if(rindex < FIFO_SIZE/2) {
kgills 0:f71931ae3db1 183 windex = rindex + FIFO_SIZE/2;
kgills 0:f71931ae3db1 184 } else {
kgills 0:f71931ae3db1 185 windex = rindex - FIFO_SIZE/2;
kgills 0:f71931ae3db1 186 }
kgills 0:f71931ae3db1 187
kgills 0:f71931ae3db1 188 numValues = FIFO_SIZE/2;
kgills 0:f71931ae3db1 189
kgills 0:f71931ae3db1 190 __enable_irq();
kgills 0:f71931ae3db1 191 }
kgills 0:f71931ae3db1 192
kgills 0:f71931ae3db1 193 uint16_t numValues;
kgills 0:f71931ae3db1 194 GattCharacteristic gattChar;
kgills 0:f71931ae3db1 195
kgills 0:f71931ae3db1 196 // FIFO variables
kgills 0:f71931ae3db1 197 unsigned int rindex;
kgills 0:f71931ae3db1 198 unsigned int windex;
kgills 0:f71931ae3db1 199 qElement_t element_fifo[FIFO_SIZE];
kgills 0:f71931ae3db1 200 };
kgills 0:f71931ae3db1 201
kgills 0:f71931ae3db1 202 #endif /* __LOG_CHARACTERISTIC_H__ */