Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@0:b654a906fb40, 2015-04-29 (annotated)
- Committer:
- martydd3
- Date:
- Wed Apr 29 02:34:59 2015 +0000
- Revision:
- 0:b654a906fb40
- Child:
- 1:4a50c0bbbf9d
Work in progress
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| martydd3 | 0:b654a906fb40 | 1 | #include "mbed.h" |
| martydd3 | 0:b654a906fb40 | 2 | #include "MRF24J40.h" |
| martydd3 | 0:b654a906fb40 | 3 | |
| martydd3 | 0:b654a906fb40 | 4 | #include <string> |
| martydd3 | 0:b654a906fb40 | 5 | #include "constants.h" |
| martydd3 | 0:b654a906fb40 | 6 | #include "shape.h" |
| martydd3 | 0:b654a906fb40 | 7 | |
| martydd3 | 0:b654a906fb40 | 8 | // RF tranceiver to link with handheld. |
| martydd3 | 0:b654a906fb40 | 9 | MRF24J40 mrf(p11, p12, p13, p14, p26); |
| martydd3 | 0:b654a906fb40 | 10 | |
| martydd3 | 0:b654a906fb40 | 11 | // LEDs you can treat these as variables (led2 = 1 will turn led2 on!) |
| martydd3 | 0:b654a906fb40 | 12 | DigitalOut led1(LED1); |
| martydd3 | 0:b654a906fb40 | 13 | DigitalOut led2(LED2); |
| martydd3 | 0:b654a906fb40 | 14 | DigitalOut led3(LED3); |
| martydd3 | 0:b654a906fb40 | 15 | DigitalOut led4(LED4); |
| martydd3 | 0:b654a906fb40 | 16 | |
| martydd3 | 0:b654a906fb40 | 17 | // Timer |
| martydd3 | 0:b654a906fb40 | 18 | Timer timer; |
| martydd3 | 0:b654a906fb40 | 19 | |
| martydd3 | 0:b654a906fb40 | 20 | // Serial port for showing RX data. |
| martydd3 | 0:b654a906fb40 | 21 | Serial pc(USBTX, USBRX); |
| martydd3 | 0:b654a906fb40 | 22 | |
| martydd3 | 0:b654a906fb40 | 23 | // Used for sending and receiving |
| martydd3 | 0:b654a906fb40 | 24 | char txBuffer[128]; |
| martydd3 | 0:b654a906fb40 | 25 | char rxBuffer[128]; |
| martydd3 | 0:b654a906fb40 | 26 | int rxLen; |
| martydd3 | 0:b654a906fb40 | 27 | |
| martydd3 | 0:b654a906fb40 | 28 | //***************** Do not change these methods (please) *****************// |
| martydd3 | 0:b654a906fb40 | 29 | |
| martydd3 | 0:b654a906fb40 | 30 | /** |
| martydd3 | 0:b654a906fb40 | 31 | * Receive data from the MRF24J40. |
| martydd3 | 0:b654a906fb40 | 32 | * |
| martydd3 | 0:b654a906fb40 | 33 | * @param data A pointer to a char array to hold the data |
| martydd3 | 0:b654a906fb40 | 34 | * @param maxLength The max amount of data to read. |
| martydd3 | 0:b654a906fb40 | 35 | */ |
| martydd3 | 0:b654a906fb40 | 36 | int rf_receive(char *data, uint8_t maxLength) |
| martydd3 | 0:b654a906fb40 | 37 | { |
| martydd3 | 0:b654a906fb40 | 38 | uint8_t len = mrf.Receive((uint8_t *)data, maxLength); |
| martydd3 | 0:b654a906fb40 | 39 | uint8_t header[8]= {1, 8, 0, 0xA1, 0xB2, 0xC3, 0xD4, 0x00}; |
| martydd3 | 0:b654a906fb40 | 40 | |
| martydd3 | 0:b654a906fb40 | 41 | if(len > 10) { |
| martydd3 | 0:b654a906fb40 | 42 | //Remove the header and footer of the message |
| martydd3 | 0:b654a906fb40 | 43 | for(uint8_t i = 0; i < len-2; i++) { |
| martydd3 | 0:b654a906fb40 | 44 | if(i<8) { |
| martydd3 | 0:b654a906fb40 | 45 | //Make sure our header is valid first |
| martydd3 | 0:b654a906fb40 | 46 | if(data[i] != header[i]) |
| martydd3 | 0:b654a906fb40 | 47 | return 0; |
| martydd3 | 0:b654a906fb40 | 48 | } else { |
| martydd3 | 0:b654a906fb40 | 49 | data[i-8] = data[i]; |
| martydd3 | 0:b654a906fb40 | 50 | } |
| martydd3 | 0:b654a906fb40 | 51 | } |
| martydd3 | 0:b654a906fb40 | 52 | |
| martydd3 | 0:b654a906fb40 | 53 | //pc.printf("Received: %s length:%d\r\n", data, ((int)len)-10); |
| martydd3 | 0:b654a906fb40 | 54 | } |
| martydd3 | 0:b654a906fb40 | 55 | return ((int)len)-10; |
| martydd3 | 0:b654a906fb40 | 56 | } |
| martydd3 | 0:b654a906fb40 | 57 | |
| martydd3 | 0:b654a906fb40 | 58 | /** |
| martydd3 | 0:b654a906fb40 | 59 | * Send data to another MRF24J40. |
| martydd3 | 0:b654a906fb40 | 60 | * |
| martydd3 | 0:b654a906fb40 | 61 | * @param data The string to send |
| martydd3 | 0:b654a906fb40 | 62 | * @param maxLength The length of the data to send. |
| martydd3 | 0:b654a906fb40 | 63 | * If you are sending a null-terminated string you can pass strlen(data)+1 |
| martydd3 | 0:b654a906fb40 | 64 | */ |
| martydd3 | 0:b654a906fb40 | 65 | void rf_send(char *data, uint8_t len) |
| martydd3 | 0:b654a906fb40 | 66 | { |
| martydd3 | 0:b654a906fb40 | 67 | //We need to prepend the message with a valid ZigBee header |
| martydd3 | 0:b654a906fb40 | 68 | uint8_t header[8]= {1, 8, 0, 0xA1, 0xB2, 0xC3, 0xD4, 0x00}; |
| martydd3 | 0:b654a906fb40 | 69 | uint8_t *send_buf = (uint8_t *) malloc( sizeof(uint8_t) * (len+8) ); |
| martydd3 | 0:b654a906fb40 | 70 | |
| martydd3 | 0:b654a906fb40 | 71 | for(uint8_t i = 0; i < len+8; i++) { |
| martydd3 | 0:b654a906fb40 | 72 | //prepend the 8-byte header |
| martydd3 | 0:b654a906fb40 | 73 | send_buf[i] = (i<8) ? header[i] : data[i-8]; |
| martydd3 | 0:b654a906fb40 | 74 | } |
| martydd3 | 0:b654a906fb40 | 75 | //pc.printf("Sent: %s\r\n", send_buf+8); |
| martydd3 | 0:b654a906fb40 | 76 | |
| martydd3 | 0:b654a906fb40 | 77 | mrf.Send(send_buf, len+8); |
| martydd3 | 0:b654a906fb40 | 78 | free(send_buf); |
| martydd3 | 0:b654a906fb40 | 79 | } |
| martydd3 | 0:b654a906fb40 | 80 | |
| martydd3 | 0:b654a906fb40 | 81 | char (*frame)[SLICES][WIDTH]; |
| martydd3 | 0:b654a906fb40 | 82 | char frame_buffer[2][SLICES][WIDTH]; |
| martydd3 | 0:b654a906fb40 | 83 | char work_buffer[SLICES][WIDTH]; |
| martydd3 | 0:b654a906fb40 | 84 | |
| martydd3 | 0:b654a906fb40 | 85 | char hall_i = 0; |
| martydd3 | 0:b654a906fb40 | 86 | int hall_t = 0; |
| martydd3 | 0:b654a906fb40 | 87 | |
| martydd3 | 0:b654a906fb40 | 88 | int rot_t_samples[5] = {0}; |
| martydd3 | 0:b654a906fb40 | 89 | char rot_i = 0; |
| martydd3 | 0:b654a906fb40 | 90 | int rot_t = 100; |
| martydd3 | 0:b654a906fb40 | 91 | |
| martydd3 | 0:b654a906fb40 | 92 | void hall_int(){ |
| martydd3 | 0:b654a906fb40 | 93 | hall_i = 1; |
| martydd3 | 0:b654a906fb40 | 94 | } |
| martydd3 | 0:b654a906fb40 | 95 | |
| martydd3 | 0:b654a906fb40 | 96 | int slice_i = 0; |
| martydd3 | 0:b654a906fb40 | 97 | BusOut blade(p15, p16, p17, p18, p19, p20, p21, p22); |
| martydd3 | 0:b654a906fb40 | 98 | DigitalOut clk(p23); |
| martydd3 | 0:b654a906fb40 | 99 | DigitalOut disp(p24); |
| martydd3 | 0:b654a906fb40 | 100 | Ticker pixel_ticker; |
| martydd3 | 0:b654a906fb40 | 101 | |
| martydd3 | 0:b654a906fb40 | 102 | int displaces[HEIGHT]; |
| martydd3 | 0:b654a906fb40 | 103 | |
| martydd3 | 0:b654a906fb40 | 104 | void init_displaces(){ |
| martydd3 | 0:b654a906fb40 | 105 | for(int i = 0; i < HEIGHT; i++){ |
| martydd3 | 0:b654a906fb40 | 106 | switch(i){ |
| martydd3 | 0:b654a906fb40 | 107 | case 0: displaces[i] = 0; break; |
| martydd3 | 0:b654a906fb40 | 108 | case 1: displaces[i] = 4 * SLICES / 8; break; |
| martydd3 | 0:b654a906fb40 | 109 | case 2: displaces[i] = 7 * SLICES / 8 - 5; break; |
| martydd3 | 0:b654a906fb40 | 110 | case 3: displaces[i] = 3 * SLICES / 8 - 8; break; |
| martydd3 | 0:b654a906fb40 | 111 | case 4: displaces[i] = 6 * SLICES / 8 - 6; break; |
| martydd3 | 0:b654a906fb40 | 112 | case 5: displaces[i] = 2 * SLICES / 8 - 7; break; |
| martydd3 | 0:b654a906fb40 | 113 | case 6: displaces[i] = 5 * SLICES / 8 - 7; break; |
| martydd3 | 0:b654a906fb40 | 114 | case 7: displaces[i] = 1 * SLICES / 8 - 8; break; |
| martydd3 | 0:b654a906fb40 | 115 | } |
| martydd3 | 0:b654a906fb40 | 116 | } |
| martydd3 | 0:b654a906fb40 | 117 | } |
| martydd3 | 0:b654a906fb40 | 118 | |
| martydd3 | 0:b654a906fb40 | 119 | void push_pixels(){ |
| martydd3 | 0:b654a906fb40 | 120 | for(int j = 8; j < WIDTH; j++){ |
| martydd3 | 0:b654a906fb40 | 121 | blade = (*frame)[slice_i][j]; |
| martydd3 | 0:b654a906fb40 | 122 | |
| martydd3 | 0:b654a906fb40 | 123 | clk = 1; |
| martydd3 | 0:b654a906fb40 | 124 | clk = 0; |
| martydd3 | 0:b654a906fb40 | 125 | } |
| martydd3 | 0:b654a906fb40 | 126 | |
| martydd3 | 0:b654a906fb40 | 127 | for(int j = 7; j >= 0; j--){ |
| martydd3 | 0:b654a906fb40 | 128 | blade = (*frame)[slice_i][j]; |
| martydd3 | 0:b654a906fb40 | 129 | |
| martydd3 | 0:b654a906fb40 | 130 | clk = 1; |
| martydd3 | 0:b654a906fb40 | 131 | clk = 0; |
| martydd3 | 0:b654a906fb40 | 132 | } |
| martydd3 | 0:b654a906fb40 | 133 | |
| martydd3 | 0:b654a906fb40 | 134 | disp = 1; |
| martydd3 | 0:b654a906fb40 | 135 | disp = 0; |
| martydd3 | 0:b654a906fb40 | 136 | |
| martydd3 | 0:b654a906fb40 | 137 | slice_i = (slice_i + 1)%SLICES; |
| martydd3 | 0:b654a906fb40 | 138 | } |
| martydd3 | 0:b654a906fb40 | 139 | |
| martydd3 | 0:b654a906fb40 | 140 | //Hall sensor interupt |
| martydd3 | 0:b654a906fb40 | 141 | bool firstTime; |
| martydd3 | 0:b654a906fb40 | 142 | double rotate_time; |
| martydd3 | 0:b654a906fb40 | 143 | double slice_time; |
| martydd3 | 0:b654a906fb40 | 144 | |
| martydd3 | 0:b654a906fb40 | 145 | Timer hall_timer; |
| martydd3 | 0:b654a906fb40 | 146 | |
| martydd3 | 0:b654a906fb40 | 147 | void rotate_sense(){ |
| martydd3 | 0:b654a906fb40 | 148 | if (firstTime){ |
| martydd3 | 0:b654a906fb40 | 149 | hall_timer.reset(); |
| martydd3 | 0:b654a906fb40 | 150 | hall_timer.start(); |
| martydd3 | 0:b654a906fb40 | 151 | firstTime = false; |
| martydd3 | 0:b654a906fb40 | 152 | return; |
| martydd3 | 0:b654a906fb40 | 153 | } |
| martydd3 | 0:b654a906fb40 | 154 | |
| martydd3 | 0:b654a906fb40 | 155 | rotate_time = hall_timer.read_us(); |
| martydd3 | 0:b654a906fb40 | 156 | hall_timer.reset(); |
| martydd3 | 0:b654a906fb40 | 157 | hall_timer.start(); |
| martydd3 | 0:b654a906fb40 | 158 | |
| martydd3 | 0:b654a906fb40 | 159 | slice_time = (double) rotate_time/SLICES; |
| martydd3 | 0:b654a906fb40 | 160 | slice_i = 0; |
| martydd3 | 0:b654a906fb40 | 161 | pixel_ticker.attach_us(&push_pixels, slice_time); |
| martydd3 | 0:b654a906fb40 | 162 | } |
| martydd3 | 0:b654a906fb40 | 163 | |
| martydd3 | 0:b654a906fb40 | 164 | void convert_array(){ |
| martydd3 | 0:b654a906fb40 | 165 | int array_i; |
| martydd3 | 0:b654a906fb40 | 166 | |
| martydd3 | 0:b654a906fb40 | 167 | if(frame == &frame_buffer[0]) |
| martydd3 | 0:b654a906fb40 | 168 | array_i = 1; |
| martydd3 | 0:b654a906fb40 | 169 | else |
| martydd3 | 0:b654a906fb40 | 170 | array_i = 0; |
| martydd3 | 0:b654a906fb40 | 171 | |
| martydd3 | 0:b654a906fb40 | 172 | for(int i = 0; i < SLICES; i++){ |
| martydd3 | 0:b654a906fb40 | 173 | for(int j = 0; j < WIDTH; j++){ |
| martydd3 | 0:b654a906fb40 | 174 | char bit = 0x00; |
| martydd3 | 0:b654a906fb40 | 175 | |
| martydd3 | 0:b654a906fb40 | 176 | for(int h = 0; h < HEIGHT; h++){ |
| martydd3 | 0:b654a906fb40 | 177 | bit |= (work_buffer[(i + displaces[h]) % SLICES][j] & (0x01 << h)); |
| martydd3 | 0:b654a906fb40 | 178 | } |
| martydd3 | 0:b654a906fb40 | 179 | |
| martydd3 | 0:b654a906fb40 | 180 | frame_buffer[array_i][i][j] = bit; |
| martydd3 | 0:b654a906fb40 | 181 | } |
| martydd3 | 0:b654a906fb40 | 182 | } |
| martydd3 | 0:b654a906fb40 | 183 | |
| martydd3 | 0:b654a906fb40 | 184 | frame = &frame_buffer[array_i]; |
| martydd3 | 0:b654a906fb40 | 185 | } |
| martydd3 | 0:b654a906fb40 | 186 | |
| martydd3 | 0:b654a906fb40 | 187 | int main (void) |
| martydd3 | 0:b654a906fb40 | 188 | { |
| martydd3 | 0:b654a906fb40 | 189 | firstTime = true; |
| martydd3 | 0:b654a906fb40 | 190 | slice_i = 100; |
| martydd3 | 0:b654a906fb40 | 191 | init_displaces(); |
| martydd3 | 0:b654a906fb40 | 192 | |
| martydd3 | 0:b654a906fb40 | 193 | frame = &frame_buffer[0]; |
| martydd3 | 0:b654a906fb40 | 194 | |
| martydd3 | 0:b654a906fb40 | 195 | /* |
| martydd3 | 0:b654a906fb40 | 196 | Line line1(15, 0, 0, 15, 90, 7, &work_buffer); |
| martydd3 | 0:b654a906fb40 | 197 | Line line2(15, 90, 7, 15, 180, 0, &work_buffer); |
| martydd3 | 0:b654a906fb40 | 198 | Line line3(15, 180, 0, 15, 270, 7, &work_buffer); |
| martydd3 | 0:b654a906fb40 | 199 | Line line4(15, 270, 7, 15, 0, 0, &work_buffer); |
| martydd3 | 0:b654a906fb40 | 200 | line1.draw(); |
| martydd3 | 0:b654a906fb40 | 201 | line2.draw(); |
| martydd3 | 0:b654a906fb40 | 202 | line3.draw(); |
| martydd3 | 0:b654a906fb40 | 203 | line4.draw(); |
| martydd3 | 0:b654a906fb40 | 204 | |
| martydd3 | 0:b654a906fb40 | 205 | Line line5(15, 45, 0, 15, 135, 7, &work_buffer); |
| martydd3 | 0:b654a906fb40 | 206 | Line line6(15, 135, 7, 15, 225, 0, &work_buffer); |
| martydd3 | 0:b654a906fb40 | 207 | Line line7(15, 225, 0, 15, 315, 7, &work_buffer); |
| martydd3 | 0:b654a906fb40 | 208 | Line line8(15, 315, 7, 15, 45, 0, &work_buffer); |
| martydd3 | 0:b654a906fb40 | 209 | line5.draw(); |
| martydd3 | 0:b654a906fb40 | 210 | line6.draw(); |
| martydd3 | 0:b654a906fb40 | 211 | line7.draw(); |
| martydd3 | 0:b654a906fb40 | 212 | line8.draw(); |
| martydd3 | 0:b654a906fb40 | 213 | */ |
| martydd3 | 0:b654a906fb40 | 214 | |
| martydd3 | 0:b654a906fb40 | 215 | Line line1(1, 0, 0, 1, 0, 7, &work_buffer); |
| martydd3 | 0:b654a906fb40 | 216 | Line line2(9, 35, 0, 9, 35, 7, &work_buffer); |
| martydd3 | 0:b654a906fb40 | 217 | Line line3(9, 325, 0, 9, 325, 7, &work_buffer); |
| martydd3 | 0:b654a906fb40 | 218 | Line line4(13, 0, 0, 13, 0, 7, &work_buffer); |
| martydd3 | 0:b654a906fb40 | 219 | |
| martydd3 | 0:b654a906fb40 | 220 | line1.draw(); |
| martydd3 | 0:b654a906fb40 | 221 | line2.draw(); |
| martydd3 | 0:b654a906fb40 | 222 | line3.draw(); |
| martydd3 | 0:b654a906fb40 | 223 | line4.draw(); |
| martydd3 | 0:b654a906fb40 | 224 | |
| martydd3 | 0:b654a906fb40 | 225 | Line line5(1, 0, 0, 9, 35, 0, &work_buffer); |
| martydd3 | 0:b654a906fb40 | 226 | Line line6(1, 0, 0, 9, 325, 0, &work_buffer); |
| martydd3 | 0:b654a906fb40 | 227 | Line line7(15, 315, 0, 15, 0, 0, &work_buffer); |
| martydd3 | 0:b654a906fb40 | 228 | Line line8(15, 45, 0, 15, 0, 0, &work_buffer); |
| martydd3 | 0:b654a906fb40 | 229 | |
| martydd3 | 0:b654a906fb40 | 230 | line5.draw(); |
| martydd3 | 0:b654a906fb40 | 231 | line6.draw(); |
| martydd3 | 0:b654a906fb40 | 232 | line7.draw(); |
| martydd3 | 0:b654a906fb40 | 233 | line8.draw(); |
| martydd3 | 0:b654a906fb40 | 234 | |
| martydd3 | 0:b654a906fb40 | 235 | Line line9(1, 0, 7, 9, 35, 7, &work_buffer); |
| martydd3 | 0:b654a906fb40 | 236 | Line line10(1, 0, 7, 9, 325, 7, &work_buffer); |
| martydd3 | 0:b654a906fb40 | 237 | Line line11(9, 325, 7, 15, 0, 7, &work_buffer); |
| martydd3 | 0:b654a906fb40 | 238 | Line line12(9, 35, 7, 15, 0, 7, &work_buffer); |
| martydd3 | 0:b654a906fb40 | 239 | |
| martydd3 | 0:b654a906fb40 | 240 | line9.draw(); |
| martydd3 | 0:b654a906fb40 | 241 | line10.draw(); |
| martydd3 | 0:b654a906fb40 | 242 | line11.draw(); |
| martydd3 | 0:b654a906fb40 | 243 | line12.draw(); |
| martydd3 | 0:b654a906fb40 | 244 | |
| martydd3 | 0:b654a906fb40 | 245 | convert_array(); |
| martydd3 | 0:b654a906fb40 | 246 | |
| martydd3 | 0:b654a906fb40 | 247 | InterruptIn hall_pin(p25); |
| martydd3 | 0:b654a906fb40 | 248 | hall_pin.fall(&rotate_sense); |
| martydd3 | 0:b654a906fb40 | 249 | |
| martydd3 | 0:b654a906fb40 | 250 | uint8_t channel = 2; |
| martydd3 | 0:b654a906fb40 | 251 | |
| martydd3 | 0:b654a906fb40 | 252 | //Set the Channel. 0 is default, 15 is max |
| martydd3 | 0:b654a906fb40 | 253 | mrf.SetChannel(channel); |
| martydd3 | 0:b654a906fb40 | 254 | |
| martydd3 | 0:b654a906fb40 | 255 | while(true) { |
| martydd3 | 0:b654a906fb40 | 256 | |
| martydd3 | 0:b654a906fb40 | 257 | } |
| martydd3 | 0:b654a906fb40 | 258 | } |