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