BLE FORK

Dependencies:   BLE_API mbed nRF51822

Fork of BLE_HeartRate by Bluetooth Low Energy

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?

UserRevisionLine numberNew 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 }