BLE FORK
Dependencies: BLE_API mbed nRF51822
Fork of BLE_HeartRate by
main.cpp@77:3273a1d44741, 2016-10-26 (annotated)
- Committer:
- paulocroman
- Date:
- Wed Oct 26 00:25:49 2016 +0000
- Revision:
- 77:3273a1d44741
- Parent:
- 75:8128a06c0a21
BLE PPG
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ktownsend | 0:87a7fc231fae | 1 | /* mbed Microcontroller Library |
rgrover1 | 67:b2d2dee347c0 | 2 | * Copyright (c) 2006-2015 ARM Limited |
ktownsend | 0:87a7fc231fae | 3 | * |
ktownsend | 0:87a7fc231fae | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
ktownsend | 0:87a7fc231fae | 5 | * you may not use this file except in compliance with the License. |
ktownsend | 0:87a7fc231fae | 6 | * You may obtain a copy of the License at |
ktownsend | 0:87a7fc231fae | 7 | * |
ktownsend | 0:87a7fc231fae | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
ktownsend | 0:87a7fc231fae | 9 | * |
ktownsend | 0:87a7fc231fae | 10 | * Unless required by applicable law or agreed to in writing, software |
ktownsend | 0:87a7fc231fae | 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
ktownsend | 0:87a7fc231fae | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
ktownsend | 0:87a7fc231fae | 13 | * See the License for the specific language governing permissions and |
ktownsend | 0:87a7fc231fae | 14 | * limitations under the License. |
ktownsend | 0:87a7fc231fae | 15 | */ |
ktownsend | 0:87a7fc231fae | 16 | |
ktownsend | 0:87a7fc231fae | 17 | #include "mbed.h" |
rgrover1 | 67:b2d2dee347c0 | 18 | #include "ble/BLE.h" |
rgrover1 | 67:b2d2dee347c0 | 19 | #include "ble/services/HeartRateService.h" |
rgrover1 | 67:b2d2dee347c0 | 20 | #include "ble/services/BatteryService.h" |
rgrover1 | 67:b2d2dee347c0 | 21 | #include "ble/services/DeviceInformationService.h" |
ktownsend | 0:87a7fc231fae | 22 | |
paulocroman | 77:3273a1d44741 | 23 | DigitalOut led(p21); |
paulocroman | 77:3273a1d44741 | 24 | Serial s(USBTX, USBRX); |
paulocroman | 77:3273a1d44741 | 25 | SPI spi(p25, p28, p29); // mosi, miso, sclk |
paulocroman | 77:3273a1d44741 | 26 | DigitalOut STE(p24); |
paulocroman | 77:3273a1d44741 | 27 | |
paulocroman | 77:3273a1d44741 | 28 | Timer t; |
paulocroman | 77:3273a1d44741 | 29 | |
paulocroman | 77:3273a1d44741 | 30 | #define CONTROL0 0x00 |
paulocroman | 77:3273a1d44741 | 31 | #define LED2STC 0x01 |
paulocroman | 77:3273a1d44741 | 32 | #define LED2ENDC 0x02 |
paulocroman | 77:3273a1d44741 | 33 | #define LED2LEDSTC 0x03 |
paulocroman | 77:3273a1d44741 | 34 | #define LED2LEDENDC 0x04 |
paulocroman | 77:3273a1d44741 | 35 | #define ALED2STC 0x05 |
paulocroman | 77:3273a1d44741 | 36 | #define ALED2ENDC 0x06 |
paulocroman | 77:3273a1d44741 | 37 | #define LED1STC 0x07 |
paulocroman | 77:3273a1d44741 | 38 | #define LED1ENDC 0x08 |
paulocroman | 77:3273a1d44741 | 39 | #define LED1LEDSTC 0x09 |
paulocroman | 77:3273a1d44741 | 40 | #define LED1LEDENDC 0x0a |
paulocroman | 77:3273a1d44741 | 41 | #define ALED1STC 0x0b |
paulocroman | 77:3273a1d44741 | 42 | #define ALED1ENDC 0x0c |
paulocroman | 77:3273a1d44741 | 43 | #define LED2CONVST 0x0d |
paulocroman | 77:3273a1d44741 | 44 | #define LED2CONVEND 0x0e |
paulocroman | 77:3273a1d44741 | 45 | #define ALED2CONVST 0x0f |
paulocroman | 77:3273a1d44741 | 46 | #define ALED2CONVEND 0x10 |
paulocroman | 77:3273a1d44741 | 47 | #define LED1CONVST 0x11 |
paulocroman | 77:3273a1d44741 | 48 | #define LED1CONVEND 0x12 |
paulocroman | 77:3273a1d44741 | 49 | #define ALED1CONVST 0x13 |
paulocroman | 77:3273a1d44741 | 50 | #define ALED1CONVEND 0x14 |
paulocroman | 77:3273a1d44741 | 51 | #define ADCRSTSTCT0 0x15 |
paulocroman | 77:3273a1d44741 | 52 | #define ADCRSTENDCT0 0x16 |
paulocroman | 77:3273a1d44741 | 53 | #define ADCRSTSTCT1 0x17 |
paulocroman | 77:3273a1d44741 | 54 | #define ADCRSTENDCT1 0x18 |
paulocroman | 77:3273a1d44741 | 55 | #define ADCRSTSTCT2 0x19 |
paulocroman | 77:3273a1d44741 | 56 | #define ADCRSTENDCT2 0x1a |
paulocroman | 77:3273a1d44741 | 57 | #define ADCRSTSTCT3 0x1b |
paulocroman | 77:3273a1d44741 | 58 | #define ADCRSTENDCT3 0x1c |
paulocroman | 77:3273a1d44741 | 59 | #define PRPCOUNT 0x1d |
paulocroman | 77:3273a1d44741 | 60 | #define CONTROL1 0x1e |
paulocroman | 77:3273a1d44741 | 61 | #define SPARE1 0x1f |
paulocroman | 77:3273a1d44741 | 62 | #define TIAGAIN 0x20 |
paulocroman | 77:3273a1d44741 | 63 | #define TIA_AMB_GAIN 0x21 |
paulocroman | 77:3273a1d44741 | 64 | #define LEDCNTRL 0x22 |
paulocroman | 77:3273a1d44741 | 65 | #define CONTROL2 0x23 |
paulocroman | 77:3273a1d44741 | 66 | #define SPARE2 0x24 |
paulocroman | 77:3273a1d44741 | 67 | #define SPARE3 0x25 |
paulocroman | 77:3273a1d44741 | 68 | #define SPARE4 0x26 |
paulocroman | 77:3273a1d44741 | 69 | #define SPARE4 0x26 |
paulocroman | 77:3273a1d44741 | 70 | #define RESERVED1 0x27 |
paulocroman | 77:3273a1d44741 | 71 | #define RESERVED2 0x28 |
paulocroman | 77:3273a1d44741 | 72 | #define ALARM 0x29 |
paulocroman | 77:3273a1d44741 | 73 | #define LED2VAL 0x2a |
paulocroman | 77:3273a1d44741 | 74 | #define ALED2VAL 0x2b |
paulocroman | 77:3273a1d44741 | 75 | #define LED1VAL 0x2c |
paulocroman | 77:3273a1d44741 | 76 | #define ALED1VAL 0x2d |
paulocroman | 77:3273a1d44741 | 77 | #define LED2ABSVAL 0x2e |
paulocroman | 77:3273a1d44741 | 78 | #define LED1ABSVAL 0x2f |
paulocroman | 77:3273a1d44741 | 79 | #define DIAG 0x30 |
paulocroman | 77:3273a1d44741 | 80 | |
paulocroman | 77:3273a1d44741 | 81 | void RegisterWrite(uint8_t address, uint32_t data) { |
paulocroman | 77:3273a1d44741 | 82 | STE = 0; |
paulocroman | 77:3273a1d44741 | 83 | spi.write(address); // send address to device |
paulocroman | 77:3273a1d44741 | 84 | spi.write((data >> 16) & 0xFF); // writing top 8 bits |
paulocroman | 77:3273a1d44741 | 85 | spi.write((data >> 8) & 0xFF); // writing middle 8 bits |
paulocroman | 77:3273a1d44741 | 86 | spi.write(data & 0xFF); // writing bottom 8 bits |
paulocroman | 77:3273a1d44741 | 87 | STE = 1; |
paulocroman | 77:3273a1d44741 | 88 | } |
paulocroman | 77:3273a1d44741 | 89 | |
paulocroman | 77:3273a1d44741 | 90 | uint32_t RegisterRead(uint8_t address) { |
paulocroman | 77:3273a1d44741 | 91 | uint32_t data=0; |
paulocroman | 77:3273a1d44741 | 92 | STE = 0; |
paulocroman | 77:3273a1d44741 | 93 | spi.write(address); // sends address to device |
paulocroman | 77:3273a1d44741 | 94 | data |= (spi.write(0)<<16); // reading top 8 bits data |
paulocroman | 77:3273a1d44741 | 95 | data |= (spi.write(0)<<8); // reading middle 8 bits data |
paulocroman | 77:3273a1d44741 | 96 | data |= spi.write(0); // reading bottom 8 bits data |
paulocroman | 77:3273a1d44741 | 97 | STE = 1; |
paulocroman | 77:3273a1d44741 | 98 | return data; // returns with 24 bits of read data |
paulocroman | 77:3273a1d44741 | 99 | } |
paulocroman | 77:3273a1d44741 | 100 | |
paulocroman | 77:3273a1d44741 | 101 | int32_t ADCRead( uint8_t address ) |
paulocroman | 77:3273a1d44741 | 102 | { |
paulocroman | 77:3273a1d44741 | 103 | uint32_t adc; |
paulocroman | 77:3273a1d44741 | 104 | int32_t r; |
paulocroman | 77:3273a1d44741 | 105 | //float r; |
paulocroman | 77:3273a1d44741 | 106 | adc=RegisterRead( address ); |
paulocroman | 77:3273a1d44741 | 107 | if ( (adc&(1<<21)) ) adc|=0xFFC00000; |
paulocroman | 77:3273a1d44741 | 108 | //r = 1.2 * adc / (1<<21); |
paulocroman | 77:3273a1d44741 | 109 | r = *((int32_t*)&adc); |
paulocroman | 77:3273a1d44741 | 110 | return r; |
paulocroman | 77:3273a1d44741 | 111 | } |
paulocroman | 77:3273a1d44741 | 112 | |
paulocroman | 77:3273a1d44741 | 113 | |
paulocroman | 77:3273a1d44741 | 114 | void AFE4490Initialize() { |
paulocroman | 77:3273a1d44741 | 115 | RegisterWrite(CONTROL0, 0x000008); //SW_RST |
paulocroman | 77:3273a1d44741 | 116 | RegisterWrite(CONTROL0, 0x000000); |
paulocroman | 77:3273a1d44741 | 117 | RegisterWrite(LED2STC, 0x0017C0); |
paulocroman | 77:3273a1d44741 | 118 | RegisterWrite(LED2ENDC, 0x001F3E); |
paulocroman | 77:3273a1d44741 | 119 | RegisterWrite(LED2LEDSTC, 0x001770); |
paulocroman | 77:3273a1d44741 | 120 | RegisterWrite(LED2LEDENDC, 0x001F3F); |
paulocroman | 77:3273a1d44741 | 121 | RegisterWrite(ALED2STC, 0x000050); |
paulocroman | 77:3273a1d44741 | 122 | RegisterWrite(ALED2ENDC, 0x0007CE); |
paulocroman | 77:3273a1d44741 | 123 | RegisterWrite(LED1STC, 0x000820); |
paulocroman | 77:3273a1d44741 | 124 | RegisterWrite(LED1ENDC, 0x000F9E); |
paulocroman | 77:3273a1d44741 | 125 | RegisterWrite(LED1LEDSTC, 0x0007D0); |
paulocroman | 77:3273a1d44741 | 126 | RegisterWrite(LED1LEDENDC, 0x000F9F); |
paulocroman | 77:3273a1d44741 | 127 | RegisterWrite(ALED1STC, 0x000FF0); |
paulocroman | 77:3273a1d44741 | 128 | RegisterWrite(ALED1ENDC, 0x00176E); |
paulocroman | 77:3273a1d44741 | 129 | RegisterWrite(LED2CONVST, 0x000006); |
paulocroman | 77:3273a1d44741 | 130 | RegisterWrite(LED2CONVEND, 0x0007CF); |
paulocroman | 77:3273a1d44741 | 131 | RegisterWrite(ALED2CONVST, 0x0007D6); |
paulocroman | 77:3273a1d44741 | 132 | RegisterWrite(ALED2CONVEND, 0x000F9F); |
paulocroman | 77:3273a1d44741 | 133 | RegisterWrite(LED1CONVST, 0x000FA6); |
paulocroman | 77:3273a1d44741 | 134 | RegisterWrite(LED1CONVEND, 0x00176F); |
paulocroman | 77:3273a1d44741 | 135 | RegisterWrite(ALED1CONVST, 0x001776); |
paulocroman | 77:3273a1d44741 | 136 | RegisterWrite(ALED1CONVEND, 0x001F3F); |
paulocroman | 77:3273a1d44741 | 137 | RegisterWrite(ADCRSTSTCT0, 0x000000); |
paulocroman | 77:3273a1d44741 | 138 | RegisterWrite(ADCRSTENDCT0, 0x000005); |
paulocroman | 77:3273a1d44741 | 139 | RegisterWrite(ADCRSTSTCT1, 0x0007D0); |
paulocroman | 77:3273a1d44741 | 140 | RegisterWrite(ADCRSTENDCT1, 0x0007D5); |
paulocroman | 77:3273a1d44741 | 141 | RegisterWrite(ADCRSTSTCT2, 0x000FA0); |
paulocroman | 77:3273a1d44741 | 142 | RegisterWrite(ADCRSTENDCT2, 0x000FA5); |
paulocroman | 77:3273a1d44741 | 143 | RegisterWrite(ADCRSTSTCT3, 0x001770); |
paulocroman | 77:3273a1d44741 | 144 | RegisterWrite(ADCRSTENDCT3, 0x001775); |
paulocroman | 77:3273a1d44741 | 145 | RegisterWrite(PRPCOUNT, 0x001F3F); |
paulocroman | 77:3273a1d44741 | 146 | RegisterWrite(CONTROL1, 0x000102); /* Average 3 */ |
paulocroman | 77:3273a1d44741 | 147 | RegisterWrite(TIAGAIN, 0x004102); /* 0b1 000 001 00000 010 - stg2=1.5 5p */ |
paulocroman | 77:3273a1d44741 | 148 | RegisterWrite(LEDCNTRL, 0x010606); |
paulocroman | 77:3273a1d44741 | 149 | /* TX_REF - 0.5 V */ |
paulocroman | 77:3273a1d44741 | 150 | RegisterWrite(CONTROL2, 0b0000100000000000000000); |
paulocroman | 77:3273a1d44741 | 151 | RegisterWrite(RESERVED1, 0x000000); |
paulocroman | 77:3273a1d44741 | 152 | RegisterWrite(RESERVED2, 0x000000); |
paulocroman | 77:3273a1d44741 | 153 | RegisterWrite(ALARM, 0x000000); |
paulocroman | 77:3273a1d44741 | 154 | s.printf("Initialization Complete.\r\n"); |
paulocroman | 77:3273a1d44741 | 155 | } |
paulocroman | 77:3273a1d44741 | 156 | |
paulocroman | 77:3273a1d44741 | 157 | float mltplr = 0.00000057220459; |
paulocroman | 77:3273a1d44741 | 158 | int idx = 0; |
paulocroman | 77:3273a1d44741 | 159 | int nDelay=2000; |
paulocroman | 77:3273a1d44741 | 160 | char inpBuffer[32]; |
paulocroman | 77:3273a1d44741 | 161 | int iDC=0; |
paulocroman | 77:3273a1d44741 | 162 | int iGER=0; |
paulocroman | 77:3273a1d44741 | 163 | int iREG=0; |
paulocroman | 77:3273a1d44741 | 164 | |
paulocroman | 77:3273a1d44741 | 165 | char *command; |
paulocroman | 77:3273a1d44741 | 166 | char data[32]; |
paulocroman | 77:3273a1d44741 | 167 | void executeChange() { |
paulocroman | 77:3273a1d44741 | 168 | s.printf("cmd: %s\r\n", inpBuffer); |
paulocroman | 77:3273a1d44741 | 169 | command = strtok(data, " "); |
paulocroman | 77:3273a1d44741 | 170 | RegisterWrite(CONTROL0, 0x000000); |
paulocroman | 77:3273a1d44741 | 171 | strcpy(data, (const char *)inpBuffer); |
paulocroman | 77:3273a1d44741 | 172 | int control = (int) strtol(command, NULL, 16); |
paulocroman | 77:3273a1d44741 | 173 | RegisterWrite(LEDCNTRL, control); |
paulocroman | 77:3273a1d44741 | 174 | command = strtok(NULL, " "); |
paulocroman | 77:3273a1d44741 | 175 | int gain1 = (int) strtol(command, NULL, 16); |
paulocroman | 77:3273a1d44741 | 176 | RegisterWrite(TIAGAIN, gain1); |
paulocroman | 77:3273a1d44741 | 177 | command = strtok(NULL, " "); |
paulocroman | 77:3273a1d44741 | 178 | if (command) { |
paulocroman | 77:3273a1d44741 | 179 | int gain2 = (int) strtol(command, NULL, 16); |
paulocroman | 77:3273a1d44741 | 180 | RegisterWrite(TIA_AMB_GAIN, gain2); |
paulocroman | 77:3273a1d44741 | 181 | } |
paulocroman | 77:3273a1d44741 | 182 | RegisterWrite(CONTROL0, 0x000001); |
paulocroman | 77:3273a1d44741 | 183 | } |
paulocroman | 77:3273a1d44741 | 184 | |
paulocroman | 77:3273a1d44741 | 185 | float convert(int data) { |
paulocroman | 77:3273a1d44741 | 186 | return data * mltplr; |
paulocroman | 77:3273a1d44741 | 187 | } |
paulocroman | 77:3273a1d44741 | 188 | |
paulocroman | 77:3273a1d44741 | 189 | #define counts 1000 |
paulocroman | 77:3273a1d44741 | 190 | unsigned int IRV[counts]; |
paulocroman | 77:3273a1d44741 | 191 | unsigned int REDV[counts]; |
paulocroman | 77:3273a1d44741 | 192 | unsigned int SPT[counts]; |
paulocroman | 77:3273a1d44741 | 193 | int spidx=0; |
paulocroman | 77:3273a1d44741 | 194 | |
paulocroman | 77:3273a1d44741 | 195 | void spo2() |
paulocroman | 77:3273a1d44741 | 196 | { |
paulocroman | 77:3273a1d44741 | 197 | //int counts=1000; |
paulocroman | 77:3273a1d44741 | 198 | float r; |
paulocroman | 77:3273a1d44741 | 199 | long red,ir,redMax,redMin,irMax,irMin; |
paulocroman | 77:3273a1d44741 | 200 | long redS=0,irS=0; |
paulocroman | 77:3273a1d44741 | 201 | unsigned long redAC_sq=0; |
paulocroman | 77:3273a1d44741 | 202 | unsigned long irAC_sq=0; |
paulocroman | 77:3273a1d44741 | 203 | long redDC,irDC; |
paulocroman | 77:3273a1d44741 | 204 | long irAC,redAC; |
paulocroman | 77:3273a1d44741 | 205 | float spo2; |
paulocroman | 77:3273a1d44741 | 206 | int i; |
paulocroman | 77:3273a1d44741 | 207 | |
paulocroman | 77:3273a1d44741 | 208 | RegisterWrite(CONTROL0, 0x000001); |
paulocroman | 77:3273a1d44741 | 209 | redMax=redMin=RegisterRead(LED2VAL); |
paulocroman | 77:3273a1d44741 | 210 | irMax=irMin=RegisterRead(LED1VAL); |
paulocroman | 77:3273a1d44741 | 211 | for ( i=0;i<counts;i++ ) |
paulocroman | 77:3273a1d44741 | 212 | { |
paulocroman | 77:3273a1d44741 | 213 | REDV[i]=RegisterRead(LED2VAL); |
paulocroman | 77:3273a1d44741 | 214 | IRV[i]=RegisterRead(LED1VAL); |
paulocroman | 77:3273a1d44741 | 215 | // s.printf("READ %u %u\r\n",REDV[i],IRV[i]); |
paulocroman | 77:3273a1d44741 | 216 | if ( redMax<REDV[i] ) redMax=REDV[i]; |
paulocroman | 77:3273a1d44741 | 217 | if ( redMin>REDV[i] ) redMin=REDV[i]; |
paulocroman | 77:3273a1d44741 | 218 | if ( irMax<IRV[i] ) irMax=IRV[i]; |
paulocroman | 77:3273a1d44741 | 219 | if ( irMin>IRV[i] ) irMin=IRV[i]; |
paulocroman | 77:3273a1d44741 | 220 | wait_us(200); |
paulocroman | 77:3273a1d44741 | 221 | } |
paulocroman | 77:3273a1d44741 | 222 | |
paulocroman | 77:3273a1d44741 | 223 | redS=0; |
paulocroman | 77:3273a1d44741 | 224 | irS=0; |
paulocroman | 77:3273a1d44741 | 225 | for ( i=0;i<counts;i++ ) |
paulocroman | 77:3273a1d44741 | 226 | { |
paulocroman | 77:3273a1d44741 | 227 | redS+=REDV[i]; |
paulocroman | 77:3273a1d44741 | 228 | irS+=IRV[i]; |
paulocroman | 77:3273a1d44741 | 229 | } |
paulocroman | 77:3273a1d44741 | 230 | |
paulocroman | 77:3273a1d44741 | 231 | redDC = redS/i; |
paulocroman | 77:3273a1d44741 | 232 | irDC = irS/i; |
paulocroman | 77:3273a1d44741 | 233 | for ( i=0;i<counts;i++ ) |
paulocroman | 77:3273a1d44741 | 234 | { |
paulocroman | 77:3273a1d44741 | 235 | redAC_sq += pow(((long)(REDV[i]-redDC)),2.0); |
paulocroman | 77:3273a1d44741 | 236 | irAC_sq += pow(((long)(IRV[i]-irDC)),2.0); |
paulocroman | 77:3273a1d44741 | 237 | } |
paulocroman | 77:3273a1d44741 | 238 | redAC=sqrt((float)redAC_sq/i); |
paulocroman | 77:3273a1d44741 | 239 | irAC=sqrt((float)irAC_sq/i); |
paulocroman | 77:3273a1d44741 | 240 | |
paulocroman | 77:3273a1d44741 | 241 | s.printf("redDC=%ld\r\n",redDC); |
paulocroman | 77:3273a1d44741 | 242 | s.printf("redMax=%ld\r\n",redMax); |
paulocroman | 77:3273a1d44741 | 243 | s.printf("redMin=%ld\r\n",redMin); |
paulocroman | 77:3273a1d44741 | 244 | s.printf("redAC2=%ld\r\n",redAC_sq); |
paulocroman | 77:3273a1d44741 | 245 | s.printf("redAC=%ld\r\n",redAC); |
paulocroman | 77:3273a1d44741 | 246 | |
paulocroman | 77:3273a1d44741 | 247 | s.printf("ir=%ld\r\n",ir); |
paulocroman | 77:3273a1d44741 | 248 | s.printf("irMax=%ld\r\n",irMax); |
paulocroman | 77:3273a1d44741 | 249 | s.printf("irMin=%ld\r\n",irMin); |
paulocroman | 77:3273a1d44741 | 250 | s.printf("irAC2=%ld\r\n",irAC_sq); |
paulocroman | 77:3273a1d44741 | 251 | s.printf("irAC=%ld\r\n",irAC); |
paulocroman | 77:3273a1d44741 | 252 | |
paulocroman | 77:3273a1d44741 | 253 | r=(float)((float)redAC/redDC)/(float)((float)irAC/irDC); |
paulocroman | 77:3273a1d44741 | 254 | spo2=110-25*r; |
paulocroman | 77:3273a1d44741 | 255 | s.printf("spo2=%.3lf\r\n\r\n",spo2); |
paulocroman | 77:3273a1d44741 | 256 | |
paulocroman | 77:3273a1d44741 | 257 | } |
paulocroman | 77:3273a1d44741 | 258 | |
paulocroman | 77:3273a1d44741 | 259 | int samples=500; |
paulocroman | 77:3273a1d44741 | 260 | int start=0; |
paulocroman | 77:3273a1d44741 | 261 | int ind = 0; |
paulocroman | 77:3273a1d44741 | 262 | int redRead; |
paulocroman | 77:3273a1d44741 | 263 | int32_t greenRead=0; |
paulocroman | 77:3273a1d44741 | 264 | |
paulocroman | 77:3273a1d44741 | 265 | int32_t fRedRead; |
paulocroman | 77:3273a1d44741 | 266 | int32_t fGreenRead; |
paulocroman | 77:3273a1d44741 | 267 | |
paulocroman | 77:3273a1d44741 | 268 | short int nSTAGE2EN1=0; |
paulocroman | 77:3273a1d44741 | 269 | short int nSTG2GAIN1=0; |
paulocroman | 77:3273a1d44741 | 270 | short int nCF_LED1=0; |
paulocroman | 77:3273a1d44741 | 271 | short int nRF_LED1=0; |
paulocroman | 77:3273a1d44741 | 272 | |
paulocroman | 77:3273a1d44741 | 273 | short int nLED1=0; |
paulocroman | 77:3273a1d44741 | 274 | short int nLED2=0; |
paulocroman | 77:3273a1d44741 | 275 | short int nLED_RANGE=1; |
paulocroman | 77:3273a1d44741 | 276 | float dFSC=50.0; |
paulocroman | 77:3273a1d44741 | 277 | |
paulocroman | 77:3273a1d44741 | 278 | long int nTIAGAIN=0; |
paulocroman | 77:3273a1d44741 | 279 | |
paulocroman | 77:3273a1d44741 | 280 | void setTiaGain( void ) |
paulocroman | 77:3273a1d44741 | 281 | { |
paulocroman | 77:3273a1d44741 | 282 | /* STG2 enabled */ |
paulocroman | 77:3273a1d44741 | 283 | s.printf("setTiaGain:\r\n"); |
paulocroman | 77:3273a1d44741 | 284 | s.printf(" RF_LED1:%d CF_LED1:%d STG2GAIN1:%d STAGE2EN1:%d\r\n", |
paulocroman | 77:3273a1d44741 | 285 | nRF_LED1,nCF_LED1,nSTG2GAIN1,nSTAGE2EN1); |
paulocroman | 77:3273a1d44741 | 286 | nTIAGAIN=0; |
paulocroman | 77:3273a1d44741 | 287 | nTIAGAIN|=((nSTAGE2EN1&1)<<14)&0b100000000000000; |
paulocroman | 77:3273a1d44741 | 288 | nTIAGAIN|=((nSTG2GAIN1&7)<<8)&0b11100000000; |
paulocroman | 77:3273a1d44741 | 289 | nTIAGAIN|=((nCF_LED1&0x1F)<<3)&0b11111000; |
paulocroman | 77:3273a1d44741 | 290 | nTIAGAIN|=nRF_LED1&0x7; |
paulocroman | 77:3273a1d44741 | 291 | s.printf(" TIAGAIN:%04X\r\n",nTIAGAIN); |
paulocroman | 77:3273a1d44741 | 292 | } |
paulocroman | 77:3273a1d44741 | 293 | |
paulocroman | 77:3273a1d44741 | 294 | void printTG(void) |
paulocroman | 77:3273a1d44741 | 295 | { |
paulocroman | 77:3273a1d44741 | 296 | int v,cf; |
paulocroman | 77:3273a1d44741 | 297 | s.printf("TIAGAIN:0x%04X\r\n",nTIAGAIN); |
paulocroman | 77:3273a1d44741 | 298 | if ( nTIAGAIN&(1<<15) ) { |
paulocroman | 77:3273a1d44741 | 299 | s.printf("sep_gain_enabled "); |
paulocroman | 77:3273a1d44741 | 300 | } else { |
paulocroman | 77:3273a1d44741 | 301 | s.printf("sep_gain_disabled "); |
paulocroman | 77:3273a1d44741 | 302 | } |
paulocroman | 77:3273a1d44741 | 303 | if ( nTIAGAIN&(1<<14) ) { |
paulocroman | 77:3273a1d44741 | 304 | s.printf("stage2_enabled "); |
paulocroman | 77:3273a1d44741 | 305 | |
paulocroman | 77:3273a1d44741 | 306 | v=(nTIAGAIN>>8)&7; |
paulocroman | 77:3273a1d44741 | 307 | if ( v==0 ) s.printf("0dB (0X) "); |
paulocroman | 77:3273a1d44741 | 308 | if ( v==1 ) s.printf("3.5dB (1.5X) "); |
paulocroman | 77:3273a1d44741 | 309 | if ( v==2 ) s.printf("6dB (2X) "); |
paulocroman | 77:3273a1d44741 | 310 | if ( v==3 ) s.printf("9.5dB (3X) "); |
paulocroman | 77:3273a1d44741 | 311 | if ( v==4 ) s.printf("12dB (4X) "); |
paulocroman | 77:3273a1d44741 | 312 | |
paulocroman | 77:3273a1d44741 | 313 | } else { |
paulocroman | 77:3273a1d44741 | 314 | s.printf("stage2_disabled "); |
paulocroman | 77:3273a1d44741 | 315 | } |
paulocroman | 77:3273a1d44741 | 316 | v=(nTIAGAIN>>3)&0x1F; |
paulocroman | 77:3273a1d44741 | 317 | cf=5; |
paulocroman | 77:3273a1d44741 | 318 | if ( v&0b1 ) cf+=5; |
paulocroman | 77:3273a1d44741 | 319 | if ( v&0b10 ) cf+=15; |
paulocroman | 77:3273a1d44741 | 320 | if ( v&0b100 ) cf+=25; |
paulocroman | 77:3273a1d44741 | 321 | if ( v&0b1000 ) cf+=50; |
paulocroman | 77:3273a1d44741 | 322 | if ( v&0b10000 ) cf+=150; |
paulocroman | 77:3273a1d44741 | 323 | s.printf("cf=%dpF ",cf); |
paulocroman | 77:3273a1d44741 | 324 | v=(nTIAGAIN&7); |
paulocroman | 77:3273a1d44741 | 325 | if (v==0) s.printf("rf=500k"); |
paulocroman | 77:3273a1d44741 | 326 | if (v==1) s.printf("rf=250k"); |
paulocroman | 77:3273a1d44741 | 327 | if (v==2) s.printf("rf=100k"); |
paulocroman | 77:3273a1d44741 | 328 | if (v==3) s.printf("rf=50k"); |
paulocroman | 77:3273a1d44741 | 329 | if (v==4) s.printf("rf=25k"); |
paulocroman | 77:3273a1d44741 | 330 | if (v==5) s.printf("rf=10k"); |
paulocroman | 77:3273a1d44741 | 331 | if (v==6) s.printf("rf=1M"); |
paulocroman | 77:3273a1d44741 | 332 | s.printf("\r\n"); |
paulocroman | 77:3273a1d44741 | 333 | s.printf("LED1: %02X (%.2lf mA) LED2: %02X (%.2lf mA)\r\n", |
paulocroman | 77:3273a1d44741 | 334 | nLED1,nLED1*dFSC/256,nLED2,nLED2*dFSC/256); |
paulocroman | 77:3273a1d44741 | 335 | } |
paulocroman | 77:3273a1d44741 | 336 | |
paulocroman | 77:3273a1d44741 | 337 | void loop_o() { |
paulocroman | 77:3273a1d44741 | 338 | |
paulocroman | 77:3273a1d44741 | 339 | /*greenRead=RegisterRead(LED2VAL); |
paulocroman | 77:3273a1d44741 | 340 | redRead=RegisterRead(LED1VAL); |
paulocroman | 77:3273a1d44741 | 341 | RegisterRead(ALED2VAL); |
paulocroman | 77:3273a1d44741 | 342 | RegisterRead(ALED1VAL); |
paulocroman | 77:3273a1d44741 | 343 | greenRead=RegisterRead(LED2ABSVAL); |
paulocroman | 77:3273a1d44741 | 344 | redRead=RegisterRead(LED1ABSVAL); |
paulocroman | 77:3273a1d44741 | 345 | */ |
paulocroman | 77:3273a1d44741 | 346 | ADCRead(LED2VAL); |
paulocroman | 77:3273a1d44741 | 347 | ADCRead(LED1VAL); |
paulocroman | 77:3273a1d44741 | 348 | ADCRead(ALED2VAL); |
paulocroman | 77:3273a1d44741 | 349 | ADCRead(ALED1VAL); |
paulocroman | 77:3273a1d44741 | 350 | fGreenRead=ADCRead(LED2ABSVAL); |
paulocroman | 77:3273a1d44741 | 351 | fRedRead=ADCRead(LED1ABSVAL); |
paulocroman | 77:3273a1d44741 | 352 | wait_ms(20); |
paulocroman | 77:3273a1d44741 | 353 | /* |
paulocroman | 77:3273a1d44741 | 354 | s.printf("%.04f %.04f %.04f %.04f\r\n", convert(RegisterRead(LED2VAL)) |
paulocroman | 77:3273a1d44741 | 355 | ,convert(RegisterRead(ALED2VAL)) |
paulocroman | 77:3273a1d44741 | 356 | ,convert(RegisterRead(LED1VAL)) |
paulocroman | 77:3273a1d44741 | 357 | ,convert(RegisterRead(ALED1VAL))); |
paulocroman | 77:3273a1d44741 | 358 | */ |
paulocroman | 77:3273a1d44741 | 359 | //wait_ms(20); |
paulocroman | 77:3273a1d44741 | 360 | } |
paulocroman | 77:3273a1d44741 | 361 | int nINCMD=0; |
paulocroman | 77:3273a1d44741 | 362 | void doCmd(void) |
paulocroman | 77:3273a1d44741 | 363 | { |
paulocroman | 77:3273a1d44741 | 364 | char *p; |
paulocroman | 77:3273a1d44741 | 365 | char parm[10]; |
paulocroman | 77:3273a1d44741 | 366 | static char sBuf[80]; |
paulocroman | 77:3273a1d44741 | 367 | static char *pBuf=sBuf; |
paulocroman | 77:3273a1d44741 | 368 | if (s.readable()) { |
paulocroman | 77:3273a1d44741 | 369 | char c = s.getc(); |
paulocroman | 77:3273a1d44741 | 370 | if ( c=='\r' ) |
paulocroman | 77:3273a1d44741 | 371 | { |
paulocroman | 77:3273a1d44741 | 372 | s.printf("\r\nbuff=[%s]\r\n",sBuf); |
paulocroman | 77:3273a1d44741 | 373 | pBuf=sBuf; |
paulocroman | 77:3273a1d44741 | 374 | if ( strcasecmp(sBuf,"help")==0 ) |
paulocroman | 77:3273a1d44741 | 375 | { |
paulocroman | 77:3273a1d44741 | 376 | s.printf("set stg2=[3.5|6|9.5|12]\r\n"); |
paulocroman | 77:3273a1d44741 | 377 | s.printf("set cf=[5|10|20|25|30|35|45|50|55|60|70|75|80|85|95\r\n" |
paulocroman | 77:3273a1d44741 | 378 | " 100|155|160|170|175|180|185|195|200|205|210\r\n" |
paulocroman | 77:3273a1d44741 | 379 | " 220|225|230|235|245|250]\r\n"); |
paulocroman | 77:3273a1d44741 | 380 | s.printf("set rf=[10k|25k|50k|250k|500k|1M]\r\n"); |
paulocroman | 77:3273a1d44741 | 381 | s.printf("set prf=<freq>\r\n"); |
paulocroman | 77:3273a1d44741 | 382 | s.printf("set adac=[1-10]uA\r\n"); |
paulocroman | 77:3273a1d44741 | 383 | s.printf("set prf=<freq>\r\n"); |
paulocroman | 77:3273a1d44741 | 384 | s.printf("set prp=<period>\r\n"); |
paulocroman | 77:3273a1d44741 | 385 | s.printf("set led1=<current>mA\r\n"); |
paulocroman | 77:3273a1d44741 | 386 | s.printf("set led2=<current>mA\r\n"); |
paulocroman | 77:3273a1d44741 | 387 | s.printf("w led\r\n"); |
paulocroman | 77:3273a1d44741 | 388 | s.printf("w tiagain\r\n"); |
paulocroman | 77:3273a1d44741 | 389 | s.printf("wr\r\n"); |
paulocroman | 77:3273a1d44741 | 390 | s.printf("creg\r\n"); |
paulocroman | 77:3273a1d44741 | 391 | s.printf("diag\r\n"); |
paulocroman | 77:3273a1d44741 | 392 | s.printf("get numavg\r\n"); |
paulocroman | 77:3273a1d44741 | 393 | s.printf("parms\r\n"); |
paulocroman | 77:3273a1d44741 | 394 | s.printf("get numavg\r\n"); |
paulocroman | 77:3273a1d44741 | 395 | } |
paulocroman | 77:3273a1d44741 | 396 | if ( strcasecmp(sBuf,"ble_on")==0 ) { |
paulocroman | 77:3273a1d44741 | 397 | s.printf("BLE ON\r\n"); |
paulocroman | 77:3273a1d44741 | 398 | nINCMD=0; |
paulocroman | 77:3273a1d44741 | 399 | } |
paulocroman | 77:3273a1d44741 | 400 | if ( strcasecmp(sBuf,"set stage2 on")==0 ) { |
paulocroman | 77:3273a1d44741 | 401 | nSTAGE2EN1=1; |
paulocroman | 77:3273a1d44741 | 402 | } |
paulocroman | 77:3273a1d44741 | 403 | if ( strncasecmp(sBuf,"set stg2=",9)==0 ) { |
paulocroman | 77:3273a1d44741 | 404 | p=strchr(sBuf,'='); |
paulocroman | 77:3273a1d44741 | 405 | p++; |
paulocroman | 77:3273a1d44741 | 406 | sscanf(p,"%s",parm); |
paulocroman | 77:3273a1d44741 | 407 | if ( strcmp(parm,"0")==0 ) nSTG2GAIN1=0; |
paulocroman | 77:3273a1d44741 | 408 | else if ( strcmp(parm,"3.5")==0 ) nSTG2GAIN1=1; |
paulocroman | 77:3273a1d44741 | 409 | else if ( strcmp(parm,"6")==0 ) nSTG2GAIN1=2; |
paulocroman | 77:3273a1d44741 | 410 | else if ( strcmp(parm,"9.5")==0 ) nSTG2GAIN1=3; |
paulocroman | 77:3273a1d44741 | 411 | else if ( strcmp(parm,"12")==0 ) nSTG2GAIN1=4; |
paulocroman | 77:3273a1d44741 | 412 | else { |
paulocroman | 77:3273a1d44741 | 413 | s.printf("stg2 invalid\r\n 0,3.5,6,9.5,12 (db)\r\n"); |
paulocroman | 77:3273a1d44741 | 414 | } |
paulocroman | 77:3273a1d44741 | 415 | } |
paulocroman | 77:3273a1d44741 | 416 | if ( strncasecmp(sBuf,"set cf=",7)==0 ) { |
paulocroman | 77:3273a1d44741 | 417 | int cf,bcf; |
paulocroman | 77:3273a1d44741 | 418 | p=strchr(sBuf,'='); |
paulocroman | 77:3273a1d44741 | 419 | p++; |
paulocroman | 77:3273a1d44741 | 420 | sscanf(p,"%s",parm); |
paulocroman | 77:3273a1d44741 | 421 | cf=atoi(parm); |
paulocroman | 77:3273a1d44741 | 422 | if ( cf<5 ) cf=5; |
paulocroman | 77:3273a1d44741 | 423 | |
paulocroman | 77:3273a1d44741 | 424 | bcf=0; |
paulocroman | 77:3273a1d44741 | 425 | cf-=5; |
paulocroman | 77:3273a1d44741 | 426 | if ( cf>0 ) bcf|=0b00001; |
paulocroman | 77:3273a1d44741 | 427 | cf-=15; |
paulocroman | 77:3273a1d44741 | 428 | if ( cf>0 ) bcf|=0b00010; |
paulocroman | 77:3273a1d44741 | 429 | cf-=25; |
paulocroman | 77:3273a1d44741 | 430 | if ( cf>0 ) bcf|=0b00100; |
paulocroman | 77:3273a1d44741 | 431 | cf-=50; |
paulocroman | 77:3273a1d44741 | 432 | if ( cf>0 ) bcf|=0b01000; |
paulocroman | 77:3273a1d44741 | 433 | cf-=150; |
paulocroman | 77:3273a1d44741 | 434 | if ( cf>0 ) bcf|=0b10000; |
paulocroman | 77:3273a1d44741 | 435 | |
paulocroman | 77:3273a1d44741 | 436 | cf=5; |
paulocroman | 77:3273a1d44741 | 437 | if ( bcf&0b1 ) cf+=5; |
paulocroman | 77:3273a1d44741 | 438 | if ( bcf&0b10 ) cf+=15; |
paulocroman | 77:3273a1d44741 | 439 | if ( bcf&0b100 ) cf+=25; |
paulocroman | 77:3273a1d44741 | 440 | if ( bcf&0b1000 ) cf+=50; |
paulocroman | 77:3273a1d44741 | 441 | if ( bcf&0b10000 ) cf+=150; |
paulocroman | 77:3273a1d44741 | 442 | |
paulocroman | 77:3273a1d44741 | 443 | s.printf("\r\ncf=%d (0x%02X)\r\n",cf,bcf); |
paulocroman | 77:3273a1d44741 | 444 | s.printf(" 5 10 20 25 30\r\n" |
paulocroman | 77:3273a1d44741 | 445 | " 35 45 50 55 60\r\n" |
paulocroman | 77:3273a1d44741 | 446 | " 70 75 80 85 95\r\n" |
paulocroman | 77:3273a1d44741 | 447 | " 100 155 160 170 175\r\n" |
paulocroman | 77:3273a1d44741 | 448 | " 180 185 195 200 205\r\n" |
paulocroman | 77:3273a1d44741 | 449 | " 210 220 225 230 235\r\n" |
paulocroman | 77:3273a1d44741 | 450 | " 245 250\r\n"); |
paulocroman | 77:3273a1d44741 | 451 | nCF_LED1=bcf; |
paulocroman | 77:3273a1d44741 | 452 | } |
paulocroman | 77:3273a1d44741 | 453 | if ( strncasecmp(sBuf,"set rf=",7)==0 ) { |
paulocroman | 77:3273a1d44741 | 454 | int cf,bcf; |
paulocroman | 77:3273a1d44741 | 455 | p=strchr(sBuf,'='); |
paulocroman | 77:3273a1d44741 | 456 | p++; |
paulocroman | 77:3273a1d44741 | 457 | sscanf(p,"%s",parm); |
paulocroman | 77:3273a1d44741 | 458 | if ( strcasecmp(parm,"500k")==0 ) |
paulocroman | 77:3273a1d44741 | 459 | { |
paulocroman | 77:3273a1d44741 | 460 | nRF_LED1=0; |
paulocroman | 77:3273a1d44741 | 461 | } else if ( strcasecmp(parm,"250k")==0 ) |
paulocroman | 77:3273a1d44741 | 462 | { |
paulocroman | 77:3273a1d44741 | 463 | nRF_LED1=1; |
paulocroman | 77:3273a1d44741 | 464 | } else if ( strcasecmp(parm,"100k")==0 ) |
paulocroman | 77:3273a1d44741 | 465 | { |
paulocroman | 77:3273a1d44741 | 466 | nRF_LED1=2; |
paulocroman | 77:3273a1d44741 | 467 | } else if ( strcasecmp(parm,"50k")==0 ) |
paulocroman | 77:3273a1d44741 | 468 | { |
paulocroman | 77:3273a1d44741 | 469 | nRF_LED1=3; |
paulocroman | 77:3273a1d44741 | 470 | } else if ( strcasecmp(parm,"25k")==0 ) |
paulocroman | 77:3273a1d44741 | 471 | { |
paulocroman | 77:3273a1d44741 | 472 | nRF_LED1=4; |
paulocroman | 77:3273a1d44741 | 473 | } else if ( strcasecmp(parm,"10k")==0 ) |
paulocroman | 77:3273a1d44741 | 474 | { |
paulocroman | 77:3273a1d44741 | 475 | nRF_LED1=5; |
paulocroman | 77:3273a1d44741 | 476 | } else if ( strcasecmp(parm,"1M")==0 ) |
paulocroman | 77:3273a1d44741 | 477 | { |
paulocroman | 77:3273a1d44741 | 478 | nRF_LED1=6; |
paulocroman | 77:3273a1d44741 | 479 | } else { |
paulocroman | 77:3273a1d44741 | 480 | s.printf("\r\ninvalid rf value\r\n 10k,25k,50k,250k,500k,1M\r\n"); |
paulocroman | 77:3273a1d44741 | 481 | } |
paulocroman | 77:3273a1d44741 | 482 | s.printf("RF_LED1=%d\n",nRF_LED1); |
paulocroman | 77:3273a1d44741 | 483 | } |
paulocroman | 77:3273a1d44741 | 484 | if ( strncasecmp(sBuf,"set prf=",8)==0 ) { |
paulocroman | 77:3273a1d44741 | 485 | float prf; |
paulocroman | 77:3273a1d44741 | 486 | int nv; |
paulocroman | 77:3273a1d44741 | 487 | p=strchr(sBuf,'='); |
paulocroman | 77:3273a1d44741 | 488 | p++; |
paulocroman | 77:3273a1d44741 | 489 | sscanf(p,"%s",parm); |
paulocroman | 77:3273a1d44741 | 490 | prf=atof(parm); |
paulocroman | 77:3273a1d44741 | 491 | nv=5000/prf-2; |
paulocroman | 77:3273a1d44741 | 492 | s.printf("nv=%d\r\n",nv); |
paulocroman | 77:3273a1d44741 | 493 | RegisterWrite(CONTROL0,0); |
paulocroman | 77:3273a1d44741 | 494 | RegisterWrite(CONTROL1,((1<<8)|(nv&0xFF))); |
paulocroman | 77:3273a1d44741 | 495 | RegisterWrite(CONTROL0,1); |
paulocroman | 77:3273a1d44741 | 496 | } |
paulocroman | 77:3273a1d44741 | 497 | if ( strncasecmp(sBuf,"set adac=",9)==0 ) { |
paulocroman | 77:3273a1d44741 | 498 | int prf; |
paulocroman | 77:3273a1d44741 | 499 | int nv; |
paulocroman | 77:3273a1d44741 | 500 | p=strchr(sBuf,'='); |
paulocroman | 77:3273a1d44741 | 501 | p++; |
paulocroman | 77:3273a1d44741 | 502 | sscanf(p,"%s",parm); |
paulocroman | 77:3273a1d44741 | 503 | prf=atoi(parm); |
paulocroman | 77:3273a1d44741 | 504 | nv=RegisterRead(TIA_AMB_GAIN); |
paulocroman | 77:3273a1d44741 | 505 | if ( prf<0 ) prf=0; |
paulocroman | 77:3273a1d44741 | 506 | if ( prf>10) prf=10; |
paulocroman | 77:3273a1d44741 | 507 | prf=prf<<16; |
paulocroman | 77:3273a1d44741 | 508 | RegisterWrite(CONTROL0,0); |
paulocroman | 77:3273a1d44741 | 509 | RegisterWrite(TIA_AMB_GAIN,nv&0xFFFF|prf); |
paulocroman | 77:3273a1d44741 | 510 | RegisterWrite(CONTROL0,1); |
paulocroman | 77:3273a1d44741 | 511 | nv=RegisterRead(TIA_AMB_GAIN); |
paulocroman | 77:3273a1d44741 | 512 | s.printf("AMBDAC: %d FLTRCNRSEL: %s STAGE2EN2: %s STG2GAIN2: %d\r\n", |
paulocroman | 77:3273a1d44741 | 513 | ((nv>>16)&0xF), |
paulocroman | 77:3273a1d44741 | 514 | (0b1000000000000000&nv)?"1000Hz":"500Hz", |
paulocroman | 77:3273a1d44741 | 515 | (nv&0b100000000000000)?"enabled":"bypassed", |
paulocroman | 77:3273a1d44741 | 516 | ((nv>>8)&7)); |
paulocroman | 77:3273a1d44741 | 517 | } |
paulocroman | 77:3273a1d44741 | 518 | if ( strncasecmp(sBuf,"set prp=",8)==0 ) { |
paulocroman | 77:3273a1d44741 | 519 | float prp; |
paulocroman | 77:3273a1d44741 | 520 | int nv; |
paulocroman | 77:3273a1d44741 | 521 | p=strchr(sBuf,'='); |
paulocroman | 77:3273a1d44741 | 522 | p++; |
paulocroman | 77:3273a1d44741 | 523 | sscanf(p,"%s",parm); |
paulocroman | 77:3273a1d44741 | 524 | prp=atof(parm); |
paulocroman | 77:3273a1d44741 | 525 | nv=prp/200-2; |
paulocroman | 77:3273a1d44741 | 526 | s.printf("nv=%d\r\n",nv); |
paulocroman | 77:3273a1d44741 | 527 | } |
paulocroman | 77:3273a1d44741 | 528 | if ( strncmp(sBuf,"set led1=",9)==0 ) |
paulocroman | 77:3273a1d44741 | 529 | { |
paulocroman | 77:3273a1d44741 | 530 | float lc; |
paulocroman | 77:3273a1d44741 | 531 | int v; |
paulocroman | 77:3273a1d44741 | 532 | p=strchr(sBuf,'='); |
paulocroman | 77:3273a1d44741 | 533 | p++; |
paulocroman | 77:3273a1d44741 | 534 | sscanf(p,"%s",parm); |
paulocroman | 77:3273a1d44741 | 535 | lc=atof(parm); |
paulocroman | 77:3273a1d44741 | 536 | v=lc*256.0/dFSC; |
paulocroman | 77:3273a1d44741 | 537 | s.printf("nv=0X%X\r\n",v); |
paulocroman | 77:3273a1d44741 | 538 | nLED1=v; |
paulocroman | 77:3273a1d44741 | 539 | } |
paulocroman | 77:3273a1d44741 | 540 | if ( strncmp(sBuf,"set led2=",9)==0 ) |
paulocroman | 77:3273a1d44741 | 541 | { |
paulocroman | 77:3273a1d44741 | 542 | float lc; |
paulocroman | 77:3273a1d44741 | 543 | int v; |
paulocroman | 77:3273a1d44741 | 544 | p=strchr(sBuf,'='); |
paulocroman | 77:3273a1d44741 | 545 | p++; |
paulocroman | 77:3273a1d44741 | 546 | sscanf(p,"%s",parm); |
paulocroman | 77:3273a1d44741 | 547 | lc=atof(parm); |
paulocroman | 77:3273a1d44741 | 548 | v=lc*256.0/dFSC; |
paulocroman | 77:3273a1d44741 | 549 | s.printf("v=0X%X\r\n",v); |
paulocroman | 77:3273a1d44741 | 550 | nLED2=v; |
paulocroman | 77:3273a1d44741 | 551 | } |
paulocroman | 77:3273a1d44741 | 552 | if ( strcasecmp(sBuf,"w led")==0 ) |
paulocroman | 77:3273a1d44741 | 553 | { |
paulocroman | 77:3273a1d44741 | 554 | long int v; |
paulocroman | 77:3273a1d44741 | 555 | v = (nLED_RANGE<<16)|(nLED1<<8)|nLED2; |
paulocroman | 77:3273a1d44741 | 556 | s.printf("WRLED: %X LED_RANGE=%d\n",v,nLED_RANGE); |
paulocroman | 77:3273a1d44741 | 557 | RegisterWrite(CONTROL0, 0x000000); |
paulocroman | 77:3273a1d44741 | 558 | RegisterWrite(LEDCNTRL, v); |
paulocroman | 77:3273a1d44741 | 559 | RegisterWrite(CONTROL0, 0x000001); |
paulocroman | 77:3273a1d44741 | 560 | } |
paulocroman | 77:3273a1d44741 | 561 | if ( strcasecmp(sBuf,"reset")==0 ) |
paulocroman | 77:3273a1d44741 | 562 | { |
paulocroman | 77:3273a1d44741 | 563 | AFE4490Initialize(); |
paulocroman | 77:3273a1d44741 | 564 | nINCMD=0; |
paulocroman | 77:3273a1d44741 | 565 | } |
paulocroman | 77:3273a1d44741 | 566 | if ( strcasecmp(sBuf,"ger")==0 ) |
paulocroman | 77:3273a1d44741 | 567 | { |
paulocroman | 77:3273a1d44741 | 568 | iGER=1-iGER; |
paulocroman | 77:3273a1d44741 | 569 | } |
paulocroman | 77:3273a1d44741 | 570 | if ( strcasecmp(sBuf,"reg")==0 ) |
paulocroman | 77:3273a1d44741 | 571 | { |
paulocroman | 77:3273a1d44741 | 572 | iREG=1-iREG; |
paulocroman | 77:3273a1d44741 | 573 | } |
paulocroman | 77:3273a1d44741 | 574 | if ( strcasecmp(sBuf,"w tiagain")==0 ) { |
paulocroman | 77:3273a1d44741 | 575 | setTiaGain(); |
paulocroman | 77:3273a1d44741 | 576 | printTG(); |
paulocroman | 77:3273a1d44741 | 577 | RegisterWrite(CONTROL0, 0x000000); |
paulocroman | 77:3273a1d44741 | 578 | //RegisterWrite(LEDCNTRL, control); |
paulocroman | 77:3273a1d44741 | 579 | RegisterWrite(TIAGAIN, nTIAGAIN); |
paulocroman | 77:3273a1d44741 | 580 | //RegisterWrite(TIA_AMB_GAIN, gain2); |
paulocroman | 77:3273a1d44741 | 581 | RegisterWrite(CONTROL0, 0x000001); |
paulocroman | 77:3273a1d44741 | 582 | } |
paulocroman | 77:3273a1d44741 | 583 | if ( strcasecmp(sBuf,"wr")==0 ) { |
paulocroman | 77:3273a1d44741 | 584 | long int v; |
paulocroman | 77:3273a1d44741 | 585 | v = (nLED_RANGE<<16)|(nLED1<<8)|nLED2; |
paulocroman | 77:3273a1d44741 | 586 | RegisterWrite(CONTROL0, 0x000000); |
paulocroman | 77:3273a1d44741 | 587 | RegisterWrite(LEDCNTRL, v); |
paulocroman | 77:3273a1d44741 | 588 | RegisterWrite(CONTROL0, 0x000001); |
paulocroman | 77:3273a1d44741 | 589 | s.printf("LEDCNTRL:%03X\r\n",v); |
paulocroman | 77:3273a1d44741 | 590 | setTiaGain(); |
paulocroman | 77:3273a1d44741 | 591 | RegisterWrite(CONTROL0, 0x000000); |
paulocroman | 77:3273a1d44741 | 592 | //RegisterWrite(LEDCNTRL, control); |
paulocroman | 77:3273a1d44741 | 593 | RegisterWrite(TIAGAIN, nTIAGAIN); |
paulocroman | 77:3273a1d44741 | 594 | //RegisterWrite(TIA_AMB_GAIN, gain2); |
paulocroman | 77:3273a1d44741 | 595 | RegisterWrite(CONTROL0, 0x000001); |
paulocroman | 77:3273a1d44741 | 596 | printTG(); |
paulocroman | 77:3273a1d44741 | 597 | } |
paulocroman | 77:3273a1d44741 | 598 | #define PRINTCR(R) do{v=RegisterRead(R);s.printf(#R "%*s: %04X %d\r\n",15-strlen(#R),"",v,v);}while(0) |
paulocroman | 77:3273a1d44741 | 599 | if ( strcasecmp(sBuf,"creg")==0 ) { |
paulocroman | 77:3273a1d44741 | 600 | int v; |
paulocroman | 77:3273a1d44741 | 601 | RegisterWrite(CONTROL0, 0x000001); |
paulocroman | 77:3273a1d44741 | 602 | PRINTCR(LED2STC); |
paulocroman | 77:3273a1d44741 | 603 | PRINTCR(LED2ENDC); |
paulocroman | 77:3273a1d44741 | 604 | PRINTCR(LED2LEDSTC); |
paulocroman | 77:3273a1d44741 | 605 | PRINTCR(LED2LEDENDC); |
paulocroman | 77:3273a1d44741 | 606 | PRINTCR(ALED2STC); |
paulocroman | 77:3273a1d44741 | 607 | PRINTCR(ALED2ENDC); |
paulocroman | 77:3273a1d44741 | 608 | PRINTCR(LED1STC); |
paulocroman | 77:3273a1d44741 | 609 | PRINTCR(LED1ENDC); |
paulocroman | 77:3273a1d44741 | 610 | PRINTCR(LED1LEDSTC); |
paulocroman | 77:3273a1d44741 | 611 | PRINTCR(LED1LEDENDC); |
paulocroman | 77:3273a1d44741 | 612 | PRINTCR(ALED1STC); |
paulocroman | 77:3273a1d44741 | 613 | PRINTCR(ALED1ENDC); |
paulocroman | 77:3273a1d44741 | 614 | PRINTCR(LED2CONVST); |
paulocroman | 77:3273a1d44741 | 615 | PRINTCR(LED2CONVEND); |
paulocroman | 77:3273a1d44741 | 616 | PRINTCR(ALED2CONVST); |
paulocroman | 77:3273a1d44741 | 617 | PRINTCR(ALED2CONVEND); |
paulocroman | 77:3273a1d44741 | 618 | PRINTCR(LED1CONVST); |
paulocroman | 77:3273a1d44741 | 619 | PRINTCR(LED1CONVEND); |
paulocroman | 77:3273a1d44741 | 620 | PRINTCR(ALED1CONVST); |
paulocroman | 77:3273a1d44741 | 621 | PRINTCR(ALED1CONVEND); |
paulocroman | 77:3273a1d44741 | 622 | PRINTCR(ADCRSTSTCT0); |
paulocroman | 77:3273a1d44741 | 623 | PRINTCR(ADCRSTENDCT0); |
paulocroman | 77:3273a1d44741 | 624 | PRINTCR(ADCRSTSTCT1); |
paulocroman | 77:3273a1d44741 | 625 | PRINTCR(ADCRSTENDCT1); |
paulocroman | 77:3273a1d44741 | 626 | PRINTCR(ADCRSTSTCT2); |
paulocroman | 77:3273a1d44741 | 627 | PRINTCR(ADCRSTENDCT2); |
paulocroman | 77:3273a1d44741 | 628 | PRINTCR(ADCRSTSTCT3); |
paulocroman | 77:3273a1d44741 | 629 | PRINTCR(ADCRSTENDCT3); |
paulocroman | 77:3273a1d44741 | 630 | PRINTCR(PRPCOUNT); |
paulocroman | 77:3273a1d44741 | 631 | s.printf("\r\n"); |
paulocroman | 77:3273a1d44741 | 632 | } |
paulocroman | 77:3273a1d44741 | 633 | if ( strcasecmp(sBuf,"diag")==0 ) { |
paulocroman | 77:3273a1d44741 | 634 | int v; |
paulocroman | 77:3273a1d44741 | 635 | v = RegisterRead(CONTROL0); |
paulocroman | 77:3273a1d44741 | 636 | v |= 0b100; |
paulocroman | 77:3273a1d44741 | 637 | RegisterWrite(CONTROL0,v); |
paulocroman | 77:3273a1d44741 | 638 | while ( v&0b100 ) { |
paulocroman | 77:3273a1d44741 | 639 | v=RegisterRead(CONTROL0); |
paulocroman | 77:3273a1d44741 | 640 | } |
paulocroman | 77:3273a1d44741 | 641 | v = RegisterRead(DIAG); |
paulocroman | 77:3273a1d44741 | 642 | s.printf("INPSCLED : %sFAULT\r\n",(v&(1<<0))?"":"NO "); |
paulocroman | 77:3273a1d44741 | 643 | s.printf("INNSCLED : %sFAULT\r\n",(v&(1<<1))?"":"NO "); |
paulocroman | 77:3273a1d44741 | 644 | s.printf("INPSCGND : %sFAULT\r\n",(v&(1<<2))?"":"NO "); |
paulocroman | 77:3273a1d44741 | 645 | s.printf("INNSCGND : %sFAULT\r\n",(v&(1<<3))?"":"NO "); |
paulocroman | 77:3273a1d44741 | 646 | s.printf("PDSC : %sFAULT\r\n",(v&(1<<4))?"":"NO "); |
paulocroman | 77:3273a1d44741 | 647 | s.printf("PDOC : %sFAULT\r\n",(v&(1<<5))?"":"NO "); |
paulocroman | 77:3273a1d44741 | 648 | s.printf("OUTNSHGND: %sFAULT\r\n",(v&(1<<6))?"":"NO "); |
paulocroman | 77:3273a1d44741 | 649 | s.printf("OUTPSHGND: %sFAULT\r\n",(v&(1<<7))?"":"NO "); |
paulocroman | 77:3273a1d44741 | 650 | s.printf("LEDSC : %sFAULT\r\n",(v&(1<<8))?"":"NO "); |
paulocroman | 77:3273a1d44741 | 651 | s.printf("LED2OPEN : %sFAULT\r\n",(v&(1<<9))?"":"NO "); |
paulocroman | 77:3273a1d44741 | 652 | s.printf("LED1OPEN : %sFAULT\r\n",(v&(1<<10))?"":"NO "); |
paulocroman | 77:3273a1d44741 | 653 | s.printf("LED_ALM : %sFAULT\r\n",(v&(1<<11))?"":"NO "); |
paulocroman | 77:3273a1d44741 | 654 | s.printf("PD_ALM : %sFAULT\r\n",(v&(1<<12))?"":"NO "); |
paulocroman | 77:3273a1d44741 | 655 | s.printf("\r\n"); |
paulocroman | 77:3273a1d44741 | 656 | |
paulocroman | 77:3273a1d44741 | 657 | } |
paulocroman | 77:3273a1d44741 | 658 | |
paulocroman | 77:3273a1d44741 | 659 | if ( strcasecmp(sBuf,"get numavg")==0 ) { |
paulocroman | 77:3273a1d44741 | 660 | long int d; |
paulocroman | 77:3273a1d44741 | 661 | s.printf("NUMAVG=%X\r\n",RegisterRead(CONTROL1)); |
paulocroman | 77:3273a1d44741 | 662 | } |
paulocroman | 77:3273a1d44741 | 663 | if ( strcasecmp(sBuf,"parms")==0 ) { |
paulocroman | 77:3273a1d44741 | 664 | printTG(); |
paulocroman | 77:3273a1d44741 | 665 | } |
paulocroman | 77:3273a1d44741 | 666 | |
paulocroman | 77:3273a1d44741 | 667 | s.printf(">"); |
paulocroman | 77:3273a1d44741 | 668 | } else { |
paulocroman | 77:3273a1d44741 | 669 | s.printf("%c",c); |
paulocroman | 77:3273a1d44741 | 670 | pBuf[0]=c; |
paulocroman | 77:3273a1d44741 | 671 | pBuf[1]=0; |
paulocroman | 77:3273a1d44741 | 672 | pBuf++; |
paulocroman | 77:3273a1d44741 | 673 | nINCMD=1; |
paulocroman | 77:3273a1d44741 | 674 | } |
paulocroman | 77:3273a1d44741 | 675 | } |
paulocroman | 77:3273a1d44741 | 676 | } |
paulocroman | 77:3273a1d44741 | 677 | |
paulocroman | 77:3273a1d44741 | 678 | void loop() { |
paulocroman | 77:3273a1d44741 | 679 | long int gain2; |
paulocroman | 77:3273a1d44741 | 680 | if (s.readable()) { |
paulocroman | 77:3273a1d44741 | 681 | char c = s.getc(); |
paulocroman | 77:3273a1d44741 | 682 | s.printf("%c\n",c); |
paulocroman | 77:3273a1d44741 | 683 | if ( c=='+' ) |
paulocroman | 77:3273a1d44741 | 684 | { |
paulocroman | 77:3273a1d44741 | 685 | //nDelay=(nDelay*3)/2; |
paulocroman | 77:3273a1d44741 | 686 | iDC++; |
paulocroman | 77:3273a1d44741 | 687 | if ( iDC>10 ) iDC=10; |
paulocroman | 77:3273a1d44741 | 688 | gain2=16*16*16*16*iDC; |
paulocroman | 77:3273a1d44741 | 689 | s.printf("AMBW=%04X\r\n",gain2); |
paulocroman | 77:3273a1d44741 | 690 | RegisterWrite(TIA_AMB_GAIN, gain2); |
paulocroman | 77:3273a1d44741 | 691 | } else if ( c=='-' ) |
paulocroman | 77:3273a1d44741 | 692 | { |
paulocroman | 77:3273a1d44741 | 693 | iDC--; |
paulocroman | 77:3273a1d44741 | 694 | if (iDC<0 ) iDC=0; |
paulocroman | 77:3273a1d44741 | 695 | gain2=16*16*16*16*iDC; |
paulocroman | 77:3273a1d44741 | 696 | s.printf("AMBW=%04X\r\n",gain2); |
paulocroman | 77:3273a1d44741 | 697 | RegisterWrite(TIA_AMB_GAIN, gain2); |
paulocroman | 77:3273a1d44741 | 698 | //nDelay=(nDelay*2)/3; |
paulocroman | 77:3273a1d44741 | 699 | //if ( nDelay<20 ) nDelay=20; |
paulocroman | 77:3273a1d44741 | 700 | } else if ( c=='=' ) { |
paulocroman | 77:3273a1d44741 | 701 | spo2(); |
paulocroman | 77:3273a1d44741 | 702 | } else if (c == '\n') { |
paulocroman | 77:3273a1d44741 | 703 | inpBuffer[ind] = 0; |
paulocroman | 77:3273a1d44741 | 704 | executeChange(); |
paulocroman | 77:3273a1d44741 | 705 | for (int i = 0; i < 32; i++) { |
paulocroman | 77:3273a1d44741 | 706 | inpBuffer[i] = 0; |
paulocroman | 77:3273a1d44741 | 707 | } |
paulocroman | 77:3273a1d44741 | 708 | ind = 0; |
paulocroman | 77:3273a1d44741 | 709 | } else { |
paulocroman | 77:3273a1d44741 | 710 | inpBuffer[ind] = c; |
paulocroman | 77:3273a1d44741 | 711 | ind += 1; |
paulocroman | 77:3273a1d44741 | 712 | } |
paulocroman | 77:3273a1d44741 | 713 | } |
paulocroman | 77:3273a1d44741 | 714 | if ( t.read_ms()>nDelay /*&& 1==0*/ ) |
paulocroman | 77:3273a1d44741 | 715 | { |
paulocroman | 77:3273a1d44741 | 716 | /*s.printf("read: %d %.04f %.04f %.04f %.04f\r\n", t.read_ms(),convert(RegisterRead(LED2VAL)) |
paulocroman | 77:3273a1d44741 | 717 | ,convert(RegisterRead(ALED2VAL)) |
paulocroman | 77:3273a1d44741 | 718 | ,convert(RegisterRead(LED1VAL)) |
paulocroman | 77:3273a1d44741 | 719 | ,convert(RegisterRead(ALED1VAL))); |
paulocroman | 77:3273a1d44741 | 720 | */ |
paulocroman | 77:3273a1d44741 | 721 | s.printf("read: L2=%10zu AL2=%10zu L1=%10zu AL1=%10zu\r\n", RegisterRead(LED2VAL) |
paulocroman | 77:3273a1d44741 | 722 | ,RegisterRead(ALED2VAL) |
paulocroman | 77:3273a1d44741 | 723 | ,RegisterRead(LED1VAL) |
paulocroman | 77:3273a1d44741 | 724 | ,RegisterRead(ALED1VAL)); |
paulocroman | 77:3273a1d44741 | 725 | |
paulocroman | 77:3273a1d44741 | 726 | t.reset(); |
paulocroman | 77:3273a1d44741 | 727 | } |
paulocroman | 77:3273a1d44741 | 728 | //wait_ms(nDelay); |
paulocroman | 77:3273a1d44741 | 729 | } |
paulocroman | 77:3273a1d44741 | 730 | |
paulocroman | 77:3273a1d44741 | 731 | #if 0 |
paulocroman | 77:3273a1d44741 | 732 | #define ASZ 1000 |
paulocroman | 77:3273a1d44741 | 733 | #define ASZ2 20 |
paulocroman | 77:3273a1d44741 | 734 | unsigned long int VIR[ASZ]; |
paulocroman | 77:3273a1d44741 | 735 | unsigned long int VRED[ASZ]; |
paulocroman | 77:3273a1d44741 | 736 | unsigned long int VIRA[ASZ2]; |
paulocroman | 77:3273a1d44741 | 737 | unsigned long int VREDA[ASZ2]; |
paulocroman | 77:3273a1d44741 | 738 | int acur=0; |
paulocroman | 77:3273a1d44741 | 739 | int acur2=0; |
paulocroman | 77:3273a1d44741 | 740 | |
paulocroman | 77:3273a1d44741 | 741 | void loop2() { |
paulocroman | 77:3273a1d44741 | 742 | int i; |
paulocroman | 77:3273a1d44741 | 743 | VIR[acur]=RegisterRead(LED1VAL) |
paulocroman | 77:3273a1d44741 | 744 | VRED[acur]=RegisterRead(LED2VAL) |
paulocroman | 77:3273a1d44741 | 745 | VIRA[acur2]=RegisterRead(ALED1VAL); |
paulocroman | 77:3273a1d44741 | 746 | VREDA[acur2]=RegisterRead(ALED2VAL); |
paulocroman | 77:3273a1d44741 | 747 | acur++; |
paulocroman | 77:3273a1d44741 | 748 | if ( acur>=ASZ ) acur=0; |
paulocroman | 77:3273a1d44741 | 749 | acur2++; |
paulocroman | 77:3273a1d44741 | 750 | if ( acur2>=ASZ2 ) acur2=0; |
paulocroman | 77:3273a1d44741 | 751 | |
paulocroman | 77:3273a1d44741 | 752 | ini = 0; |
paulocroman | 77:3273a1d44741 | 753 | end = acur; |
paulocroman | 77:3273a1d44741 | 754 | if ( end>=ini ) |
paulocroman | 77:3273a1d44741 | 755 | { |
paulocroman | 77:3273a1d44741 | 756 | ini=end+1; |
paulocroman | 77:3273a1d44741 | 757 | } |
paulocroman | 77:3273a1d44741 | 758 | i=ini; |
paulocroman | 77:3273a1d44741 | 759 | while ( i!=end ) |
paulocroman | 77:3273a1d44741 | 760 | { |
paulocroman | 77:3273a1d44741 | 761 | s+=VIRA[i]; |
paulocroman | 77:3273a1d44741 | 762 | i++; |
paulocroman | 77:3273a1d44741 | 763 | if ( i>=ASZ ) i=0; |
paulocroman | 77:3273a1d44741 | 764 | } |
paulocroman | 77:3273a1d44741 | 765 | s=s/ASZ; |
paulocroman | 77:3273a1d44741 | 766 | } |
paulocroman | 77:3273a1d44741 | 767 | |
paulocroman | 77:3273a1d44741 | 768 | #endif |
paulocroman | 77:3273a1d44741 | 769 | |
paulocroman | 77:3273a1d44741 | 770 | int main1() { |
paulocroman | 77:3273a1d44741 | 771 | s.baud(115200); |
paulocroman | 77:3273a1d44741 | 772 | spi.format(8); |
paulocroman | 77:3273a1d44741 | 773 | spi.frequency(1000000); |
paulocroman | 77:3273a1d44741 | 774 | AFE4490Initialize(); |
paulocroman | 77:3273a1d44741 | 775 | RegisterWrite(CONTROL0, 0x000001); //SPI_Read Enable |
paulocroman | 77:3273a1d44741 | 776 | t.start(); |
paulocroman | 77:3273a1d44741 | 777 | while (1) { |
paulocroman | 77:3273a1d44741 | 778 | loop_o(); |
paulocroman | 77:3273a1d44741 | 779 | } |
paulocroman | 77:3273a1d44741 | 780 | } |
paulocroman | 77:3273a1d44741 | 781 | |
paulocroman | 77:3273a1d44741 | 782 | |
paulocroman | 77:3273a1d44741 | 783 | |
paulocroman | 77:3273a1d44741 | 784 | |
paulocroman | 77:3273a1d44741 | 785 | |
paulocroman | 77:3273a1d44741 | 786 | |
paulocroman | 77:3273a1d44741 | 787 | |
paulocroman | 77:3273a1d44741 | 788 | |
paulocroman | 77:3273a1d44741 | 789 | |
paulocroman | 77:3273a1d44741 | 790 | |
paulocroman | 77:3273a1d44741 | 791 | |
paulocroman | 77:3273a1d44741 | 792 | |
rgrover1 | 47:430545f41113 | 793 | DigitalOut led1(LED1); |
ktownsend | 0:87a7fc231fae | 794 | |
mbedAustin | 55:3a7d497a3e03 | 795 | const static char DEVICE_NAME[] = "HRM1"; |
rgrover1 | 42:06ebef2e0e44 | 796 | static const uint16_t uuid16_list[] = {GattService::UUID_HEART_RATE_SERVICE, |
rgrover1 | 42:06ebef2e0e44 | 797 | GattService::UUID_DEVICE_INFORMATION_SERVICE}; |
rgrover1 | 39:6390604f904c | 798 | static volatile bool triggerSensorPolling = false; |
Rohit Grover |
36:ea2a1b4f51c1 | 799 | |
paulocroman | 77:3273a1d44741 | 800 | uint16_t hrmCounter = 100; // init HRM to 100bps |
paulocroman | 77:3273a1d44741 | 801 | uint16_t hrmCounter2= 100; |
rgrover1 | 72:99c283dfe28d | 802 | |
rgrover1 | 72:99c283dfe28d | 803 | HeartRateService *hrService; |
rgrover1 | 72:99c283dfe28d | 804 | DeviceInformationService *deviceInfo; |
rgrover1 | 72:99c283dfe28d | 805 | |
rgrover1 | 71:469dbde1a238 | 806 | void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) |
ktownsend | 0:87a7fc231fae | 807 | { |
rgrover1 | 73:49b6090478e2 | 808 | BLE::Instance(BLE::DEFAULT_INSTANCE).gap().startAdvertising(); // restart advertising |
rgrover1 | 7:daab8ba5139e | 809 | } |
Rohit Grover |
3:24e2b056d229 | 810 | |
Rohit Grover |
11:1d9aafee4984 | 811 | void periodicCallback(void) |
Rohit Grover |
11:1d9aafee4984 | 812 | { |
rgrover1 | 47:430545f41113 | 813 | led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */ |
rgrover1 | 47:430545f41113 | 814 | |
rgrover1 | 39:6390604f904c | 815 | /* Note that the periodicCallback() executes in interrupt context, so it is safer to do |
rgrover1 | 39:6390604f904c | 816 | * heavy-weight sensor polling from the main thread. */ |
rgrover1 | 39:6390604f904c | 817 | triggerSensorPolling = true; |
Rohit Grover |
11:1d9aafee4984 | 818 | } |
Rohit Grover |
11:1d9aafee4984 | 819 | |
rgrover1 | 74:c9d58e7847c4 | 820 | void bleInitComplete(BLE::InitializationCompleteCallbackContext *params) |
ktownsend | 0:87a7fc231fae | 821 | { |
rgrover1 | 74:c9d58e7847c4 | 822 | BLE &ble = params->ble; |
rgrover1 | 74:c9d58e7847c4 | 823 | ble_error_t error = params->error; |
rgrover1 | 74:c9d58e7847c4 | 824 | |
rgrover1 | 72:99c283dfe28d | 825 | if (error != BLE_ERROR_NONE) { |
rgrover1 | 72:99c283dfe28d | 826 | return; |
rgrover1 | 72:99c283dfe28d | 827 | } |
ktownsend | 0:87a7fc231fae | 828 | |
rgrover1 | 65:cb76569f74f6 | 829 | ble.gap().onDisconnection(disconnectionCallback); |
ktownsend | 0:87a7fc231fae | 830 | |
rgrover1 | 45:98c5a34b07a4 | 831 | /* Setup primary service. */ |
paulocroman | 77:3273a1d44741 | 832 | hrService = new HeartRateService(ble, hrmCounter, hrmCounter2, HeartRateService::LOCATION_FINGER); |
rgrover1 | 45:98c5a34b07a4 | 833 | |
mbedAustin | 55:3a7d497a3e03 | 834 | /* Setup auxiliary service. */ |
rgrover1 | 72:99c283dfe28d | 835 | deviceInfo = new DeviceInformationService(ble, "ARM", "Model1", "SN1", "hw-rev1", "fw-rev1", "soft-rev1"); |
rgrover1 | 45:98c5a34b07a4 | 836 | |
rgrover1 | 45:98c5a34b07a4 | 837 | /* Setup advertising. */ |
rgrover1 | 65:cb76569f74f6 | 838 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); |
rgrover1 | 65:cb76569f74f6 | 839 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list)); |
rgrover1 | 65:cb76569f74f6 | 840 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::GENERIC_HEART_RATE_SENSOR); |
rgrover1 | 65:cb76569f74f6 | 841 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); |
rgrover1 | 65:cb76569f74f6 | 842 | ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
rgrover1 | 67:b2d2dee347c0 | 843 | ble.gap().setAdvertisingInterval(1000); /* 1000ms */ |
rgrover1 | 65:cb76569f74f6 | 844 | ble.gap().startAdvertising(); |
rgrover1 | 72:99c283dfe28d | 845 | } |
rgrover1 | 72:99c283dfe28d | 846 | |
rgrover1 | 72:99c283dfe28d | 847 | int main(void) |
rgrover1 | 72:99c283dfe28d | 848 | { |
rgrover1 | 72:99c283dfe28d | 849 | led1 = 1; |
rgrover1 | 72:99c283dfe28d | 850 | Ticker ticker; |
rgrover1 | 72:99c283dfe28d | 851 | ticker.attach(periodicCallback, 1); // blink LED every second |
rgrover1 | 72:99c283dfe28d | 852 | |
rgrover1 | 73:49b6090478e2 | 853 | BLE& ble = BLE::Instance(BLE::DEFAULT_INSTANCE); |
rgrover1 | 72:99c283dfe28d | 854 | ble.init(bleInitComplete); |
Rohit Grover |
3:24e2b056d229 | 855 | |
rgrover1 | 73:49b6090478e2 | 856 | /* SpinWait for initialization to complete. This is necessary because the |
rgrover1 | 73:49b6090478e2 | 857 | * BLE object is used in the main loop below. */ |
vcoubard | 75:8128a06c0a21 | 858 | while (ble.hasInitialized() == false) { /* spin loop */ } |
paulocroman | 77:3273a1d44741 | 859 | |
paulocroman | 77:3273a1d44741 | 860 | s.baud(115200); |
paulocroman | 77:3273a1d44741 | 861 | spi.format(8); |
paulocroman | 77:3273a1d44741 | 862 | spi.frequency(1000000); |
paulocroman | 77:3273a1d44741 | 863 | AFE4490Initialize(); |
paulocroman | 77:3273a1d44741 | 864 | RegisterWrite(CONTROL0, 0x000001); //SPI_Read Enable |
paulocroman | 77:3273a1d44741 | 865 | t.start(); |
paulocroman | 77:3273a1d44741 | 866 | |
paulocroman | 77:3273a1d44741 | 867 | RegisterWrite(CONTROL0, 0x000000); |
paulocroman | 77:3273a1d44741 | 868 | RegisterWrite(LEDCNTRL, 0x10404); |
paulocroman | 77:3273a1d44741 | 869 | RegisterWrite(TIAGAIN, 0x00); |
paulocroman | 77:3273a1d44741 | 870 | RegisterWrite(TIA_AMB_GAIN, 0x00); |
paulocroman | 77:3273a1d44741 | 871 | RegisterWrite(CONTROL0, 0x000001); |
paulocroman | 77:3273a1d44741 | 872 | |
rgrover1 | 73:49b6090478e2 | 873 | |
mbedAustin | 55:3a7d497a3e03 | 874 | // infinite loop |
mbedAustin | 55:3a7d497a3e03 | 875 | while (1) { |
paulocroman | 77:3273a1d44741 | 876 | |
paulocroman | 77:3273a1d44741 | 877 | doCmd(); |
paulocroman | 77:3273a1d44741 | 878 | |
mbedAustin | 55:3a7d497a3e03 | 879 | // check for trigger from periodicCallback() |
paulocroman | 77:3273a1d44741 | 880 | if (/*triggerSensorPolling && */ble.getGapState().connected) { |
Rohit Grover |
36:ea2a1b4f51c1 | 881 | triggerSensorPolling = false; |
Rohit Grover |
36:ea2a1b4f51c1 | 882 | |
mbedAustin | 55:3a7d497a3e03 | 883 | // Do blocking calls or whatever is necessary for sensor polling. |
rgrover1 | 67:b2d2dee347c0 | 884 | // In our case, we simply update the HRM measurement. |
paulocroman | 77:3273a1d44741 | 885 | hrmCounter+=5; |
rgrover1 | 72:99c283dfe28d | 886 | if (hrmCounter == 175) { // 100 <= HRM bps <=175 |
Rohit Grover |
36:ea2a1b4f51c1 | 887 | hrmCounter = 100; |
Rohit Grover |
36:ea2a1b4f51c1 | 888 | } |
paulocroman | 77:3273a1d44741 | 889 | |
paulocroman | 77:3273a1d44741 | 890 | loop_o(); |
paulocroman | 77:3273a1d44741 | 891 | hrmCounter=4096+redRead/512; |
paulocroman | 77:3273a1d44741 | 892 | uint16_t z=0; |
paulocroman | 77:3273a1d44741 | 893 | z=4096+greenRead/512; |
paulocroman | 77:3273a1d44741 | 894 | //hrService->updateHeartRate(greenRead,redRead); |
paulocroman | 77:3273a1d44741 | 895 | //hrService->updateHeartRate(fGreenRead,fRedRead); |
paulocroman | 77:3273a1d44741 | 896 | //fGreenRead=0; |
paulocroman | 77:3273a1d44741 | 897 | //fRedRead=76543; |
paulocroman | 77:3273a1d44741 | 898 | if ( iGER ) fGreenRead=fRedRead; |
paulocroman | 77:3273a1d44741 | 899 | if ( iREG ) fRedRead=fGreenRead; |
paulocroman | 77:3273a1d44741 | 900 | hrService->updateHeartRate(fGreenRead,fRedRead); |
Rohit Grover |
36:ea2a1b4f51c1 | 901 | } else { |
paulocroman | 77:3273a1d44741 | 902 | if ( !nINCMD ) ble.waitForEvent(); // low power wait for event |
Rohit Grover |
36:ea2a1b4f51c1 | 903 | } |
ktownsend | 0:87a7fc231fae | 904 | } |
ktownsend | 0:87a7fc231fae | 905 | } |