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

Dependencies:   MODSERIALhacked Convert SLCD mbed-src

Committer:
jhaugen
Date:
Thu Dec 18 00:52:44 2014 +0000
Revision:
10:cfd3decff616
Parent:
8:a44d03ecc942
Child:
11:79eabc671800
Flipped the polarity of two output pins.

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 8:a44d03ecc942 48 DoubleBuffer<unsigned short, 20> light_sensor_buffer;
jhaugen 8:a44d03ecc942 49 DoubleBuffer<unsigned short, 250> adc_buffer;
jhaugen 8:a44d03ecc942 50 DoubleBuffer<unsigned long long, 100> 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 8:a44d03ecc942 140 void send_ull(unsigned 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 5:112df51d4815 160 void systick() {
jhaugen 8:a44d03ecc942 161 //if (tick_count % 20000 == 0) {
jhaugen 8:a44d03ecc942 162 if (tick_count % 10000 == 0) {
jhaugen 8:a44d03ecc942 163 //redled = false;
jhaugen 7:c81c6968f013 164 // set the pulse high for 100ms, .1 s
jhaugen 7:c81c6968f013 165 // toggle a led
jhaugen 8:a44d03ecc942 166 pulse_value = false;
jhaugen 7:c81c6968f013 167 myled = pulse_value;
jhaugen 10:cfd3decff616 168 hundms_pulse_pin = true;
jhaugen 7:c81c6968f013 169
jhaugen 7:c81c6968f013 170 // get data from the (2) light sensor (3) analog pin
jhaugen 8:a44d03ecc942 171 //let_there_be_light = my_light_sensor.read();
jhaugen 8:a44d03ecc942 172 unsigned short light_val = my_light_sensor.read_u16();
jhaugen 8:a44d03ecc942 173 light_sensor_buffer.write(light_val);
jhaugen 8:a44d03ecc942 174 //my_analog_value = my_analog_pin.read();
jhaugen 7:c81c6968f013 175
jhaugen 7:c81c6968f013 176 // print the analog values to uart
jhaugen 7:c81c6968f013 177 //pc.printf("%f,%f\r\n", let_there_be_light, my_analog_value);
jhaugen 7:c81c6968f013 178
jhaugen 7:c81c6968f013 179 // display 1
jhaugen 7:c81c6968f013 180 //lcd.display(1);
jhaugen 7:c81c6968f013 181 //wait_ms(100.0f);
jhaugen 5:112df51d4815 182 }
jhaugen 8:a44d03ecc942 183 //else if (tick_count % 20000 == 2000) {
jhaugen 8:a44d03ecc942 184 else if (tick_count % 10000 == 1000) {
jhaugen 8:a44d03ecc942 185 //redled = true;
jhaugen 7:c81c6968f013 186 // set the pulse low for 900 ms, .9 s
jhaugen 7:c81c6968f013 187 // toggle a led
jhaugen 8:a44d03ecc942 188 pulse_value = true;
jhaugen 7:c81c6968f013 189 myled = pulse_value; // toggle a led
jhaugen 10:cfd3decff616 190 hundms_pulse_pin = false;
jhaugen 7:c81c6968f013 191
jhaugen 7:c81c6968f013 192 // get data from the (2) light sensor (3) analog pin
jhaugen 8:a44d03ecc942 193 //let_there_be_light = my_light_sensor.read();
jhaugen 8:a44d03ecc942 194 //my_analog_value = my_analog_pin.read();
jhaugen 7:c81c6968f013 195
jhaugen 7:c81c6968f013 196 // print the analog values to uart
jhaugen 7:c81c6968f013 197 //pc.printf("%f,%f\r\n", let_there_be_light, my_analog_value);
jhaugen 7:c81c6968f013 198
jhaugen 7:c81c6968f013 199 // display 0
jhaugen 7:c81c6968f013 200 //lcd.display(0);
jhaugen 7:c81c6968f013 201 //wait_ms(900.0f);
jhaugen 7:c81c6968f013 202 }
jhaugen 8:a44d03ecc942 203
jhaugen 8:a44d03ecc942 204 if (sine_out_on == SINE_OUT_ON) {
jhaugen 8:a44d03ecc942 205 sine_out_pin.write_u16(sine_table[sine_index]);
jhaugen 8:a44d03ecc942 206
jhaugen 8:a44d03ecc942 207 switch (sine_out_frequency) {
jhaugen 8:a44d03ecc942 208 case SINE_OUT_FREQ_1HZ:
jhaugen 8:a44d03ecc942 209 // every 10 ticks, increment sine_index
jhaugen 8:a44d03ecc942 210 if (tick_count % 10 == 0) {
jhaugen 8:a44d03ecc942 211 sine_index += 1;
jhaugen 8:a44d03ecc942 212 }
jhaugen 8:a44d03ecc942 213 break;
jhaugen 8:a44d03ecc942 214 case SINE_OUT_FREQ_10HZ:
jhaugen 8:a44d03ecc942 215 sine_index += 1;
jhaugen 8:a44d03ecc942 216 break;
jhaugen 8:a44d03ecc942 217 case SINE_OUT_FREQ_100HZ:
jhaugen 8:a44d03ecc942 218 sine_index += 10;
jhaugen 8:a44d03ecc942 219 break;
jhaugen 8:a44d03ecc942 220 case SINE_OUT_FREQ_1000HZ:
jhaugen 8:a44d03ecc942 221 sine_index += 100;
jhaugen 8:a44d03ecc942 222 break;
jhaugen 8:a44d03ecc942 223 }
jhaugen 8:a44d03ecc942 224
jhaugen 8:a44d03ecc942 225 // uncomment this for 50 us period
jhaugen 8:a44d03ecc942 226 /*switch (sine_out_frequency) {
jhaugen 8:a44d03ecc942 227 case SINE_OUT_FREQ_1HZ:
jhaugen 8:a44d03ecc942 228 // every 10 ticks, increment sine_index
jhaugen 8:a44d03ecc942 229 if (tick_count % 20 == 0) {
jhaugen 8:a44d03ecc942 230 sine_index += 1;
jhaugen 8:a44d03ecc942 231 }
jhaugen 8:a44d03ecc942 232 break;
jhaugen 8:a44d03ecc942 233 case SINE_OUT_FREQ_10HZ:
jhaugen 8:a44d03ecc942 234 if (tick_count % 2 == 0) {
jhaugen 8:a44d03ecc942 235 sine_index += 1;
jhaugen 8:a44d03ecc942 236 }
jhaugen 8:a44d03ecc942 237 break;
jhaugen 8:a44d03ecc942 238 case SINE_OUT_FREQ_100HZ:
jhaugen 8:a44d03ecc942 239 sine_index += 5;
jhaugen 8:a44d03ecc942 240 break;
jhaugen 8:a44d03ecc942 241 case SINE_OUT_FREQ_1000HZ:
jhaugen 8:a44d03ecc942 242 sine_index += 50;
jhaugen 8:a44d03ecc942 243 break;
jhaugen 8:a44d03ecc942 244 }*/
jhaugen 8:a44d03ecc942 245
jhaugen 8:a44d03ecc942 246 if (sine_index >= SINE_TABLE_SIZE) {
jhaugen 8:a44d03ecc942 247 sine_index = 0;
jhaugen 8:a44d03ecc942 248 }
jhaugen 8:a44d03ecc942 249 }
jhaugen 8:a44d03ecc942 250 else {
jhaugen 8:a44d03ecc942 251 sine_out_pin.write_u16(0);
jhaugen 8:a44d03ecc942 252 }
jhaugen 8:a44d03ecc942 253
jhaugen 8:a44d03ecc942 254 switch (adc_sampling_frequency) {
jhaugen 8:a44d03ecc942 255 case ADC_SAMP_FREQ_1HZ:
jhaugen 8:a44d03ecc942 256 if (tick_count % 10000 == 0) {
jhaugen 8:a44d03ecc942 257 //read_adc();
jhaugen 8:a44d03ecc942 258 adc_buffer.write(my_analog_pin.read_u16());
jhaugen 8:a44d03ecc942 259 }
jhaugen 8:a44d03ecc942 260 break;
jhaugen 8:a44d03ecc942 261 case ADC_SAMP_FREQ_10HZ:
jhaugen 8:a44d03ecc942 262 if (tick_count % 1000 == 0) {
jhaugen 8:a44d03ecc942 263 //read_adc();
jhaugen 8:a44d03ecc942 264 adc_buffer.write(my_analog_pin.read_u16());
jhaugen 8:a44d03ecc942 265 }
jhaugen 8:a44d03ecc942 266 break;
jhaugen 8:a44d03ecc942 267 case ADC_SAMP_FREQ_100HZ:
jhaugen 8:a44d03ecc942 268 if (tick_count % 100 == 0) {
jhaugen 8:a44d03ecc942 269 //read_adc();
jhaugen 8:a44d03ecc942 270 adc_buffer.write(my_analog_pin.read_u16());
jhaugen 8:a44d03ecc942 271 }
jhaugen 8:a44d03ecc942 272 break;
jhaugen 8:a44d03ecc942 273 case ADC_SAMP_FREQ_OFF:
jhaugen 8:a44d03ecc942 274 // do nothing
jhaugen 8:a44d03ecc942 275 break;
jhaugen 8:a44d03ecc942 276 }
jhaugen 8:a44d03ecc942 277
jhaugen 8:a44d03ecc942 278 if (d_out_on == D_OUT_ON) {
jhaugen 10:cfd3decff616 279 d_out_pin = true;
jhaugen 8:a44d03ecc942 280 }
jhaugen 8:a44d03ecc942 281 else {
jhaugen 10:cfd3decff616 282 d_out_pin = false;
jhaugen 5:112df51d4815 283 }
jhaugen 8:a44d03ecc942 284
jhaugen 8:a44d03ecc942 285
jhaugen 8:a44d03ecc942 286 if (tick_count % 100 == 0) {
jhaugen 8:a44d03ecc942 287 // update the display every 10 ms
jhaugen 8:a44d03ecc942 288 long long time_us = ((long long) timer.read_us()) - offset;
jhaugen 8:a44d03ecc942 289 int time_s = (int) (time_us / 1000000);
jhaugen 8:a44d03ecc942 290 int time_m = time_s / 60;
jhaugen 8:a44d03ecc942 291
jhaugen 8:a44d03ecc942 292 int display_time = (time_m % 60) * 100 + (time_s % 60);
jhaugen 8:a44d03ecc942 293 //lcd.display(display_time);
jhaugen 8:a44d03ecc942 294 //lcd.putc('1');
jhaugen 8:a44d03ecc942 295 int display_time_ones = display_time % 10;
jhaugen 8:a44d03ecc942 296 int display_time_tens = (display_time / 10) % 10;
jhaugen 8:a44d03ecc942 297 int display_time_hund = (display_time / 100) % 10;
jhaugen 8:a44d03ecc942 298 int display_time_thou = (display_time / 1000) % 10;
jhaugen 8:a44d03ecc942 299 lcd.putc('0' + display_time_thou);
jhaugen 8:a44d03ecc942 300 lcd.putc('0' + display_time_hund);
jhaugen 8:a44d03ecc942 301 lcd.putc('0' + display_time_tens);
jhaugen 8:a44d03ecc942 302 lcd.putc('0' + display_time_ones);
jhaugen 8:a44d03ecc942 303 }
jhaugen 8:a44d03ecc942 304
jhaugen 5:112df51d4815 305 tick_count++;
jhaugen 5:112df51d4815 306 }
resolutedreamer 1:ca5c2809eec1 307
jhaugen 8:a44d03ecc942 308 void send_light_sensor_data() {
jhaugen 8:a44d03ecc942 309 light_sensor_buffer.swapBuff();
jhaugen 8:a44d03ecc942 310 unsigned short* sensor_data = light_sensor_buffer.getReadBuffer();
jhaugen 8:a44d03ecc942 311 int sensor_data_size = light_sensor_buffer.getReadBufferSize();
jhaugen 8:a44d03ecc942 312
jhaugen 8:a44d03ecc942 313 // send header
jhaugen 8:a44d03ecc942 314 pc.putc('l');
jhaugen 8:a44d03ecc942 315 send_int(sensor_data_size);
jhaugen 8:a44d03ecc942 316
jhaugen 8:a44d03ecc942 317 for (int i = 0; i < sensor_data_size; i++) {
jhaugen 8:a44d03ecc942 318 send_us(sensor_data[i]);
jhaugen 8:a44d03ecc942 319 }
jhaugen 8:a44d03ecc942 320 }
jhaugen 8:a44d03ecc942 321
jhaugen 8:a44d03ecc942 322 void send_adc_data() {
jhaugen 8:a44d03ecc942 323 adc_buffer.swapBuff();
jhaugen 8:a44d03ecc942 324 unsigned short* adc_data = adc_buffer.getReadBuffer();
jhaugen 8:a44d03ecc942 325 int adc_data_size = adc_buffer.getReadBufferSize();
jhaugen 8:a44d03ecc942 326
jhaugen 8:a44d03ecc942 327 // send header
jhaugen 8:a44d03ecc942 328 pc.putc('a');
jhaugen 8:a44d03ecc942 329 send_int(adc_data_size);
jhaugen 8:a44d03ecc942 330
jhaugen 8:a44d03ecc942 331 for (int i = 0; i < adc_data_size; i++) {
jhaugen 8:a44d03ecc942 332 send_us(adc_data[i]);
jhaugen 8:a44d03ecc942 333 }
jhaugen 8:a44d03ecc942 334 }
jhaugen 8:a44d03ecc942 335
jhaugen 8:a44d03ecc942 336 void send_timestamp_event_data() {
jhaugen 8:a44d03ecc942 337 d_event_buffer.swapBuff();
jhaugen 8:a44d03ecc942 338 unsigned long long* timestamp_data = d_event_buffer.getReadBuffer();
jhaugen 8:a44d03ecc942 339 int timestamp_data_size = d_event_buffer.getReadBufferSize();
jhaugen 8:a44d03ecc942 340
jhaugen 8:a44d03ecc942 341 pc.putc('d');
jhaugen 8:a44d03ecc942 342 send_int(timestamp_data_size);
jhaugen 8:a44d03ecc942 343
jhaugen 8:a44d03ecc942 344 for (int i = 0; i < timestamp_data_size; i++) {
jhaugen 8:a44d03ecc942 345 //unsigned long long ts = timestamp_data[i];
jhaugen 8:a44d03ecc942 346 //unsigned int msbs = ((unsigned int) (ts >> 32) & 0xffffffff);
jhaugen 8:a44d03ecc942 347 //unsigned int lsbs = ((unsigned int) ts & 0xffffffff);
jhaugen 8:a44d03ecc942 348 send_ull(timestamp_data[i]);
jhaugen 8:a44d03ecc942 349 }
jhaugen 8:a44d03ecc942 350 }
jhaugen 8:a44d03ecc942 351
jhaugen 8:a44d03ecc942 352 void systick_attach() {
jhaugen 8:a44d03ecc942 353 tick_count = 0;
jhaugen 8:a44d03ecc942 354 sine_index = 0;
jhaugen 8:a44d03ecc942 355 //ticker.attach_us(&systick, 100000);
jhaugen 8:a44d03ecc942 356 ticker.attach_us(&systick, 100);
jhaugen 8:a44d03ecc942 357 }
jhaugen 8:a44d03ecc942 358
jhaugen 8:a44d03ecc942 359 void d_event(){
jhaugen 8:a44d03ecc942 360 // take timestamp, send it to thingspeak later
jhaugen 8:a44d03ecc942 361 unsigned long long ts = timer.read_us();
jhaugen 8:a44d03ecc942 362 d_event_buffer.write(ts);
jhaugen 8:a44d03ecc942 363 }
jhaugen 8:a44d03ecc942 364
jhaugen 8:a44d03ecc942 365 unsigned long long sync_timestamp;
jhaugen 8:a44d03ecc942 366
jhaugen 8:a44d03ecc942 367 // take a timestamp, save it in a global if it was an 's' character
jhaugen 8:a44d03ecc942 368 void rx_sync_interrupt(MODSERIAL_IRQ_INFO *q) {
jhaugen 8:a44d03ecc942 369 sync_timestamp = timer.read_us();
jhaugen 8:a44d03ecc942 370 }
jhaugen 8:a44d03ecc942 371
resolutedreamer 0:68d1c7f2dbc7 372 int main()
jhaugen 8:a44d03ecc942 373 {
jhaugen 8:a44d03ecc942 374 redled = true;
jhaugen 7:c81c6968f013 375 timer.start();
resolutedreamer 6:3fbe44c7c26a 376 //initialize hardware
jhaugen 8:a44d03ecc942 377 systick_attach();
jhaugen 8:a44d03ecc942 378 d_event_pin.rise(&d_event);
jhaugen 8:a44d03ecc942 379 pc.baud(57600);
jhaugen 8:a44d03ecc942 380
jhaugen 8:a44d03ecc942 381 // set our interrupt to occur on receiving the sync packet
jhaugen 8:a44d03ecc942 382 pc.attach(&rx_sync_interrupt, MODSERIAL::RxAutoDetect);
jhaugen 8:a44d03ecc942 383 pc.autoDetectChar('s');
jhaugen 8:a44d03ecc942 384
jhaugen 8:a44d03ecc942 385 // lower the priority of the systick, since it might interfere with our timestamping
jhaugen 8:a44d03ecc942 386 NVIC_SetPriority(LPTimer_IRQn, 255);
resolutedreamer 6:3fbe44c7c26a 387
jhaugen 7:c81c6968f013 388 t1_string[30] = '\0';
resolutedreamer 6:3fbe44c7c26a 389
jhaugen 8:a44d03ecc942 390 int i = 0;
resolutedreamer 6:3fbe44c7c26a 391
resolutedreamer 6:3fbe44c7c26a 392 while (true)
resolutedreamer 6:3fbe44c7c26a 393 {
jhaugen 8:a44d03ecc942 394 redled = false;
jhaugen 7:c81c6968f013 395 char c = pc.getc();
jhaugen 8:a44d03ecc942 396 //redled = true;
jhaugen 8:a44d03ecc942 397 //pc.printf("got a char %c\r\n", c);
jhaugen 8:a44d03ecc942 398 //t2 = timer.read_us();
jhaugen 8:a44d03ecc942 399 t2 = sync_timestamp;
jhaugen 7:c81c6968f013 400 // make sure we've gotten an 's', which we are using as
jhaugen 7:c81c6968f013 401 // the sync message. If we get an 's' then t2 is correct.
jhaugen 7:c81c6968f013 402 if (c != 's') {
jhaugen 7:c81c6968f013 403 continue;
jhaugen 7:c81c6968f013 404 }
jhaugen 8:a44d03ecc942 405 //pc.printf("got s\r\n");
jhaugen 8:a44d03ecc942 406
jhaugen 8:a44d03ecc942 407 // we can drop the 's'
jhaugen 8:a44d03ecc942 408 c = pc.getc();
jhaugen 8:a44d03ecc942 409 i = 0;
jhaugen 8:a44d03ecc942 410 while (c != '\n' && i < 30) {
jhaugen 7:c81c6968f013 411 t1_string[i] = c;
jhaugen 7:c81c6968f013 412 c = pc.getc();
jhaugen 7:c81c6968f013 413 i++;
jhaugen 7:c81c6968f013 414 }
jhaugen 7:c81c6968f013 415 t1_string[i] = '\0';
jhaugen 7:c81c6968f013 416 i = 0;
jhaugen 8:a44d03ecc942 417
jhaugen 8:a44d03ecc942 418
jhaugen 8:a44d03ecc942 419
jhaugen 8:a44d03ecc942 420 //char display_time[5];
jhaugen 8:a44d03ecc942 421 //display_time[0] = t1_string[3];
jhaugen 8:a44d03ecc942 422 //display_time[1] = t1_string[4];
jhaugen 8:a44d03ecc942 423 //display_time[2] = t1_string[6];
jhaugen 8:a44d03ecc942 424 //display_time[3] = t1_string[7];
jhaugen 8:a44d03ecc942 425 //display_time[4] = '\0';
jhaugen 8:a44d03ecc942 426 //int display_time_int = atoi(display_time);
jhaugen 8:a44d03ecc942 427 //lcd.display(display_time_int);
jhaugen 8:a44d03ecc942 428 //read_complete = true;
resolutedreamer 1:ca5c2809eec1 429
jhaugen 7:c81c6968f013 430 t3 = timer.read_us();
jhaugen 7:c81c6968f013 431 // sending the delay_req message at time t3
jhaugen 7:c81c6968f013 432 pc.putc('r');
resolutedreamer 1:ca5c2809eec1 433
jhaugen 7:c81c6968f013 434 // get the t4 packet
jhaugen 8:a44d03ecc942 435 c = pc.getc();
jhaugen 8:a44d03ecc942 436 i = 0;
jhaugen 8:a44d03ecc942 437 while (c != '\n' && i < 30) {
jhaugen 7:c81c6968f013 438 t4_string[i] = c;
jhaugen 7:c81c6968f013 439 c = pc.getc();
jhaugen 7:c81c6968f013 440 i++;
resolutedreamer 6:3fbe44c7c26a 441 }
jhaugen 7:c81c6968f013 442 t4_string[i] = '\0';
jhaugen 7:c81c6968f013 443 i = 0;
jhaugen 8:a44d03ecc942 444
jhaugen 8:a44d03ecc942 445 //pc.printf("t4str: %s\n", t4_string);
jhaugen 8:a44d03ecc942 446
jhaugen 8:a44d03ecc942 447 /*if (t4 == 0) {
jhaugen 8:a44d03ecc942 448 pc.printf("t4 is zero\n");
jhaugen 8:a44d03ecc942 449 }
jhaugen 8:a44d03ecc942 450 else {
jhaugen 8:a44d03ecc942 451 pc.printf("t4 is not zero\n");
jhaugen 8:a44d03ecc942 452 }*/
jhaugen 8:a44d03ecc942 453
jhaugen 8:a44d03ecc942 454 //pc.printf("t4: %lld\n", t4);
jhaugen 8:a44d03ecc942 455 //lcd.display(7);
jhaugen 8:a44d03ecc942 456 //lcd.display(sizeof(long long) * 100 + sizeof(long));
jhaugen 8:a44d03ecc942 457 pc.printf("t1_string: %s t2: %d t3: %d t4_string: %s\n", t1_string, t2, t3, t4_string);
jhaugen 8:a44d03ecc942 458
jhaugen 8:a44d03ecc942 459 long long t1 = atoll(t1_string);
jhaugen 8:a44d03ecc942 460 long long t4 = atoll(t4_string);
jhaugen 8:a44d03ecc942 461 pc.printf("t1: %lld t2: %d t3: %d t4: %lld\n", t1, t2, t3, t4);
jhaugen 8:a44d03ecc942 462 offset = (((long long) t2 - t1) - (t4 - (long long) t3)) / 2;
jhaugen 8:a44d03ecc942 463 pc.printf("offset: %lld\n", offset);
jhaugen 8:a44d03ecc942 464
jhaugen 8:a44d03ecc942 465 //pc.printf("offset: %lld\n", offset);
jhaugen 8:a44d03ecc942 466
jhaugen 8:a44d03ecc942 467 long long time_us = ((long long) timer.read_us()) - offset;
jhaugen 8:a44d03ecc942 468 long long time_s = time_us / 1000000;
jhaugen 8:a44d03ecc942 469 long long time_m = time_s / 60;
jhaugen 8:a44d03ecc942 470 long long time_h = time_m / 60;
jhaugen 8:a44d03ecc942 471 pc.printf("time: %lld:%lld:%lld:%lld\n", time_h % 24, time_m % 60, time_s % 60, time_us % 1000000);
jhaugen 8:a44d03ecc942 472
jhaugen 8:a44d03ecc942 473
jhaugen 8:a44d03ecc942 474 // detach the systick, then reattach at the right time
jhaugen 8:a44d03ecc942 475 /*long long time_us_roundup = (time_s + 1) * 1000000;
jhaugen 8:a44d03ecc942 476 while((timer.read_us() - offset) < time_us_roundup) {
jhaugen 8:a44d03ecc942 477 // wait until the next second
jhaugen 8:a44d03ecc942 478 }
jhaugen 8:a44d03ecc942 479 ticker.detach();
jhaugen 8:a44d03ecc942 480 systick_attach();*/
jhaugen 8:a44d03ecc942 481
jhaugen 8:a44d03ecc942 482 /*char onoff = pc.getc();
jhaugen 8:a44d03ecc942 483 switch(onoff) {
jhaugen 8:a44d03ecc942 484 case 'a':
jhaugen 8:a44d03ecc942 485 redled = false;
jhaugen 8:a44d03ecc942 486 break;
jhaugen 8:a44d03ecc942 487 case 'b':
jhaugen 8:a44d03ecc942 488 redled = true;
jhaugen 8:a44d03ecc942 489 break;
jhaugen 8:a44d03ecc942 490 }*/
jhaugen 8:a44d03ecc942 491
jhaugen 8:a44d03ecc942 492 char opts = pc.getc();
jhaugen 8:a44d03ecc942 493 set_options(opts);
jhaugen 8:a44d03ecc942 494
jhaugen 8:a44d03ecc942 495 // send adc data, timestamp event data, light sensor data
jhaugen 8:a44d03ecc942 496 send_adc_data();
jhaugen 8:a44d03ecc942 497 send_light_sensor_data();
jhaugen 10:cfd3decff616 498 send_timestamp_event_data();
resolutedreamer 0:68d1c7f2dbc7 499 }
resolutedreamer 0:68d1c7f2dbc7 500 }