Estimating ball impact with more microphones
Dependencies: SmartSwitch TMRh20 mbed
main.cpp@5:ed147c3ecb57, 2016-03-24 (annotated)
- Committer:
- gume
- Date:
- Thu Mar 24 14:10:13 2016 +0000
- Revision:
- 5:ed147c3ecb57
- Parent:
- 4:6efe063cdbb2
- Chnaged to 960 samples
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
gume | 0:7f49ac69d623 | 1 | #include "mbed.h" |
gume | 0:7f49ac69d623 | 2 | #include "DeafNode.h" |
gume | 0:7f49ac69d623 | 3 | |
gume | 0:7f49ac69d623 | 4 | AnalogIn adc0(A0); |
gume | 0:7f49ac69d623 | 5 | AnalogIn adc1(A1); |
gume | 0:7f49ac69d623 | 6 | AnalogIn adc2(A2); |
gume | 0:7f49ac69d623 | 7 | AnalogIn adc3(A3); |
gume | 3:f76bcafbbdd0 | 8 | AnalogIn adc4(A4); |
gume | 5:ed147c3ecb57 | 9 | //AnalogIn adc5(A5); |
gume | 5:ed147c3ecb57 | 10 | //AnalogIn adc5(D0); |
gume | 0:7f49ac69d623 | 11 | |
gume | 4:6efe063cdbb2 | 12 | DigitalOut led(D3); |
gume | 0:7f49ac69d623 | 13 | DeafNode *deafNode; |
gume | 0:7f49ac69d623 | 14 | Serial pc(USBTX, USBRX); |
gume | 0:7f49ac69d623 | 15 | |
gume | 5:ed147c3ecb57 | 16 | #define SAMPLE_SIZE 960 |
gume | 1:2b938172cef5 | 17 | #define PRESAMPLE_SIZE 60 |
gume | 3:f76bcafbbdd0 | 18 | // Buffers to store the samples of the 6 channels |
gume | 0:7f49ac69d623 | 19 | uint8_t buffer0[SAMPLE_SIZE]; |
gume | 0:7f49ac69d623 | 20 | uint8_t buffer1[SAMPLE_SIZE]; |
gume | 0:7f49ac69d623 | 21 | uint8_t buffer2[SAMPLE_SIZE]; |
gume | 0:7f49ac69d623 | 22 | uint8_t buffer3[SAMPLE_SIZE]; |
gume | 3:f76bcafbbdd0 | 23 | uint8_t buffer4[SAMPLE_SIZE]; |
gume | 5:ed147c3ecb57 | 24 | //uint8_t buffer5[SAMPLE_SIZE]; |
gume | 0:7f49ac69d623 | 25 | |
gume | 3:f76bcafbbdd0 | 26 | |
gume | 3:f76bcafbbdd0 | 27 | uint8_t sid; |
gume | 0:7f49ac69d623 | 28 | int sample_start; |
gume | 0:7f49ac69d623 | 29 | int sample_size; |
gume | 0:7f49ac69d623 | 30 | int sample_pointer; |
gume | 0:7f49ac69d623 | 31 | |
gume | 0:7f49ac69d623 | 32 | #define DCVAL 118 |
gume | 0:7f49ac69d623 | 33 | #define THRESHOLD 34 |
gume | 0:7f49ac69d623 | 34 | |
gume | 0:7f49ac69d623 | 35 | uint8_t datapacket[32]; |
gume | 0:7f49ac69d623 | 36 | |
gume | 0:7f49ac69d623 | 37 | volatile unsigned int TickCount; |
gume | 0:7f49ac69d623 | 38 | extern "C" void SysTick_Handler (void) |
gume | 0:7f49ac69d623 | 39 | { |
gume | 0:7f49ac69d623 | 40 | TickCount+= 1; |
gume | 0:7f49ac69d623 | 41 | } |
gume | 0:7f49ac69d623 | 42 | |
gume | 0:7f49ac69d623 | 43 | void readMics() |
gume | 0:7f49ac69d623 | 44 | { |
gume | 0:7f49ac69d623 | 45 | buffer0[sample_pointer] = adc0.read_u16() >> 8; |
gume | 0:7f49ac69d623 | 46 | buffer1[sample_pointer] = adc1.read_u16() >> 8; |
gume | 0:7f49ac69d623 | 47 | buffer2[sample_pointer] = adc2.read_u16() >> 8; |
gume | 0:7f49ac69d623 | 48 | buffer3[sample_pointer] = adc3.read_u16() >> 8; |
gume | 4:6efe063cdbb2 | 49 | buffer4[sample_pointer] = adc4.read_u16() >> 8; |
gume | 5:ed147c3ecb57 | 50 | // buffer5[sample_pointer] = adc5.read_u16() >> 8; |
gume | 4:6efe063cdbb2 | 51 | |
gume | 4:6efe063cdbb2 | 52 | //buffer0[sample_pointer] = 120; |
gume | 4:6efe063cdbb2 | 53 | //buffer1[sample_pointer] = 121; |
gume | 4:6efe063cdbb2 | 54 | //buffer2[sample_pointer] = 122; |
gume | 4:6efe063cdbb2 | 55 | //buffer3[sample_pointer] = 123; |
gume | 4:6efe063cdbb2 | 56 | //buffer4[sample_pointer] = 124; |
gume | 4:6efe063cdbb2 | 57 | //buffer5[sample_pointer] = 125; |
gume | 0:7f49ac69d623 | 58 | } |
gume | 0:7f49ac69d623 | 59 | |
gume | 0:7f49ac69d623 | 60 | bool checkThreshold() |
gume | 0:7f49ac69d623 | 61 | { |
gume | 0:7f49ac69d623 | 62 | bool threshold = false; |
gume | 0:7f49ac69d623 | 63 | |
gume | 0:7f49ac69d623 | 64 | if (buffer0[sample_pointer] > DCVAL + THRESHOLD || buffer0[sample_pointer] < DCVAL - THRESHOLD) threshold = true; |
gume | 0:7f49ac69d623 | 65 | else if (buffer1[sample_pointer] > DCVAL + THRESHOLD || buffer1[sample_pointer] < DCVAL - THRESHOLD) threshold = true; |
gume | 0:7f49ac69d623 | 66 | else if (buffer2[sample_pointer] > DCVAL + THRESHOLD || buffer2[sample_pointer] < DCVAL - THRESHOLD) threshold = true; |
gume | 0:7f49ac69d623 | 67 | else if (buffer3[sample_pointer] > DCVAL + THRESHOLD || buffer3[sample_pointer] < DCVAL - THRESHOLD) threshold = true; |
gume | 3:f76bcafbbdd0 | 68 | else if (buffer4[sample_pointer] > DCVAL + THRESHOLD || buffer4[sample_pointer] < DCVAL - THRESHOLD) threshold = true; |
gume | 5:ed147c3ecb57 | 69 | // else if (buffer5[sample_pointer] > DCVAL + THRESHOLD || buffer5[sample_pointer] < DCVAL - THRESHOLD) threshold = true; |
gume | 0:7f49ac69d623 | 70 | |
gume | 0:7f49ac69d623 | 71 | return threshold; |
gume | 0:7f49ac69d623 | 72 | } |
gume | 0:7f49ac69d623 | 73 | |
gume | 4:6efe063cdbb2 | 74 | void sendSamples(uint8_t sid, uint8_t mid, uint8_t *samples, int length, int pointer) |
gume | 0:7f49ac69d623 | 75 | { |
gume | 3:f76bcafbbdd0 | 76 | // 0-1 bytes: type ID |
gume | 2:5d075b76930a | 77 | datapacket[0] = 0x00; |
gume | 3:f76bcafbbdd0 | 78 | datapacket[1] = 0x11; |
gume | 4:6efe063cdbb2 | 79 | datapacket[2] = sid << 4 | mid & 0x0f; |
gume | 2:5d075b76930a | 80 | |
gume | 0:7f49ac69d623 | 81 | int c = 0; |
gume | 0:7f49ac69d623 | 82 | while (c < length) { |
gume | 0:7f49ac69d623 | 83 | int j; |
gume | 3:f76bcafbbdd0 | 84 | // 2-3 bytes: 4 bit sample ID, 12 bit offset (in 20 bytes) |
gume | 4:6efe063cdbb2 | 85 | |
gume | 4:6efe063cdbb2 | 86 | datapacket[3] = (c / 20); |
gume | 2:5d075b76930a | 87 | for (j = 0; j < 20; j++) { |
gume | 2:5d075b76930a | 88 | datapacket[4 + j] = samples[pointer]; |
gume | 0:7f49ac69d623 | 89 | pointer++; |
gume | 2:5d075b76930a | 90 | if (pointer >= SAMPLE_SIZE) pointer = 0; |
gume | 0:7f49ac69d623 | 91 | c++; |
gume | 0:7f49ac69d623 | 92 | if (c > length) break; |
gume | 0:7f49ac69d623 | 93 | } |
gume | 2:5d075b76930a | 94 | deafNode->sendData(0, datapacket, j + 4); |
gume | 0:7f49ac69d623 | 95 | } |
gume | 0:7f49ac69d623 | 96 | } |
gume | 0:7f49ac69d623 | 97 | |
gume | 0:7f49ac69d623 | 98 | int main() |
gume | 0:7f49ac69d623 | 99 | { |
gume | 4:6efe063cdbb2 | 100 | led = 0; |
gume | 0:7f49ac69d623 | 101 | SysTick_Config(SystemCoreClock / 1000); // Systick in ms |
gume | 0:7f49ac69d623 | 102 | |
gume | 0:7f49ac69d623 | 103 | pc.baud(115200); |
gume | 0:7f49ac69d623 | 104 | pc.printf("Node started (%d MHz).\n", SystemCoreClock / 1000000); |
gume | 0:7f49ac69d623 | 105 | |
gume | 0:7f49ac69d623 | 106 | NodeConfig nc; |
gume | 0:7f49ac69d623 | 107 | nc.address = 0x4D31; |
gume | 0:7f49ac69d623 | 108 | nc.netprefix = 0x424D45L; |
gume | 4:6efe063cdbb2 | 109 | nc.radioCE = D9; |
gume | 3:f76bcafbbdd0 | 110 | nc.radioCS = D10; |
gume | 0:7f49ac69d623 | 111 | nc.spi_sck = SPI_SCK; |
gume | 0:7f49ac69d623 | 112 | nc.spi_miso = SPI_MISO; |
gume | 0:7f49ac69d623 | 113 | nc.spi_mosi = SPI_MOSI; |
gume | 0:7f49ac69d623 | 114 | nc.radioChannel = 96; |
gume | 0:7f49ac69d623 | 115 | nc.radioSpeed = RF24_2MBPS; |
gume | 0:7f49ac69d623 | 116 | |
gume | 0:7f49ac69d623 | 117 | deafNode = new DeafNode(&nc); |
gume | 0:7f49ac69d623 | 118 | deafNode->setup(); |
gume | 0:7f49ac69d623 | 119 | |
gume | 4:6efe063cdbb2 | 120 | if (deafNode->isRadioWorking()) { |
gume | 4:6efe063cdbb2 | 121 | pc.printf("Radio is working.\n"); |
gume | 4:6efe063cdbb2 | 122 | led = 1; |
gume | 4:6efe063cdbb2 | 123 | } |
gume | 3:f76bcafbbdd0 | 124 | sid = 0; |
gume | 0:7f49ac69d623 | 125 | sample_start = 0; |
gume | 0:7f49ac69d623 | 126 | sample_size = 0; |
gume | 0:7f49ac69d623 | 127 | sample_pointer = 0; |
gume | 0:7f49ac69d623 | 128 | |
gume | 0:7f49ac69d623 | 129 | bool action = false; |
gume | 0:7f49ac69d623 | 130 | |
gume | 0:7f49ac69d623 | 131 | while(1) { |
gume | 0:7f49ac69d623 | 132 | |
gume | 0:7f49ac69d623 | 133 | readMics(); |
gume | 1:2b938172cef5 | 134 | //pc.puts("."); |
gume | 0:7f49ac69d623 | 135 | |
gume | 0:7f49ac69d623 | 136 | if (!action) { |
gume | 0:7f49ac69d623 | 137 | // Not in action, just listening |
gume | 0:7f49ac69d623 | 138 | if (checkThreshold()) { |
gume | 1:2b938172cef5 | 139 | //pc.puts("\nThreshold reached!\n"); |
gume | 0:7f49ac69d623 | 140 | action = true; |
gume | 0:7f49ac69d623 | 141 | if (sample_size > PRESAMPLE_SIZE) { |
gume | 0:7f49ac69d623 | 142 | sample_size = PRESAMPLE_SIZE; |
gume | 0:7f49ac69d623 | 143 | } |
gume | 0:7f49ac69d623 | 144 | sample_start = sample_pointer - sample_size; |
gume | 1:2b938172cef5 | 145 | if (sample_start < 0) sample_start += SAMPLE_SIZE; |
gume | 0:7f49ac69d623 | 146 | } |
gume | 0:7f49ac69d623 | 147 | sample_pointer++; |
gume | 2:5d075b76930a | 148 | if (sample_pointer >= SAMPLE_SIZE) sample_pointer = 0; |
gume | 0:7f49ac69d623 | 149 | if (sample_size < SAMPLE_SIZE) sample_size++; |
gume | 0:7f49ac69d623 | 150 | } else { |
gume | 0:7f49ac69d623 | 151 | // In action, collecting |
gume | 0:7f49ac69d623 | 152 | sample_pointer++; |
gume | 2:5d075b76930a | 153 | if (sample_pointer >= SAMPLE_SIZE) sample_pointer = 0; |
gume | 0:7f49ac69d623 | 154 | sample_size++; |
gume | 0:7f49ac69d623 | 155 | if (sample_size == SAMPLE_SIZE) { |
gume | 0:7f49ac69d623 | 156 | // Stop collecting, send samples |
gume | 0:7f49ac69d623 | 157 | action = false; |
gume | 2:5d075b76930a | 158 | for (int r = 1; r <= 2; r++) { |
gume | 4:6efe063cdbb2 | 159 | sendSamples(sid, 0, buffer0, SAMPLE_SIZE, sample_start); |
gume | 4:6efe063cdbb2 | 160 | sendSamples(sid, 1, buffer1, SAMPLE_SIZE, sample_start); |
gume | 4:6efe063cdbb2 | 161 | sendSamples(sid, 2, buffer2, SAMPLE_SIZE, sample_start); |
gume | 4:6efe063cdbb2 | 162 | sendSamples(sid, 3, buffer3, SAMPLE_SIZE, sample_start); |
gume | 4:6efe063cdbb2 | 163 | sendSamples(sid, 4, buffer4, SAMPLE_SIZE, sample_start); |
gume | 5:ed147c3ecb57 | 164 | // sendSamples(sid, 5, buffer5, SAMPLE_SIZE, sample_start); |
gume | 2:5d075b76930a | 165 | printf("\nSamples were sent (%d).\n", r); |
gume | 2:5d075b76930a | 166 | } |
gume | 3:f76bcafbbdd0 | 167 | sid++; |
gume | 0:7f49ac69d623 | 168 | sample_size = 0; |
gume | 0:7f49ac69d623 | 169 | sample_pointer = 0; |
gume | 0:7f49ac69d623 | 170 | } |
gume | 0:7f49ac69d623 | 171 | } |
gume | 0:7f49ac69d623 | 172 | } |
gume | 0:7f49ac69d623 | 173 | } |