Martin Deng / Mbed 2 deprecated mbed_shapedriver

Dependencies:   mbed

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?

UserRevisionLine numberNew 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 }