2014-12-10 5:41 1 second pulse (serial)

Dependencies:   MODSERIALhacked Convert SLCD mbed-src

Committer:
jhaugen
Date:
Thu Dec 18 10:56:52 2014 +0000
Revision:
12:c97d6cd17314
Parent:
11:79eabc671800
Added timestamping to sensor readings.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
resolutedreamer 0:68d1c7f2dbc7 1 #include "mbed.h"
jhaugen 2:a4db8ee941d2 2 #include "convert.h"
jhaugen 8:a44d03ecc942 3 #include "double_buffer.h"
resolutedreamer 0:68d1c7f2dbc7 4
jhaugen 8:a44d03ecc942 5 #include "MODSERIAL.h"
jhaugen 8:a44d03ecc942 6
jhaugen 8:a44d03ecc942 7 #include "sine_table.h"
jhaugen 8:a44d03ecc942 8
jhaugen 8:a44d03ecc942 9 #define SINE_OUT_FREQ_MASK 3
jhaugen 8:a44d03ecc942 10 #define SINE_OUT_FREQ_1HZ 0
jhaugen 8:a44d03ecc942 11 #define SINE_OUT_FREQ_10HZ 1
jhaugen 8:a44d03ecc942 12 #define SINE_OUT_FREQ_100HZ 2
jhaugen 8:a44d03ecc942 13 #define SINE_OUT_FREQ_1000HZ 3
jhaugen 8:a44d03ecc942 14
jhaugen 8:a44d03ecc942 15 #define SINE_OUT_ON_MASK 4
jhaugen 8:a44d03ecc942 16 #define SINE_OUT_ON 4
jhaugen 8:a44d03ecc942 17 #define SINE_OUT_OFF 0
jhaugen 8:a44d03ecc942 18
jhaugen 8:a44d03ecc942 19 #define D_OUT_MASK 8
jhaugen 8:a44d03ecc942 20 #define D_OUT_ON 8
jhaugen 8:a44d03ecc942 21 #define D_OUT_OFF 0
jhaugen 8:a44d03ecc942 22
jhaugen 8:a44d03ecc942 23 #define ADC_SAMP_FREQ_MASK 48
jhaugen 8:a44d03ecc942 24 #define ADC_SAMP_FREQ_OFF 0
jhaugen 8:a44d03ecc942 25 #define ADC_SAMP_FREQ_1HZ 16
jhaugen 8:a44d03ecc942 26 #define ADC_SAMP_FREQ_10HZ 32
jhaugen 8:a44d03ecc942 27 #define ADC_SAMP_FREQ_100HZ 48
jhaugen 8:a44d03ecc942 28
jhaugen 8:a44d03ecc942 29 #define SINE_TABLE_SIZE 1000
jhaugen 8:a44d03ecc942 30
jhaugen 8:a44d03ecc942 31 MODSERIAL pc(USBTX, USBRX);
jhaugen 5:112df51d4815 32
resolutedreamer 6:3fbe44c7c26a 33 AnalogIn my_light_sensor(PTE22);
resolutedreamer 6:3fbe44c7c26a 34 AnalogIn my_analog_pin(PTB0);
jhaugen 8:a44d03ecc942 35
jhaugen 8:a44d03ecc942 36 AnalogOut sine_out_pin(PTE30);
jhaugen 8:a44d03ecc942 37
jhaugen 8:a44d03ecc942 38 InterruptIn d_event_pin(PTA4);
jhaugen 8:a44d03ecc942 39
jhaugen 5:112df51d4815 40 // false == on; true == off for the leds
resolutedreamer 0:68d1c7f2dbc7 41 DigitalOut myled(LED_GREEN);
jhaugen 5:112df51d4815 42 DigitalOut redled(LED_RED);
jhaugen 8:a44d03ecc942 43 DigitalOut hundms_pulse_pin(PTA12);
jhaugen 8:a44d03ecc942 44 DigitalOut d_out_pin(PTD3);
jhaugen 7:c81c6968f013 45 Timer timer;
jhaugen 8:a44d03ecc942 46 long long offset = 0;
jhaugen 8:a44d03ecc942 47
jhaugen 12:c97d6cd17314 48 DoubleBuffer<unsigned short, 50> light_sensor_buffer;
jhaugen 12:c97d6cd17314 49 DoubleBuffer<unsigned short, 500> adc_buffer;
jhaugen 12:c97d6cd17314 50 DoubleBuffer<long long, 30> d_event_buffer;
resolutedreamer 0:68d1c7f2dbc7 51
jhaugen 7:c81c6968f013 52 //initialize variables
jhaugen 5:112df51d4815 53 Ticker ticker;
jhaugen 7:c81c6968f013 54 char t1_string[31];
jhaugen 7:c81c6968f013 55 char t4_string[31];
jhaugen 7:c81c6968f013 56 int t2;
jhaugen 7:c81c6968f013 57 int t3;
jhaugen 8:a44d03ecc942 58 //int i = 0;
jhaugen 7:c81c6968f013 59 bool pulse_value = false;
jhaugen 8:a44d03ecc942 60 //float let_there_be_light = 0.0;
jhaugen 8:a44d03ecc942 61 //float my_analog_value = 0.0;
jhaugen 7:c81c6968f013 62 Convert lcd;
jhaugen 8:a44d03ecc942 63
jhaugen 8:a44d03ecc942 64 //int adc_sampling_on = 0;
jhaugen 8:a44d03ecc942 65 int d_out_on = 0;
jhaugen 8:a44d03ecc942 66 int sine_out_on = 0;
jhaugen 8:a44d03ecc942 67
jhaugen 8:a44d03ecc942 68 int adc_sampling_frequency = ADC_SAMP_FREQ_1HZ;
jhaugen 8:a44d03ecc942 69 int sine_out_frequency = SINE_OUT_FREQ_1000HZ;
jhaugen 8:a44d03ecc942 70
jhaugen 8:a44d03ecc942 71 #define ANALOG_VALUE_BUFFER_SIZE 500
jhaugen 8:a44d03ecc942 72
jhaugen 8:a44d03ecc942 73 /*float analog_values[2][ANALOG_VALUE_BUFFER_SIZE];
jhaugen 8:a44d03ecc942 74 int analog_fill_buffer = 0;
jhaugen 8:a44d03ecc942 75 int analog_value0_size = 0;
jhaugen 8:a44d03ecc942 76 int analog_value1_size = 0;*/
jhaugen 8:a44d03ecc942 77
jhaugen 8:a44d03ecc942 78 //bool read_complete = false;
jhaugen 7:c81c6968f013 79
jhaugen 5:112df51d4815 80 int tick_count = 0;
jhaugen 8:a44d03ecc942 81 int sine_index = 0;
jhaugen 8:a44d03ecc942 82
jhaugen 8:a44d03ecc942 83
jhaugen 8:a44d03ecc942 84 // sets the flags from the website backend
jhaugen 8:a44d03ecc942 85 void set_options(char opt) {
jhaugen 8:a44d03ecc942 86 adc_sampling_frequency = opt & ADC_SAMP_FREQ_MASK;
jhaugen 8:a44d03ecc942 87 d_out_on = opt & D_OUT_MASK;
jhaugen 8:a44d03ecc942 88 sine_out_on = opt & SINE_OUT_ON_MASK;
jhaugen 8:a44d03ecc942 89 sine_out_frequency = opt & SINE_OUT_FREQ_MASK;
jhaugen 8:a44d03ecc942 90 }
jhaugen 8:a44d03ecc942 91
jhaugen 8:a44d03ecc942 92 /*void read_adc() {
jhaugen 8:a44d03ecc942 93 int analog_buffer_size;
jhaugen 8:a44d03ecc942 94 if (analog_fill_buffer == 0) {
jhaugen 8:a44d03ecc942 95 if (analog_value0_size >= ANALOG_VALUE_BUFFER_SIZE) {
jhaugen 8:a44d03ecc942 96 return;
jhaugen 8:a44d03ecc942 97 }
jhaugen 8:a44d03ecc942 98 analog_buffer_size = analog_value0_size;
jhaugen 8:a44d03ecc942 99 analog_value0_size++;
jhaugen 8:a44d03ecc942 100 }
jhaugen 8:a44d03ecc942 101 else {
jhaugen 8:a44d03ecc942 102 if (analog_value1_size >= ANALOG_VALUE_BUFFER_SIZE) {
jhaugen 8:a44d03ecc942 103 return;
jhaugen 8:a44d03ecc942 104 }
jhaugen 8:a44d03ecc942 105 analog_buffer_size = analog_value1_size;
jhaugen 8:a44d03ecc942 106 analog_value1_size++;
jhaugen 8:a44d03ecc942 107 }
jhaugen 8:a44d03ecc942 108 analog_values[analog_fill_buffer][analog_buffer_size] = my_analog_pin.read();
jhaugen 8:a44d03ecc942 109 }*/
jhaugen 8:a44d03ecc942 110
jhaugen 8:a44d03ecc942 111 /*
jhaugen 8:a44d03ecc942 112 void send_adc_data() {
jhaugen 8:a44d03ecc942 113 int send_buffer = analog_fill_buffer;
jhaugen 8:a44d03ecc942 114 int send_buffer_size;
jhaugen 8:a44d03ecc942 115 // switch the fill buffer
jhaugen 8:a44d03ecc942 116 if (analog_fill_buffer == 0) {
jhaugen 8:a44d03ecc942 117 // make sure the new buffer is empty
jhaugen 8:a44d03ecc942 118 analog_value1_size = 0;
jhaugen 8:a44d03ecc942 119 analog_fill_buffer = 1;
jhaugen 8:a44d03ecc942 120 send_buffer_size = analog_value0_size;
jhaugen 8:a44d03ecc942 121 }
jhaugen 8:a44d03ecc942 122 else {
jhaugen 8:a44d03ecc942 123 // make sure the new buffer is empty
jhaugen 8:a44d03ecc942 124 analog_value0_size = 0;
jhaugen 8:a44d03ecc942 125 analog_fill_buffer = 0;
jhaugen 8:a44d03ecc942 126 send_buffer_size = analog_value1_size;
jhaugen 8:a44d03ecc942 127 }
jhaugen 8:a44d03ecc942 128
jhaugen 8:a44d03ecc942 129 // send the header: the letter 'a' followed by the number of 32-bit floating point numbers
jhaugen 8:a44d03ecc942 130 pc.putc('a');
jhaugen 8:a44d03ecc942 131 pc.putc(send_buffer_size);
jhaugen 8:a44d03ecc942 132
jhaugen 8:a44d03ecc942 133 // send the data in the old buffer
jhaugen 8:a44d03ecc942 134 for(int i = 0; i < send_buffer_size; i++) {
jhaugen 8:a44d03ecc942 135 pc.putc(analog_values[send_buffer][i]);
jhaugen 8:a44d03ecc942 136 }
jhaugen 8:a44d03ecc942 137 }*/
jhaugen 8:a44d03ecc942 138
jhaugen 8:a44d03ecc942 139 // sends unsigned long long in big endian (msb first)
jhaugen 11:79eabc671800 140 void send_ull(long long l) {
jhaugen 8:a44d03ecc942 141 char* l_array = (char*)&l;
jhaugen 8:a44d03ecc942 142 for (int i = 7; i >= 0; i--) {
jhaugen 8:a44d03ecc942 143 pc.putc(l_array[i]);
jhaugen 8:a44d03ecc942 144 }
jhaugen 8:a44d03ecc942 145 }
jhaugen 8:a44d03ecc942 146
jhaugen 8:a44d03ecc942 147 void send_int(int integer) {
jhaugen 8:a44d03ecc942 148 char* i_array = (char*)&integer;
jhaugen 8:a44d03ecc942 149 for (int i = 3; i >= 0; i--) {
jhaugen 8:a44d03ecc942 150 pc.putc(i_array[i]);
jhaugen 8:a44d03ecc942 151 }
jhaugen 8:a44d03ecc942 152 }
jhaugen 8:a44d03ecc942 153
jhaugen 8:a44d03ecc942 154 void send_us(unsigned short us) {
jhaugen 8:a44d03ecc942 155 char* us_array = (char*)&us;
jhaugen 8:a44d03ecc942 156 pc.putc(us_array[1]);
jhaugen 8:a44d03ecc942 157 pc.putc(us_array[0]);
jhaugen 8:a44d03ecc942 158 }
resolutedreamer 4:9930547c1cfa 159
jhaugen 11:79eabc671800 160 long long last_systick_second = 0;
jhaugen 11:79eabc671800 161 int systick_high_count = 0;
jhaugen 11:79eabc671800 162
jhaugen 5:112df51d4815 163 void systick() {
jhaugen 11:79eabc671800 164 long long curr_systick_second = (((long long) timer.read_us()) - offset) / 1000000;
jhaugen 11:79eabc671800 165
jhaugen 11:79eabc671800 166 if (curr_systick_second > last_systick_second) {
jhaugen 11:79eabc671800 167 myled = false;
jhaugen 11:79eabc671800 168 hundms_pulse_pin = true;
jhaugen 11:79eabc671800 169 last_systick_second = curr_systick_second;
jhaugen 11:79eabc671800 170 systick_high_count = tick_count;
jhaugen 11:79eabc671800 171 }
jhaugen 11:79eabc671800 172 else if (tick_count == systick_high_count + 1000) {
jhaugen 11:79eabc671800 173 myled = true;
jhaugen 11:79eabc671800 174 hundms_pulse_pin = false;
jhaugen 11:79eabc671800 175 }
jhaugen 8:a44d03ecc942 176 //if (tick_count % 20000 == 0) {
jhaugen 8:a44d03ecc942 177 if (tick_count % 10000 == 0) {
jhaugen 8:a44d03ecc942 178 //redled = false;
jhaugen 7:c81c6968f013 179 // set the pulse high for 100ms, .1 s
jhaugen 7:c81c6968f013 180 // toggle a led
jhaugen 11:79eabc671800 181 //pulse_value = false;
jhaugen 11:79eabc671800 182 //myled = pulse_value;
jhaugen 11:79eabc671800 183 //hundms_pulse_pin = true;
jhaugen 7:c81c6968f013 184
jhaugen 7:c81c6968f013 185 // get data from the (2) light sensor (3) analog pin
jhaugen 8:a44d03ecc942 186 //let_there_be_light = my_light_sensor.read();
jhaugen 8:a44d03ecc942 187 unsigned short light_val = my_light_sensor.read_u16();
jhaugen 12:c97d6cd17314 188 light_sensor_buffer.write(light_val, ((long long) timer.read_us()) - offset);
jhaugen 8:a44d03ecc942 189 //my_analog_value = my_analog_pin.read();
jhaugen 7:c81c6968f013 190
jhaugen 7:c81c6968f013 191 // print the analog values to uart
jhaugen 7:c81c6968f013 192 //pc.printf("%f,%f\r\n", let_there_be_light, my_analog_value);
jhaugen 7:c81c6968f013 193
jhaugen 7:c81c6968f013 194 // display 1
jhaugen 7:c81c6968f013 195 //lcd.display(1);
jhaugen 7:c81c6968f013 196 //wait_ms(100.0f);
jhaugen 5:112df51d4815 197 }
jhaugen 8:a44d03ecc942 198 //else if (tick_count % 20000 == 2000) {
jhaugen 8:a44d03ecc942 199 else if (tick_count % 10000 == 1000) {
jhaugen 8:a44d03ecc942 200 //redled = true;
jhaugen 7:c81c6968f013 201 // set the pulse low for 900 ms, .9 s
jhaugen 7:c81c6968f013 202 // toggle a led
jhaugen 11:79eabc671800 203 //pulse_value = true;
jhaugen 11:79eabc671800 204 // myled = pulse_value; // toggle a led
jhaugen 11:79eabc671800 205 // hundms_pulse_pin = false;
jhaugen 7:c81c6968f013 206
jhaugen 7:c81c6968f013 207 // get data from the (2) light sensor (3) analog pin
jhaugen 8:a44d03ecc942 208 //let_there_be_light = my_light_sensor.read();
jhaugen 8:a44d03ecc942 209 //my_analog_value = my_analog_pin.read();
jhaugen 7:c81c6968f013 210
jhaugen 7:c81c6968f013 211 // print the analog values to uart
jhaugen 7:c81c6968f013 212 //pc.printf("%f,%f\r\n", let_there_be_light, my_analog_value);
jhaugen 7:c81c6968f013 213
jhaugen 7:c81c6968f013 214 // display 0
jhaugen 7:c81c6968f013 215 //lcd.display(0);
jhaugen 7:c81c6968f013 216 //wait_ms(900.0f);
jhaugen 7:c81c6968f013 217 }
jhaugen 8:a44d03ecc942 218
jhaugen 8:a44d03ecc942 219 if (sine_out_on == SINE_OUT_ON) {
jhaugen 8:a44d03ecc942 220 sine_out_pin.write_u16(sine_table[sine_index]);
jhaugen 8:a44d03ecc942 221
jhaugen 8:a44d03ecc942 222 switch (sine_out_frequency) {
jhaugen 8:a44d03ecc942 223 case SINE_OUT_FREQ_1HZ:
jhaugen 8:a44d03ecc942 224 // every 10 ticks, increment sine_index
jhaugen 8:a44d03ecc942 225 if (tick_count % 10 == 0) {
jhaugen 8:a44d03ecc942 226 sine_index += 1;
jhaugen 8:a44d03ecc942 227 }
jhaugen 8:a44d03ecc942 228 break;
jhaugen 8:a44d03ecc942 229 case SINE_OUT_FREQ_10HZ:
jhaugen 8:a44d03ecc942 230 sine_index += 1;
jhaugen 8:a44d03ecc942 231 break;
jhaugen 8:a44d03ecc942 232 case SINE_OUT_FREQ_100HZ:
jhaugen 8:a44d03ecc942 233 sine_index += 10;
jhaugen 8:a44d03ecc942 234 break;
jhaugen 8:a44d03ecc942 235 case SINE_OUT_FREQ_1000HZ:
jhaugen 8:a44d03ecc942 236 sine_index += 100;
jhaugen 8:a44d03ecc942 237 break;
jhaugen 8:a44d03ecc942 238 }
jhaugen 8:a44d03ecc942 239
jhaugen 8:a44d03ecc942 240 // uncomment this for 50 us period
jhaugen 8:a44d03ecc942 241 /*switch (sine_out_frequency) {
jhaugen 8:a44d03ecc942 242 case SINE_OUT_FREQ_1HZ:
jhaugen 8:a44d03ecc942 243 // every 10 ticks, increment sine_index
jhaugen 8:a44d03ecc942 244 if (tick_count % 20 == 0) {
jhaugen 8:a44d03ecc942 245 sine_index += 1;
jhaugen 8:a44d03ecc942 246 }
jhaugen 8:a44d03ecc942 247 break;
jhaugen 8:a44d03ecc942 248 case SINE_OUT_FREQ_10HZ:
jhaugen 8:a44d03ecc942 249 if (tick_count % 2 == 0) {
jhaugen 8:a44d03ecc942 250 sine_index += 1;
jhaugen 8:a44d03ecc942 251 }
jhaugen 8:a44d03ecc942 252 break;
jhaugen 8:a44d03ecc942 253 case SINE_OUT_FREQ_100HZ:
jhaugen 8:a44d03ecc942 254 sine_index += 5;
jhaugen 8:a44d03ecc942 255 break;
jhaugen 8:a44d03ecc942 256 case SINE_OUT_FREQ_1000HZ:
jhaugen 8:a44d03ecc942 257 sine_index += 50;
jhaugen 8:a44d03ecc942 258 break;
jhaugen 8:a44d03ecc942 259 }*/
jhaugen 8:a44d03ecc942 260
jhaugen 8:a44d03ecc942 261 if (sine_index >= SINE_TABLE_SIZE) {
jhaugen 8:a44d03ecc942 262 sine_index = 0;
jhaugen 8:a44d03ecc942 263 }
jhaugen 8:a44d03ecc942 264 }
jhaugen 8:a44d03ecc942 265 else {
jhaugen 8:a44d03ecc942 266 sine_out_pin.write_u16(0);
jhaugen 8:a44d03ecc942 267 }
jhaugen 8:a44d03ecc942 268
jhaugen 8:a44d03ecc942 269 switch (adc_sampling_frequency) {
jhaugen 8:a44d03ecc942 270 case ADC_SAMP_FREQ_1HZ:
jhaugen 8:a44d03ecc942 271 if (tick_count % 10000 == 0) {
jhaugen 8:a44d03ecc942 272 //read_adc();
jhaugen 12:c97d6cd17314 273 adc_buffer.write(my_analog_pin.read_u16(), ((long long) timer.read_us()) - offset);
jhaugen 8:a44d03ecc942 274 }
jhaugen 8:a44d03ecc942 275 break;
jhaugen 8:a44d03ecc942 276 case ADC_SAMP_FREQ_10HZ:
jhaugen 8:a44d03ecc942 277 if (tick_count % 1000 == 0) {
jhaugen 8:a44d03ecc942 278 //read_adc();
jhaugen 12:c97d6cd17314 279 adc_buffer.write(my_analog_pin.read_u16(), ((long long) timer.read_us()) - offset);
jhaugen 8:a44d03ecc942 280 }
jhaugen 8:a44d03ecc942 281 break;
jhaugen 8:a44d03ecc942 282 case ADC_SAMP_FREQ_100HZ:
jhaugen 8:a44d03ecc942 283 if (tick_count % 100 == 0) {
jhaugen 8:a44d03ecc942 284 //read_adc();
jhaugen 12:c97d6cd17314 285 adc_buffer.write(my_analog_pin.read_u16(), ((long long) timer.read_us()) - offset);
jhaugen 8:a44d03ecc942 286 }
jhaugen 8:a44d03ecc942 287 break;
jhaugen 8:a44d03ecc942 288 case ADC_SAMP_FREQ_OFF:
jhaugen 8:a44d03ecc942 289 // do nothing
jhaugen 8:a44d03ecc942 290 break;
jhaugen 8:a44d03ecc942 291 }
jhaugen 8:a44d03ecc942 292
jhaugen 8:a44d03ecc942 293 if (d_out_on == D_OUT_ON) {
jhaugen 10:cfd3decff616 294 d_out_pin = true;
jhaugen 8:a44d03ecc942 295 }
jhaugen 8:a44d03ecc942 296 else {
jhaugen 10:cfd3decff616 297 d_out_pin = false;
jhaugen 5:112df51d4815 298 }
jhaugen 8:a44d03ecc942 299
jhaugen 8:a44d03ecc942 300
jhaugen 8:a44d03ecc942 301 if (tick_count % 100 == 0) {
jhaugen 8:a44d03ecc942 302 // update the display every 10 ms
jhaugen 8:a44d03ecc942 303 long long time_us = ((long long) timer.read_us()) - offset;
jhaugen 8:a44d03ecc942 304 int time_s = (int) (time_us / 1000000);
jhaugen 8:a44d03ecc942 305 int time_m = time_s / 60;
jhaugen 8:a44d03ecc942 306
jhaugen 8:a44d03ecc942 307 int display_time = (time_m % 60) * 100 + (time_s % 60);
jhaugen 8:a44d03ecc942 308 //lcd.display(display_time);
jhaugen 8:a44d03ecc942 309 //lcd.putc('1');
jhaugen 8:a44d03ecc942 310 int display_time_ones = display_time % 10;
jhaugen 8:a44d03ecc942 311 int display_time_tens = (display_time / 10) % 10;
jhaugen 8:a44d03ecc942 312 int display_time_hund = (display_time / 100) % 10;
jhaugen 8:a44d03ecc942 313 int display_time_thou = (display_time / 1000) % 10;
jhaugen 8:a44d03ecc942 314 lcd.putc('0' + display_time_thou);
jhaugen 8:a44d03ecc942 315 lcd.putc('0' + display_time_hund);
jhaugen 8:a44d03ecc942 316 lcd.putc('0' + display_time_tens);
jhaugen 8:a44d03ecc942 317 lcd.putc('0' + display_time_ones);
jhaugen 8:a44d03ecc942 318 }
jhaugen 8:a44d03ecc942 319
jhaugen 5:112df51d4815 320 tick_count++;
jhaugen 5:112df51d4815 321 }
resolutedreamer 1:ca5c2809eec1 322
jhaugen 8:a44d03ecc942 323 void send_light_sensor_data() {
jhaugen 8:a44d03ecc942 324 light_sensor_buffer.swapBuff();
jhaugen 8:a44d03ecc942 325 unsigned short* sensor_data = light_sensor_buffer.getReadBuffer();
jhaugen 8:a44d03ecc942 326 int sensor_data_size = light_sensor_buffer.getReadBufferSize();
jhaugen 12:c97d6cd17314 327 long long* ts = light_sensor_buffer.getTimestampReadBuffer();
jhaugen 8:a44d03ecc942 328
jhaugen 8:a44d03ecc942 329 // send header
jhaugen 8:a44d03ecc942 330 pc.putc('l');
jhaugen 8:a44d03ecc942 331 send_int(sensor_data_size);
jhaugen 11:79eabc671800 332
jhaugen 8:a44d03ecc942 333 for (int i = 0; i < sensor_data_size; i++) {
jhaugen 12:c97d6cd17314 334 send_ull(ts[i]);
jhaugen 8:a44d03ecc942 335 send_us(sensor_data[i]);
jhaugen 8:a44d03ecc942 336 }
jhaugen 8:a44d03ecc942 337 }
jhaugen 8:a44d03ecc942 338
jhaugen 8:a44d03ecc942 339 void send_adc_data() {
jhaugen 8:a44d03ecc942 340 adc_buffer.swapBuff();
jhaugen 8:a44d03ecc942 341 unsigned short* adc_data = adc_buffer.getReadBuffer();
jhaugen 8:a44d03ecc942 342 int adc_data_size = adc_buffer.getReadBufferSize();
jhaugen 12:c97d6cd17314 343 long long* ts = adc_buffer.getTimestampReadBuffer();
jhaugen 8:a44d03ecc942 344
jhaugen 8:a44d03ecc942 345 // send header
jhaugen 8:a44d03ecc942 346 pc.putc('a');
jhaugen 8:a44d03ecc942 347 send_int(adc_data_size);
jhaugen 8:a44d03ecc942 348
jhaugen 8:a44d03ecc942 349 for (int i = 0; i < adc_data_size; i++) {
jhaugen 12:c97d6cd17314 350 send_ull(ts[i]);
jhaugen 8:a44d03ecc942 351 send_us(adc_data[i]);
jhaugen 8:a44d03ecc942 352 }
jhaugen 8:a44d03ecc942 353 }
jhaugen 8:a44d03ecc942 354
jhaugen 8:a44d03ecc942 355 void send_timestamp_event_data() {
jhaugen 8:a44d03ecc942 356 d_event_buffer.swapBuff();
jhaugen 11:79eabc671800 357 long long* timestamp_data = d_event_buffer.getReadBuffer();
jhaugen 8:a44d03ecc942 358 int timestamp_data_size = d_event_buffer.getReadBufferSize();
jhaugen 8:a44d03ecc942 359
jhaugen 8:a44d03ecc942 360 pc.putc('d');
jhaugen 8:a44d03ecc942 361 send_int(timestamp_data_size);
jhaugen 8:a44d03ecc942 362
jhaugen 8:a44d03ecc942 363 for (int i = 0; i < timestamp_data_size; i++) {
jhaugen 8:a44d03ecc942 364 //unsigned long long ts = timestamp_data[i];
jhaugen 8:a44d03ecc942 365 //unsigned int msbs = ((unsigned int) (ts >> 32) & 0xffffffff);
jhaugen 8:a44d03ecc942 366 //unsigned int lsbs = ((unsigned int) ts & 0xffffffff);
jhaugen 8:a44d03ecc942 367 send_ull(timestamp_data[i]);
jhaugen 8:a44d03ecc942 368 }
jhaugen 8:a44d03ecc942 369 }
jhaugen 8:a44d03ecc942 370
jhaugen 8:a44d03ecc942 371 void systick_attach() {
jhaugen 8:a44d03ecc942 372 tick_count = 0;
jhaugen 8:a44d03ecc942 373 sine_index = 0;
jhaugen 8:a44d03ecc942 374 //ticker.attach_us(&systick, 100000);
jhaugen 8:a44d03ecc942 375 ticker.attach_us(&systick, 100);
jhaugen 8:a44d03ecc942 376 }
jhaugen 8:a44d03ecc942 377
jhaugen 8:a44d03ecc942 378 void d_event(){
jhaugen 8:a44d03ecc942 379 // take timestamp, send it to thingspeak later
jhaugen 11:79eabc671800 380 long long ts = timer.read_us() - offset;
jhaugen 12:c97d6cd17314 381 d_event_buffer.write(ts, ts);
jhaugen 8:a44d03ecc942 382 }
jhaugen 8:a44d03ecc942 383
jhaugen 11:79eabc671800 384 int sync_timestamp = 0;
jhaugen 11:79eabc671800 385 int tx_timestamp = 0;
jhaugen 8:a44d03ecc942 386
jhaugen 8:a44d03ecc942 387 // take a timestamp, save it in a global if it was an 's' character
jhaugen 8:a44d03ecc942 388 void rx_sync_interrupt(MODSERIAL_IRQ_INFO *q) {
jhaugen 8:a44d03ecc942 389 sync_timestamp = timer.read_us();
jhaugen 8:a44d03ecc942 390 }
jhaugen 8:a44d03ecc942 391
jhaugen 11:79eabc671800 392 void tx_interrupt(MODSERIAL_IRQ_INFO *q) {
jhaugen 11:79eabc671800 393 tx_timestamp = timer.read_us();
jhaugen 11:79eabc671800 394 }
jhaugen 11:79eabc671800 395
resolutedreamer 0:68d1c7f2dbc7 396 int main()
jhaugen 11:79eabc671800 397 {
jhaugen 8:a44d03ecc942 398 redled = true;
jhaugen 7:c81c6968f013 399 timer.start();
jhaugen 12:c97d6cd17314 400 light_sensor_buffer.init(&offset, &timer);
jhaugen 12:c97d6cd17314 401 adc_buffer.init(&offset, &timer);
jhaugen 12:c97d6cd17314 402 d_event_buffer.init(&offset, &timer);
resolutedreamer 6:3fbe44c7c26a 403 //initialize hardware
jhaugen 8:a44d03ecc942 404 systick_attach();
jhaugen 8:a44d03ecc942 405 d_event_pin.rise(&d_event);
jhaugen 11:79eabc671800 406 pc.baud(19200);
jhaugen 8:a44d03ecc942 407
jhaugen 8:a44d03ecc942 408 // set our interrupt to occur on receiving the sync packet
jhaugen 11:79eabc671800 409 //pc.attach(&rx_sync_interrupt, MODSERIAL::RxAutoDetect);
jhaugen 11:79eabc671800 410 //pc.autoDetectChar('s');
jhaugen 11:79eabc671800 411 //pc.attach(&tx_interrupt, MODSERIAL::TxIrq);
jhaugen 8:a44d03ecc942 412
jhaugen 8:a44d03ecc942 413 // lower the priority of the systick, since it might interfere with our timestamping
jhaugen 11:79eabc671800 414 //NVIC_SetPriority(LPTimer_IRQn, 255);
resolutedreamer 6:3fbe44c7c26a 415
jhaugen 7:c81c6968f013 416 t1_string[30] = '\0';
resolutedreamer 6:3fbe44c7c26a 417
jhaugen 8:a44d03ecc942 418 int i = 0;
resolutedreamer 6:3fbe44c7c26a 419
resolutedreamer 6:3fbe44c7c26a 420 while (true)
resolutedreamer 6:3fbe44c7c26a 421 {
jhaugen 8:a44d03ecc942 422 redled = false;
jhaugen 7:c81c6968f013 423 char c = pc.getc();
jhaugen 8:a44d03ecc942 424 //redled = true;
jhaugen 8:a44d03ecc942 425 //pc.printf("got a char %c\r\n", c);
jhaugen 11:79eabc671800 426 t2 = timer.read_us();
jhaugen 11:79eabc671800 427 //t2 = sync_timestamp;
jhaugen 7:c81c6968f013 428 // make sure we've gotten an 's', which we are using as
jhaugen 7:c81c6968f013 429 // the sync message. If we get an 's' then t2 is correct.
jhaugen 7:c81c6968f013 430 if (c != 's') {
jhaugen 7:c81c6968f013 431 continue;
jhaugen 7:c81c6968f013 432 }
jhaugen 8:a44d03ecc942 433 //pc.printf("got s\r\n");
jhaugen 8:a44d03ecc942 434
jhaugen 8:a44d03ecc942 435 // we can drop the 's'
jhaugen 8:a44d03ecc942 436 c = pc.getc();
jhaugen 8:a44d03ecc942 437 i = 0;
jhaugen 8:a44d03ecc942 438 while (c != '\n' && i < 30) {
jhaugen 7:c81c6968f013 439 t1_string[i] = c;
jhaugen 7:c81c6968f013 440 c = pc.getc();
jhaugen 7:c81c6968f013 441 i++;
jhaugen 7:c81c6968f013 442 }
jhaugen 7:c81c6968f013 443 t1_string[i] = '\0';
jhaugen 7:c81c6968f013 444 i = 0;
jhaugen 8:a44d03ecc942 445
jhaugen 8:a44d03ecc942 446
jhaugen 8:a44d03ecc942 447
jhaugen 8:a44d03ecc942 448 //char display_time[5];
jhaugen 8:a44d03ecc942 449 //display_time[0] = t1_string[3];
jhaugen 8:a44d03ecc942 450 //display_time[1] = t1_string[4];
jhaugen 8:a44d03ecc942 451 //display_time[2] = t1_string[6];
jhaugen 8:a44d03ecc942 452 //display_time[3] = t1_string[7];
jhaugen 8:a44d03ecc942 453 //display_time[4] = '\0';
jhaugen 8:a44d03ecc942 454 //int display_time_int = atoi(display_time);
jhaugen 8:a44d03ecc942 455 //lcd.display(display_time_int);
jhaugen 8:a44d03ecc942 456 //read_complete = true;
resolutedreamer 1:ca5c2809eec1 457
jhaugen 11:79eabc671800 458 //t3 = timer.read_us();
jhaugen 7:c81c6968f013 459 // sending the delay_req message at time t3
jhaugen 7:c81c6968f013 460 pc.putc('r');
jhaugen 11:79eabc671800 461 t3 = timer.read_us();
resolutedreamer 1:ca5c2809eec1 462
jhaugen 7:c81c6968f013 463 // get the t4 packet
jhaugen 8:a44d03ecc942 464 c = pc.getc();
jhaugen 8:a44d03ecc942 465 i = 0;
jhaugen 8:a44d03ecc942 466 while (c != '\n' && i < 30) {
jhaugen 7:c81c6968f013 467 t4_string[i] = c;
jhaugen 7:c81c6968f013 468 c = pc.getc();
jhaugen 7:c81c6968f013 469 i++;
resolutedreamer 6:3fbe44c7c26a 470 }
jhaugen 7:c81c6968f013 471 t4_string[i] = '\0';
jhaugen 7:c81c6968f013 472 i = 0;
jhaugen 8:a44d03ecc942 473
jhaugen 8:a44d03ecc942 474 //pc.printf("t4str: %s\n", t4_string);
jhaugen 8:a44d03ecc942 475
jhaugen 8:a44d03ecc942 476 /*if (t4 == 0) {
jhaugen 8:a44d03ecc942 477 pc.printf("t4 is zero\n");
jhaugen 8:a44d03ecc942 478 }
jhaugen 8:a44d03ecc942 479 else {
jhaugen 8:a44d03ecc942 480 pc.printf("t4 is not zero\n");
jhaugen 8:a44d03ecc942 481 }*/
jhaugen 8:a44d03ecc942 482
jhaugen 8:a44d03ecc942 483 //pc.printf("t4: %lld\n", t4);
jhaugen 8:a44d03ecc942 484 //lcd.display(7);
jhaugen 8:a44d03ecc942 485 //lcd.display(sizeof(long long) * 100 + sizeof(long));
jhaugen 8:a44d03ecc942 486 pc.printf("t1_string: %s t2: %d t3: %d t4_string: %s\n", t1_string, t2, t3, t4_string);
jhaugen 8:a44d03ecc942 487
jhaugen 8:a44d03ecc942 488 long long t1 = atoll(t1_string);
jhaugen 8:a44d03ecc942 489 long long t4 = atoll(t4_string);
jhaugen 8:a44d03ecc942 490 pc.printf("t1: %lld t2: %d t3: %d t4: %lld\n", t1, t2, t3, t4);
jhaugen 8:a44d03ecc942 491 offset = (((long long) t2 - t1) - (t4 - (long long) t3)) / 2;
jhaugen 8:a44d03ecc942 492 pc.printf("offset: %lld\n", offset);
jhaugen 8:a44d03ecc942 493
jhaugen 8:a44d03ecc942 494 //pc.printf("offset: %lld\n", offset);
jhaugen 8:a44d03ecc942 495
jhaugen 8:a44d03ecc942 496 long long time_us = ((long long) timer.read_us()) - offset;
jhaugen 8:a44d03ecc942 497 long long time_s = time_us / 1000000;
jhaugen 8:a44d03ecc942 498 long long time_m = time_s / 60;
jhaugen 8:a44d03ecc942 499 long long time_h = time_m / 60;
jhaugen 12:c97d6cd17314 500 //pc.printf("time: %lld:%lld:%lld:%lld\n", time_h % 24, time_m % 60, time_s % 60, time_us % 1000000);
jhaugen 12:c97d6cd17314 501 long long* lsdt1 = light_sensor_buffer.db_timestamps[0];
jhaugen 12:c97d6cd17314 502 long long* lsdt2 = light_sensor_buffer.db_timestamps[1];
jhaugen 12:c97d6cd17314 503 pc.printf("lsd[0][0] %lld [0][1] %lld [0][2] %lld [1][0] %lld [1][1] %lld [1][2] %lld\n", lsdt1[0], lsdt1[1], lsdt1[2], lsdt2[0], lsdt2[1], lsdt2[2]);
jhaugen 8:a44d03ecc942 504
jhaugen 8:a44d03ecc942 505
jhaugen 8:a44d03ecc942 506 // detach the systick, then reattach at the right time
jhaugen 8:a44d03ecc942 507 /*long long time_us_roundup = (time_s + 1) * 1000000;
jhaugen 8:a44d03ecc942 508 while((timer.read_us() - offset) < time_us_roundup) {
jhaugen 8:a44d03ecc942 509 // wait until the next second
jhaugen 8:a44d03ecc942 510 }
jhaugen 8:a44d03ecc942 511 ticker.detach();
jhaugen 8:a44d03ecc942 512 systick_attach();*/
jhaugen 8:a44d03ecc942 513
jhaugen 8:a44d03ecc942 514 /*char onoff = pc.getc();
jhaugen 8:a44d03ecc942 515 switch(onoff) {
jhaugen 8:a44d03ecc942 516 case 'a':
jhaugen 8:a44d03ecc942 517 redled = false;
jhaugen 8:a44d03ecc942 518 break;
jhaugen 8:a44d03ecc942 519 case 'b':
jhaugen 8:a44d03ecc942 520 redled = true;
jhaugen 8:a44d03ecc942 521 break;
jhaugen 8:a44d03ecc942 522 }*/
jhaugen 8:a44d03ecc942 523
jhaugen 8:a44d03ecc942 524 char opts = pc.getc();
jhaugen 8:a44d03ecc942 525 set_options(opts);
jhaugen 8:a44d03ecc942 526
jhaugen 8:a44d03ecc942 527 // send adc data, timestamp event data, light sensor data
jhaugen 8:a44d03ecc942 528 send_adc_data();
jhaugen 8:a44d03ecc942 529 send_light_sensor_data();
jhaugen 10:cfd3decff616 530 send_timestamp_event_data();
resolutedreamer 0:68d1c7f2dbc7 531 }
resolutedreamer 0:68d1c7f2dbc7 532 }