2014-12-10 5:41 1 second pulse (serial)
Dependencies: MODSERIALhacked Convert SLCD mbed-src
main.cpp@12:c97d6cd17314, 2014-12-18 (annotated)
- 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?
User | Revision | Line number | New 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 | } |