Logger to USB stick running on KL25Z

Dependencies:   F401RE-USBHost FastAnalogIn RTC mbed tsi_sensor2 mbed-rtos2

Fork of ReadSendData by Stuart Scott

Homepage for kXX_logger(was kl25x_usb_logger)

2014Nov12 - Added TSI - only works for kl25z, and fails after 4287seconds

Tests sequences for freezing 4287seconds 4287 4287 - Changed to USB write update every two seconds and lasted 4283seconds. Added mbed TSI_sensor - kudos to mbed as it turns out to be complex to do capacitive touch sensing. Kinetis L series Cortex-M0 (kl25z) has simpler capacitive sensing hardware which mbed/TSI_sensor lib uses, but doesn't support Cortex-M4 versions. K20D is older more complex interface. TSS hasn't had an open source support by Freescale in the past however that has changed. Currently I found KDS1.1.1 has a Processor Expert TSSlib that can be imported - but I'm getting a weird compile/include error - and not found any examples of how to make it work.

2014Oct05 - Published simple kl25z_usb_logger

Testing: Version (2:f06fbf86887e) has run over 28days starting 2014Sept07, reading a sensor data every seconds and then on the USB stick open file, write record, close file

This is over 2,419,200seconds ( 28days*24hrs*3600seconds) The stick data reflected 2,447,633 seconds, but only had 1,776,366 data records. After 407,650 data records started missing updates - analysis: the file could not be opened and read to the end in the allocated 1 second, and therefore missed the next ADC deadline.

By the end of the test period with 1,776,366 records on the USB Stick, ever read then write was causing it to miss two/three ADC updates - ie taking longer than two seconds.

Analysis: this was an aggressive test, and normally would not be opening, writing, closing every 1 second. However big plus the file mechanism held up and the program continued to operate, with a graceful failure of a missed ADC readings. The output used JSON, which reads nicely but turns out not to be supported by Excel (2014?) I was using.

Conclusion: Overall the USB Mechanisms and file read is stable. However the USB stack used doesn't have an event based management for stick insertion and removal, or OTG power management . This KL25Z has been a very useful test to prove the configuration of clocks for USB Stack is possible and stable. The target processor being looked at is the MK20 and is similar in clocks, but slightly more comprehensive USB OTG Next step is to investigate the full Freescale Kinetis USB OTG Stack with power management on a custom K20 board, using Kinetis Design Studio, and very low power capability.

Example https://github.com/ErichStyger/mcuoneclipse/tree/master/Examples/FRDM-K20D50M/FRDM-K20_MSD_Host http://mcuoneclipse.com/2014/10/25/usb-cdc-with-the-frdm-k64f-finally/#comment-37727 - Commentary on Freescale USB versions

Committer:
neilh20
Date:
Tue Nov 11 22:19:43 2014 +0000
Revision:
12:d2e6f79d6fdb
Parent:
11:fefb12811584
Child:
13:729f5ae38c24
Kl25x water depth to JSON on USB MSC - tested.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
neilh20 2:f06fbf86887e 1 /* low power data logger. [FRDM-KL25Z]
neilh20 2:f06fbf86887e 2
neilh20 2:f06fbf86887e 3 Periodically read data from ADC and when present write it in JSON format to USB Stick
neilh20 2:f06fbf86887e 4
neilh20 2:f06fbf86887e 5 Copyright http://www.apache.org/licenses/LICENSE-2.0
neilh20 2:f06fbf86887e 6 and all subsystems per their own licenses which are believed to be GPL 2.0
neilh20 2:f06fbf86887e 7
neilh20 2:f06fbf86887e 8 [c]Record an analoge value to an internal buffer
neilh20 2:f06fbf86887e 9 [p]and when a USB stick is plugged in store the values on the USB stick in JSON format
neilh20 2:f06fbf86887e 10 (currently requires USB stick at reset)
neilh20 2:f06fbf86887e 11 [c]Debug output the events as they happen.
neilh20 2:f06fbf86887e 12 [c]The ticker delay sets the sampling rate.
neilh20 2:f06fbf86887e 13 [F]Date is set when user sets it,
neilh20 2:f06fbf86887e 14 [c]or elapsed time used in the beginning
neilh20 2:f06fbf86887e 15
neilh20 2:f06fbf86887e 16 [F]If OpenSDA USB power supplied, then flash LEDs to indicate activity as follows
neilh20 2:f06fbf86887e 17 [c]1) the Blue led when taking a sample
neilh20 2:f06fbf86887e 18 [c]2) the green led when delivering samples to the USB stick
neilh20 2:f06fbf86887e 19 [F]3)no led shall be on at same time for clear colours
neilh20 2:f06fbf86887e 20
neilh20 2:f06fbf86887e 21 [F] when not doing anything else sleep to conserve power.
sas37 0:eb0dc2b5bc51 22
neilh20 2:f06fbf86887e 23 To modify this for your application, assuming a ratiometric input to the Vref=3.3V
neilh20 2:f06fbf86887e 24 1) Determine physical pins ADC performed on and type of conversion,
neilh20 2:f06fbf86887e 25 1) Determine the "multiplier" from the incoming 16bit ADC wrt to 3.3V to your units.
neilh20 2:f06fbf86887e 26 2) Write the output code changing the JSON headers to define your headers, dataConversion and units
neilh20 2:f06fbf86887e 27
neilh20 2:f06fbf86887e 28 Thanks to other authors for setting up KL25z for
neilh20 2:f06fbf86887e 29 * FastAnalogIn Library mbed.org/users/Sissors/code/FastAnalogIn/
neilh20 2:f06fbf86887e 30 * USB Host mbed.org/users/va009039/code/F401RE-USBHost/
neilh20 2:f06fbf86887e 31
neilh20 2:f06fbf86887e 32 [] 1st three character nomeclature.
neilh20 2:f06fbf86887e 33 [x] indicates implemented state of feature
neilh20 2:f06fbf86887e 34 [c] - complete and unit tested
neilh20 2:f06fbf86887e 35 [p] - partial in progress or not unit tested
neilh20 2:f06fbf86887e 36 [f] - future idea
sas37 0:eb0dc2b5bc51 37
neilh20 2:f06fbf86887e 38 Testing: Basic tests performed, see attached file logger_tests.docx
neilh20 2:f06fbf86887e 39
neilh20 2:f06fbf86887e 40 Modifications to Hardware
neilh20 2:f06fbf86887e 41 1) FRDM-KL25z add J21 and R8 per the instruction manual for USB host
sas37 0:eb0dc2b5bc51 42
neilh20 2:f06fbf86887e 43 Issues:
neilh20 2:f06fbf86887e 44 1) FRDM-KL25z hardware not designed to switch the USB power so saving power on a connected USB device.
neilh20 2:f06fbf86887e 45 Solution: Add switched 5V power.
neilh20 2:f06fbf86887e 46 2) FRDM-KL25z Hardware not designed for low power accurate wall time clock - wastes power keeping the 8Mhz going.
neilh20 2:f06fbf86887e 47 Solution: add an external low power 32KHz oscilator into hardware pin RTC_IN (An osc is the next step up from a raw Xtal)
sas37 0:eb0dc2b5bc51 48
sas37 0:eb0dc2b5bc51 49
sas37 0:eb0dc2b5bc51 50 */
sas37 0:eb0dc2b5bc51 51
neilh20 2:f06fbf86887e 52 #include "mbed.h"
neilh20 2:f06fbf86887e 53 #include "rtc_api.h"
neilh20 2:f06fbf86887e 54 #include "FastAnalogIn.h"
neilh20 2:f06fbf86887e 55 #include "USBHostMSD.h"
neilh20 2:f06fbf86887e 56
neilh20 9:f3f7ca1da2a8 57
neilh20 9:f3f7ca1da2a8 58 #if defined(TARGET_K20D50M)
neilh20 9:f3f7ca1da2a8 59 #define TsiActive 0
neilh20 9:f3f7ca1da2a8 60
neilh20 9:f3f7ca1da2a8 61 #elif defined (TARGET_KL25Z) || defined (TARGET_KL46Z)
neilh20 12:d2e6f79d6fdb 62 #define TsiActive 1
neilh20 9:f3f7ca1da2a8 63 #include "tsi_sensor.h"
neilh20 11:fefb12811584 64 //Cap Sensor B0=CH0, B1=CH6
neilh20 12:d2e6f79d6fdb 65 #define ELEC0 0
neilh20 12:d2e6f79d6fdb 66 #define ELEC1 6
neilh20 11:fefb12811584 67 //FRDM_KL25x slider electrodes - TSI0_CH9=PTB16, CH10=B17
neilh20 12:d2e6f79d6fdb 68 // #define ELEC0 9
neilh20 12:d2e6f79d6fdb 69 // #define ELEC1 10
neilh20 9:f3f7ca1da2a8 70 TSIAnalogSlider tsi(ELEC0, ELEC1, 40);
neilh20 12:d2e6f79d6fdb 71 //TSIElectrode tsiElec0(ELEC0);
neilh20 12:d2e6f79d6fdb 72 //TSIElectrode tsiElec1(ELEC1);
neilh20 11:fefb12811584 73 //#define TsiRead() tsi.readDistance() - has problesm
neilh20 10:b74fa5ec4af4 74 #define TsiRead() tsi.readPercentage()
neilh20 9:f3f7ca1da2a8 75 #elif defined (TARGET_KL05Z)
neilh20 9:f3f7ca1da2a8 76 #define TsiActive 0
neilh20 9:f3f7ca1da2a8 77 #include "TSISensor.h"
neilh20 9:f3f7ca1da2a8 78
neilh20 9:f3f7ca1da2a8 79 #define ELEC0 9
neilh20 9:f3f7ca1da2a8 80 #define ELEC1 8
neilh20 9:f3f7ca1da2a8 81 TSIAnalogSlider tsi(ELEC0, ELEC1, 40);
neilh20 10:b74fa5ec4af4 82 //#define TsiRead(void) tsi.Distance()
neilh20 9:f3f7ca1da2a8 83 #else
neilh20 9:f3f7ca1da2a8 84 #define TsiActive 0
neilh20 9:f3f7ca1da2a8 85 #error TARGET NOT DEFINED
neilh20 9:f3f7ca1da2a8 86 #endif
neilh20 9:f3f7ca1da2a8 87
neilh20 10:b74fa5ec4af4 88 float tsiSlider_dist;
neilh20 12:d2e6f79d6fdb 89 uint32_t elec0p,elec1p;
neilh20 2:f06fbf86887e 90 //size of sample buffer
neilh20 2:f06fbf86887e 91 #define BuffSize 16 //16 to test, upto kl25z spare ram of about xxxx?, !2000, linker warns if too large, but also fails
neilh20 2:f06fbf86887e 92 //set the delay used by the ticker
neilh20 2:f06fbf86887e 93 const int sysTockInit_sec = 1; //Test 1, Real life 15minutes or 900sec
sas37 0:eb0dc2b5bc51 94
sas37 0:eb0dc2b5bc51 95 using namespace mbed;
sas37 0:eb0dc2b5bc51 96
neilh20 2:f06fbf86887e 97 //Device Init - per FRDM-KL25Z
neilh20 2:f06fbf86887e 98 DigitalOut ledRed(LED1);
neilh20 11:fefb12811584 99 //DigitalOut ledGrn(LED2);
neilh20 11:fefb12811584 100 PwmOut ledPwmGrn(LED2);
neilh20 2:f06fbf86887e 101 DigitalOut ledBlue(LED3);
neilh20 2:f06fbf86887e 102 FastAnalogIn ainPinAA(PTC2); ///AnalogAin pin
sas37 0:eb0dc2b5bc51 103
sas37 0:eb0dc2b5bc51 104 Serial pc(USBTX, USBRX);
sas37 0:eb0dc2b5bc51 105
neilh20 2:f06fbf86887e 106 //Samples stored here - needs to be compact as can use a lot of internal ram
neilh20 2:f06fbf86887e 107 unsigned short sample_u16[BuffSize]; //critical resource for number of samples
neilh20 2:f06fbf86887e 108 unsigned int time_[BuffSize];
sas37 0:eb0dc2b5bc51 109
neilh20 2:f06fbf86887e 110 FILE* fpUsb;
neilh20 2:f06fbf86887e 111 bool UsbPresent=0;
neilh20 2:f06fbf86887e 112 bool warmBoot = rtc_isenabled();
neilh20 2:f06fbf86887e 113 long lp2i =0;
neilh20 2:f06fbf86887e 114 bool sysEventA=0; //Local event
neilh20 2:f06fbf86887e 115 unsigned int tmrE_evt; //Elapsed
neilh20 2:f06fbf86887e 116 Ticker tock; //periodic tick
neilh20 2:f06fbf86887e 117
neilh20 2:f06fbf86887e 118 USBHostMSD msd("usbAa"); //defines the file system access
neilh20 2:f06fbf86887e 119
neilh20 6:261c5054fd51 120 #if defined(TARGET_K20D50M)
neilh20 6:261c5054fd51 121 const char meProc[] = "K20D50M";
neilh20 6:261c5054fd51 122 #elif defined(TARGET_KL25Z)
neilh20 6:261c5054fd51 123 const char meProc[]= "KL25Z";
neilh20 6:261c5054fd51 124 #else //#if defined(TARGET_KL46Z)||defined(TARGET_K64F)
neilh20 6:261c5054fd51 125 #error Undef processor
neilh20 6:261c5054fd51 126 #endif //
neilh20 9:f3f7ca1da2a8 127
neilh20 9:f3f7ca1da2a8 128
neilh20 9:f3f7ca1da2a8 129
neilh20 9:f3f7ca1da2a8 130
neilh20 9:f3f7ca1da2a8 131
neilh20 2:f06fbf86887e 132 //--------------------------------------------------------------
neilh20 2:f06fbf86887e 133 void tockEvent()
sas37 0:eb0dc2b5bc51 134 {
neilh20 2:f06fbf86887e 135 tmrE_evt++;
neilh20 2:f06fbf86887e 136 sysEventA=1;
sas37 0:eb0dc2b5bc51 137 }
sas37 0:eb0dc2b5bc51 138
neilh20 2:f06fbf86887e 139 //--------------------------------------------------------------
neilh20 2:f06fbf86887e 140 /* Process output Header to USB,
neilh20 2:f06fbf86887e 141 return !0 if valid USB present
neilh20 2:f06fbf86887e 142 */
neilh20 2:f06fbf86887e 143 bool outputHeaderUsb() {
neilh20 2:f06fbf86887e 144 // JSON {"headings":{"time":{"elapsed":"seconds"}, "adcN":"normalized_to_1.0", "adcV":"Volts"}}
neilh20 2:f06fbf86887e 145
neilh20 2:f06fbf86887e 146 if (!UsbPresent)
neilh20 2:f06fbf86887e 147 {
neilh20 2:f06fbf86887e 148 if (msd.connect()) //Attempt to find a device
neilh20 2:f06fbf86887e 149 {//USB Event: newly connected so attempt write header
neilh20 2:f06fbf86887e 150 if (NULL !=(fpUsb = fopen("/usbAa/test1.txt", "a")))
neilh20 2:f06fbf86887e 151 {
neilh20 2:f06fbf86887e 152 pc.printf("USB File test1.txt opened.\n\r");
neilh20 9:f3f7ca1da2a8 153 fprintf(fpUsb,"{\"headings\":{\"time\":{\"elapsed\":\"seconds\"}, \"adcN\":\"normalized_to_1.0\", \"adcV\":\"Volts\"}"
neilh20 9:f3f7ca1da2a8 154 #if TsiActive
neilh20 9:f3f7ca1da2a8 155 "\"tsi\":\"[0-40]\""
neilh20 9:f3f7ca1da2a8 156 #endif
neilh20 9:f3f7ca1da2a8 157 "}}\n");
neilh20 2:f06fbf86887e 158 UsbPresent=1;
neilh20 2:f06fbf86887e 159 fclose(fpUsb); fpUsb=NULL;
neilh20 2:f06fbf86887e 160 } else {
neilh20 2:f06fbf86887e 161 //Can't find a file for some reason. Could be USB full or failed software
neilh20 2:f06fbf86887e 162 pc.printf(" Error: USB File not opened.\n\r");
neilh20 2:f06fbf86887e 163 UsbPresent=0;
neilh20 2:f06fbf86887e 164 }
neilh20 2:f06fbf86887e 165 } //else //Can't find USB device
neilh20 2:f06fbf86887e 166 } else {
neilh20 2:f06fbf86887e 167 // UsbPresent and assume headers written
neilh20 2:f06fbf86887e 168 if (!msd.connected())
neilh20 2:f06fbf86887e 169 {
neilh20 2:f06fbf86887e 170 pc.printf(" USB Flash drive removed.\n\r");
neilh20 2:f06fbf86887e 171 UsbPresent=0;
neilh20 2:f06fbf86887e 172 }
neilh20 2:f06fbf86887e 173 }
neilh20 2:f06fbf86887e 174
neilh20 2:f06fbf86887e 175 return UsbPresent;
neilh20 2:f06fbf86887e 176 }
neilh20 2:f06fbf86887e 177 //--------------------------------------------------------------
neilh20 2:f06fbf86887e 178 void outputHeaders(void) {
neilh20 2:f06fbf86887e 179 outputHeaderUsb();
neilh20 2:f06fbf86887e 180 pc.printf(" Time(S) depthR(norm) Volts Idx %d\n\r",(unsigned int) rtc_read());
neilh20 2:f06fbf86887e 181 }//outputHeaders
sas37 0:eb0dc2b5bc51 182
neilh20 2:f06fbf86887e 183
neilh20 2:f06fbf86887e 184
neilh20 2:f06fbf86887e 185 //--------------------------------------------------------------
neilh20 2:f06fbf86887e 186 /* Manage the write to USB stick
neilh20 2:f06fbf86887e 187 [FUT] detect USB stick and if not present write it when inserted
neilh20 2:f06fbf86887e 188
neilh20 2:f06fbf86887e 189 JSON output json.org
neilh20 2:f06fbf86887e 190 {key:value, key:value, key:value}
neilh20 2:f06fbf86887e 191 {time:[elapsed:<secs 0-2**32>, epoch2014:<secs 0-2**32>,wall:[date:<>,clock:<>],],
neilh20 2:f06fbf86887e 192 adcNorm:<float number 0.0-1.0>,
neilh20 2:f06fbf86887e 193 adcV:<Volts 0-VRef>
neilh20 2:f06fbf86887e 194 */
neilh20 11:fefb12811584 195 bool manageUsbWrite() {
neilh20 2:f06fbf86887e 196 #define ADC_NORMALIZE (1.0f/65535.0f)
neilh20 2:f06fbf86887e 197 #define ADC_NORM_VREF 3.3
neilh20 2:f06fbf86887e 198 float data_n=( ((float)sample_u16[lp2i]) * ADC_NORMALIZE);
neilh20 11:fefb12811584 199 bool writeUsb=0;
neilh20 6:261c5054fd51 200 //Future redesign to use USBHALHost::wait_attach()
neilh20 2:f06fbf86887e 201 if (outputHeaderUsb())
neilh20 2:f06fbf86887e 202 {
neilh20 2:f06fbf86887e 203 if (NULL !=(fpUsb = fopen("/usbAa/test1.txt", "a")))
neilh20 2:f06fbf86887e 204 {
neilh20 9:f3f7ca1da2a8 205 #if TsiActive
neilh20 9:f3f7ca1da2a8 206 //del pc.printf("%10d %5.4f (%6.4fV) %i\n\r",time_[lp2i],data_n,(ADC_NORM_VREF*data_n),lp2i);
neilh20 12:d2e6f79d6fdb 207 fprintf(fpUsb, "{\"time\":{\"elapsed\":%10d},\"adcN\": %5.4f, \"adcV\":%6.4f, \"delta\":%i<%i~%i> \"tsi\":%4.2f}\n",time_[lp2i],
neilh20 12:d2e6f79d6fdb 208 data_n,(ADC_NORM_VREF*data_n),
neilh20 12:d2e6f79d6fdb 209 elec0p-elec1p,elec0p,elec1p,tsiSlider_dist);
neilh20 9:f3f7ca1da2a8 210 #else
neilh20 2:f06fbf86887e 211 fprintf(fpUsb, "{\"time\":{\"elapsed\":%10d},\"adcN\": %5.4f, \"adcV\":%6.4f}\n",time_[lp2i],data_n,(ADC_NORM_VREF*data_n));
neilh20 9:f3f7ca1da2a8 212 #endif
neilh20 2:f06fbf86887e 213 fclose(fpUsb); fpUsb=NULL;
neilh20 11:fefb12811584 214 writeUsb=1;
neilh20 2:f06fbf86887e 215 } else {
neilh20 2:f06fbf86887e 216 //Potential Error
neilh20 2:f06fbf86887e 217 UsbPresent=0; //Can't say its dissappeared as will cause USB find problem.
neilh20 2:f06fbf86887e 218 pc.printf(" Error: USB unexpected can't write!!\n\r");
neilh20 11:fefb12811584 219 //writeUsb=0;
neilh20 2:f06fbf86887e 220 }
neilh20 2:f06fbf86887e 221 }
neilh20 11:fefb12811584 222 return writeUsb;
neilh20 2:f06fbf86887e 223 }
neilh20 2:f06fbf86887e 224 //--------------------------------------------------------------
neilh20 2:f06fbf86887e 225 /* Manage the sample
neilh20 2:f06fbf86887e 226 - store it
neilh20 2:f06fbf86887e 227 - and write it to USB stick
neilh20 2:f06fbf86887e 228 [FUT] detect USB stick and if not present write it when inserted
neilh20 2:f06fbf86887e 229
neilh20 2:f06fbf86887e 230 JSON output json.org
neilh20 2:f06fbf86887e 231 {key:value, key:value, key:value}
neilh20 2:f06fbf86887e 232 {time:[elapsed:<secs 0-2**32>, epoch2014:<secs 0-2**32>,wall:[date:<>,clock:<>],],
neilh20 2:f06fbf86887e 233 adcNorm:<float number 0.0-1.0>,
neilh20 2:f06fbf86887e 234 adcV:<Volts 0-VRef>}
neilh20 2:f06fbf86887e 235 */
neilh20 2:f06fbf86887e 236 void manageSample() {
neilh20 2:f06fbf86887e 237 float data_n=( ((float)sample_u16[lp2i]) * ADC_NORMALIZE);
neilh20 12:d2e6f79d6fdb 238 pc.printf("\n\r%10d %5.4f (%6.4fV) %i<%i~%i>%4.2f %i",time_[lp2i],data_n,(ADC_NORM_VREF*data_n),
neilh20 12:d2e6f79d6fdb 239 elec0p-elec1p,elec0p,elec1p,tsiSlider_dist,
neilh20 12:d2e6f79d6fdb 240 lp2i);
neilh20 11:fefb12811584 241
neilh20 11:fefb12811584 242 //ledGrn = !(lp2i&0x01);//!ledGrn; syncs with blue led flashing
neilh20 11:fefb12811584 243 ledPwmGrn = ((lp2i&0x01) ? (1.0-tsiSlider_dist) : 1.0 ); //LEDGrn=1 off, =0 On
neilh20 11:fefb12811584 244
neilh20 11:fefb12811584 245 if (1==manageUsbWrite()) {
neilh20 11:fefb12811584 246 ledBlue = (lp2i&0x01);//!ledBlue;
neilh20 11:fefb12811584 247 } else {ledBlue =1;}//off
neilh20 2:f06fbf86887e 248
neilh20 2:f06fbf86887e 249 }//end manageSample
neilh20 2:f06fbf86887e 250
neilh20 2:f06fbf86887e 251 //--------------------------------------------------------------
neilh20 2:f06fbf86887e 252 /* Manage the sample
neilh20 2:f06fbf86887e 253 - take an ADC sample and
neilh20 2:f06fbf86887e 254 */
neilh20 2:f06fbf86887e 255 void manageAdcIn(void){
neilh20 2:f06fbf86887e 256 //Take samples and store in buffer
neilh20 2:f06fbf86887e 257 if (++lp2i >= BuffSize) lp2i=0;
neilh20 2:f06fbf86887e 258 sample_u16[lp2i]=ainPinAA.read_u16();
neilh20 2:f06fbf86887e 259 time_[lp2i]=(unsigned int)tmrE_evt; //TODO - replace with wall time
neilh20 12:d2e6f79d6fdb 260 //tsiSlider_dist = TsiRead();
neilh20 12:d2e6f79d6fdb 261 elec0p = tsi.getDelta0();
neilh20 12:d2e6f79d6fdb 262 elec1p = tsi.getDelta1();
neilh20 12:d2e6f79d6fdb 263 tsiSlider_dist = (float)tsi.readPercentage();
neilh20 12:d2e6f79d6fdb 264
neilh20 2:f06fbf86887e 265 }//manageAdcIn
neilh20 2:f06fbf86887e 266
neilh20 2:f06fbf86887e 267 //--------------------------------------------------------------
neilh20 3:d94384ab6f12 268 int main() {
neilh20 2:f06fbf86887e 269
neilh20 2:f06fbf86887e 270 //TODO: check RCM_SRS0 &RS1
neilh20 2:f06fbf86887e 271 warmBoot = rtc_isenabled();
neilh20 2:f06fbf86887e 272 if (!warmBoot) {
neilh20 2:f06fbf86887e 273 //TODO figure out how to manage wall time
neilh20 2:f06fbf86887e 274 rtc_init(); //Assumes external clock - TODO: options int32Khz RTC_CLKIN ext32KhzXtal
neilh20 2:f06fbf86887e 275 rtc_write(0x0); //Init to some default;
neilh20 2:f06fbf86887e 276 }
neilh20 4:a3692e095388 277
neilh20 4:a3692e095388 278 ledRed =0;//ON
neilh20 11:fefb12811584 279 //ledGrn =1; //off
neilh20 11:fefb12811584 280 ledPwmGrn =1.0; //off
neilh20 4:a3692e095388 281 ledBlue = 1; //on
neilh20 6:261c5054fd51 282 wait_ms(5000);
neilh20 4:a3692e095388 283 //Thread::wait(2000);
neilh20 2:f06fbf86887e 284 ledRed =1;//Off
neilh20 11:fefb12811584 285 //ledGrn =1; //off
neilh20 11:fefb12811584 286 ledPwmGrn =1.0; //off
neilh20 2:f06fbf86887e 287 ledBlue = 0; //on
neilh20 2:f06fbf86887e 288 pc.baud(115200);//Opt 57600
neilh20 6:261c5054fd51 289
neilh20 6:261c5054fd51 290 pc.printf("\n\r%s Logger v0.1 \n\r Sample [time=%dsec, size=%d] Clock=%d\n\r",meProc, sysTockInit_sec,BuffSize,SystemCoreClock);
neilh20 2:f06fbf86887e 291
neilh20 2:f06fbf86887e 292 outputHeaders();
neilh20 2:f06fbf86887e 293
neilh20 2:f06fbf86887e 294 tock.attach(&tockEvent,sysTockInit_sec);
neilh20 2:f06fbf86887e 295
sas37 0:eb0dc2b5bc51 296 while (true) {
neilh20 2:f06fbf86887e 297 if(sysEventA)
neilh20 2:f06fbf86887e 298 {
neilh20 2:f06fbf86887e 299 sysEventA=0;
neilh20 2:f06fbf86887e 300 manageAdcIn();
neilh20 2:f06fbf86887e 301 manageSample();
neilh20 2:f06fbf86887e 302 }//else
neilh20 2:f06fbf86887e 303 // TODO go into power down till next event
sas37 0:eb0dc2b5bc51 304 }
neilh20 2:f06fbf86887e 305
sas37 0:eb0dc2b5bc51 306 }