Project

General

Profile

Statistics
| Revision:

root / trunk / code / projects / colonet / utilities / robot_slave / dragonfly_lib.c @ 13

History | View | Annotate | Download (11.4 KB)

1
#include <dragonfly_lib.h>
2

    
3
/* init_dragonfly - Initializes functions based on configuration parameters
4
   examples:
5

6
   init_dragonfly (0, 0, 0); - just initialize the digital IO (buttons, potentiometer)
7

8
   init_dragonfly (ANALOG | SERIAL | BUZZER, C0_C1_ANALOG, BAUD115200); 
9
   Initialize ADC and set C0 and C1 as analog inputs.  Initialize serial and set baud rate
10
   to 115200 bps.  Initialize the buzzer.
11
   
12
   init_dragonfly (MOTORS | ORB, 0, 0);
13
   Initialize motor driving and the color fading abilities of the ORB. */
14
   
15
void dragonfly_init(int config) 
16
{
17
        // Set directionality of various IO pins
18
        DDRG &= ~(_BV(PING0)|_BV(PING1));
19
        PORTG |= _BV(PING0)|_BV(PING1);
20
        
21
        if(config & ANALOG) {
22
                analog_init();
23
        }
24
        
25
        if(config & COMM) {
26
    //Defaults to 115200. Check serial.h for more information.
27
    sei();
28
    usb_init();
29
    xbee_init();
30
        }
31
        
32
        if(config & BUZZER) {
33
    sei();
34
                buzzer_init();
35
        }
36
        
37
        if(config & ORB) {
38
    sei();
39
                orb_init();
40
        }
41
        
42
        if(config & MOTORS) {
43
                motors_init();
44
        }
45
        
46
        if(config & SERVOS) {
47
                sei();
48
    //Servos not yet implemented
49
    //servo_init();
50
        }
51

    
52
        if(config & LCD) {
53
                lcd_init();
54
        }
55
        
56
        if(config & (SERVOS | ORB)) {
57
    sei();
58
    orb_init();
59
    //Servos not yet implemented
60
        }
61
        
62
        // delay a bit for stability
63
        _delay_ms(1);
64
}
65

    
66
void adc_gain_test(void);
67
void analog_test(void);
68
void batt_test(void);
69
void button_test(void);
70
void buzzer_test(void);
71
void dio_test(void);
72
void general_test(void);
73
void i2c_test(void);
74
void lcd_test(void);
75
void motor_test(void);
76
void orb_test(void);
77
void pullup_test(void);
78
void ranger_test(void);
79
void reset_test(void);
80
void ring_buffer_tester(void);
81
void rtc_test(void);
82
void rtc_test_pulse(void);
83
void serial_test(void);
84
void servo_orb_test(void);
85
void wl_receive_test(void);
86
void wl_send_test(void);
87
void wl_send_packet_test(void);
88
void move_test(void);
89

    
90
void move_test(void){
91
  range_init();
92
  motors_init();
93
  analog_init();
94
  while(1){
95
    move_avoid(200,0,50 );
96
  }
97
}  
98

    
99
void general_test(){
100
        int i;
101
        dragonfly_init(MOTORS|BUZZER|ORB|USB);
102

    
103
        while(1){
104
                if(button1_read()){
105

    
106
                        for(i=0;i<17;i++){
107
                                buzzer_set_val(i);
108
                                delay_ms(100);
109
                        }
110
                        
111
                        buzzer_off();
112
                        
113
                        motor1_set(1, 255);
114
                        motor2_set(1, 255);
115
                        
116
                        delay_ms(3000);
117
                        
118
                        motor1_set(1, 200);
119
                        
120
                        delay_ms(1000);
121
                        motor1_set(0, 255);
122
                        motor2_set(0, 255);
123
                        
124
                        delay_ms(3000);
125
                        motors_off();
126
                }
127
                if(button2_read()){
128
                        orb_enable();
129
                        orb1_set_color(RED);
130
                        delay_ms(500);
131
                        orb2_set_color(GREEN);
132
                        delay_ms(500);
133
                        orb1_set_color(YELLOW);
134
                        delay_ms(500);
135
                        orb2_set_color(CYAN);
136
                        delay_ms(500);
137
                        orb1_set_color(WHITE);
138
                        delay_ms(500);
139
                        orb2_set_color(WHITE);
140
                        delay_ms(500);
141
                        orb_disable();
142
                        
143
                }
144
        
145
        }
146
}
147

    
148
void reset_test() {
149

    
150
    dragonfly_init(ORB|SERIAL);
151
    
152
    delay_ms(1000);
153
    usb_puti((int)DDRE);
154
    
155
    orb_set_color(RED);
156
    delay_ms(1000);
157
    
158
    orb_set_color(GREEN);
159
    delay_ms(1000);
160
    
161
    DDRE |= 0x80;
162
    
163
    reset();
164
    
165
    /*
166
    alternate implelmentation using external interrupts
167
    maintains register values on reset
168
    
169
    sei();
170
    EIMSK |= 0x80;
171
    EICRB |= 0xC0;
172
    DDRE |= 0x80;
173
    PORTE &= 0x7F;
174
    PORTE |= 0x80;
175
    */
176
    
177
    /*
178
    should not reach here
179
    */
180
    
181
    orb_set_color(BLUE);
182
    delay_ms(1000);
183
}
184

    
185
void ring_buffer_tester (void) {
186

    
187
        dragonfly_init(ALL_ON & ~ORB);
188
        orb_disable();
189

    
190
        RING_BUFFER_NEW(ring_buffer, 12, int, buffer);
191
        RING_BUFFER_INIT(buffer, 12);
192
        RING_BUFFER_CLEAR(buffer);
193
        
194
        for(int i=0;i<10;i++)
195
                RING_BUFFER_ADD(buffer, 0);
196
        
197
        int x;
198
        for(int i = 0; i < 100; i++) {
199
        
200
                RING_BUFFER_REMOVE(buffer, x);
201
                
202
                RING_BUFFER_ADD(buffer, i);
203
                
204
                usb_puti(i-x);
205
                usb_putc(' ');
206
        
207
        }
208
        
209
        usb_puts("\n\rfull? " );
210
        usb_puti(RING_BUFFER_FULL(buffer));
211
        
212
        while(!RING_BUFFER_FULL(buffer))
213
                RING_BUFFER_ADD(buffer, 0);
214
        
215
        usb_puts("\n\rfilling... full? " );
216
        usb_puti(RING_BUFFER_FULL(buffer));
217
        
218
        usb_puts("\n\rempty? " );
219
        usb_puti(RING_BUFFER_EMPTY(buffer));
220
        usb_puts("\n\rclearing... empty? ");
221
        RING_BUFFER_CLEAR(buffer);
222
        usb_puti(RING_BUFFER_EMPTY(buffer));
223
        
224
        usb_puts("\n\r");
225
        
226
        
227
}
228

    
229
#define WL_BAUD BAUD115200
230
//serial -- XBEE
231
//serial1 -- USB
232

    
233
void wl_send_test(void) {
234

    
235
        int i;
236
        
237
        usb_init();                //WIRED
238
        xbee_init();        //WIRELESS
239
        
240
        orb_init();
241
        sei();
242
        
243
        while(1) {
244
        
245
                for(i = 32; i <= 126; i++) {
246
                        
247
                        if(i%4) {
248
                                orb1_set(255, 0, 0);
249
                        }
250
                        else {
251
                                orb1_set(0,0,0);
252
                        }
253
                        
254
                        usb_putc(i);                //wired
255
                        xbee_putc(i);                //wireless
256
                        delay_ms(100);
257
        
258
                }
259

    
260
        }
261

    
262
        return;
263
}
264

    
265
void wl_send_packet_test(void) {
266

    
267
        int i;
268
        
269
        usb_init();                //WIRED
270
        xbee_init();        //WIRELESS
271
        
272
        orb_init();
273
        sei();
274
        
275
        while(1) {
276
        
277
                for(i = 65; i <= 122; i++) {
278
                        usb_putc(i);                //wired
279
                        xbee_putc(i);                //wireless
280
      //delay_ms(100);
281
                }
282
    
283
    delay_ms(1000);
284

    
285
        }
286

    
287
        return;
288
}
289

    
290
volatile char c;
291
volatile char haveNew = 0;
292

    
293

    
294
void wl_receive_test(void) {
295

    
296

    
297
        usb_init();
298
        xbee_init();
299
        orb_init();
300
        
301
        
302
        c = '.';
303
        
304
  xbee_putc('r');
305
        
306
        
307
        UCSR1B |= _BV(RXCIE);
308
        UCSR0B |= _BV(RXCIE);
309
        sei();
310
        
311
        orb1_set(255, 0, 0);                //blue
312

    
313
        
314
        while(1)         {
315
        
316
                if(haveNew) {
317
                        xbee_putc(c);
318
                        haveNew = 0;
319
                }
320
        }
321
        
322
        orb1_set(0, 0, 255);                //green
323
        
324
        while(1);
325

    
326
}
327
/*
328
ISR(USART1_RX_vect) {
329
        
330
        c = UDR1;
331
        haveNew = 1;
332
}
333

334
ISR(USART0_RX_vect) {
335
        
336
        c = UDR0;
337
        haveNew = 1;
338
}
339
*/
340
void buzzer_test(void)
341
{
342
        sei();
343
        buzzer_init();
344
        unsigned int i = 0;
345
        
346
        while(1) {
347
                buzzer_set_val(i);
348
                if (i == 20) {
349
                        i = 0;
350
                        delay_ms(250);
351
                } else {
352
                        i++;
353
                }
354
                
355
                delay_ms(100);
356
        }
357
}
358

    
359
void adc_gain_test(void)
360
{
361
  analog_init();
362
  lcd_init();
363
  
364
  while(1)
365
  {
366
    
367
    lcd_putint(ADCH);
368
    delay_ms(100);
369
    lcd_clear_screen();
370
  }
371
  
372
  
373

    
374
}
375

    
376
void ranger_test( void )
377
{
378
        lcd_init();
379
        
380
        while(1) {
381
                lcd_clear_screen();
382
                lcd_putint(linearize_distance(read_distance(PIN_C0)));
383
                delay_ms(100);
384
        
385
        }
386

    
387
}
388

    
389

    
390
void button_test ( void) 
391
{
392
    dragonfly_init(ALL_ON);
393
    
394
    
395
    move(200,0);
396

    
397
        while(1) {
398
        
399
        
400
                if(button1_read()) {
401
                        //lcd_putchar('1');
402
                        usb_putc('1');
403
                } else if(button2_read()) {
404
                        //lcd_putchar('2');
405
                        usb_putc('2');
406
                }
407
                
408
        }
409

    
410

    
411

    
412
}
413
void motor_test (void) {
414

    
415
        motors_init();
416
        //led_init();
417
        
418
        //motor1_set(1, 255);
419
        //motor2_set(1, 255);
420
        move(200,0);
421
        
422
        delay_ms(5000);
423
        
424
        //motor1_set(0, 200);
425
        move(200,100);
426
        
427
        delay_ms(5000);
428
        
429
        //motor2_set(0, 170);
430
        move(200,0);
431
        
432
        delay_ms(5000);
433
        motors_off();
434
        //LED USER NO LONGER EXISTS
435
        //led_user(1);
436
        
437
        
438
        while(1);
439

    
440

    
441

    
442
}
443

    
444
void orb_test( void ) {
445
        int orbs[12] = { ORB_OFF, RED, ORANGE, YELLOW, LIME, GREEN, CYAN, BLUE, PINK, PURPLE, MAGENTA, WHITE };
446
        int orb_select = 0;
447
        lcd_init();
448
        orb_init();
449
        sei();
450
        orb2_set(254, 253, 252);
451
        orb1_set(251, 250, 249);
452
        while(1) {
453
        
454
                orb_set_color(orbs[orb_select]);
455
                /*orb_set1(251, 250, 249);
456
                delay_ms(2000);
457
                orb_set1(255, 1,2);
458
                delay_ms(1000);
459
                orb_set1(1, 255, 2);
460
                delay_ms(1000);
461
                orb_set1(1, 2, 255);
462
                */
463
                delay_ms(3000);
464
                
465
                orb_select++;
466
                
467
                
468
                
469
                if(orb_select == 13) {
470
                        orb_disable();
471
                        delay_ms(2000);
472
                        orb_enable();
473
                        orb_select = 0;
474
                }
475
        
476
        /*
477
                for (int i = 0; i < 256; i++) {
478
                        for (int j = 0; j < 256; j++) {
479
                                for (int k = 0; k < 256; k++) {
480
                                        orb_set(i, j, k);
481
                                }
482
                        }
483
                }
484
        */
485
        }
486
        return;
487

    
488
}
489

    
490
void servo_orb_test( void ) {
491
//        int orbs[13] = { ORB_OFF, RED, ORANGE, YELLOW, LIME, GREEN, CYAN, BLUE, PURPLE, PINK, PURPLE, MAGENTA, WHITE };
492
        int orb_select = 0;
493
        
494
        orb_init();
495
        sei();
496
        orb_set_angle(1,250);
497
        orb_set_angle(2,250);
498
        orb_set_angle(4,0);
499
        orb_set_angle(5,0);
500
        orb_set_angle(6,0);
501

    
502
        while(1) {
503
        
504
                //orb_set_color(orbs[orb_select]);
505
                
506
                orb_set_angle(0,orb_select+1);
507
        //        orb_set_angle(1,orb_select+1);
508
        //        orb_set_angle(2,orb_select+1);
509
                delay_ms(50);
510
                orb_select++;
511
                
512
                
513
                
514
                if(orb_select == 255) {
515
                        
516
                        orb_select = 0;
517
                }
518
        
519
        /*
520
                for (int i = 0; i < 256; i++) {
521
                        for (int j = 0; j < 256; j++) {
522
                                for (int k = 0; k < 256; k++) {
523
                                        orb_set(i, j, k);
524
                                }
525
                        }
526
                }
527
        */
528
        }
529
        return;
530

    
531
}
532

    
533

    
534
void lcd_test(void) {
535
        int i, j;
536
        lcd_init();
537
        
538
        for(i = 32,j = 1; i <= 126; i++) {
539
                lcd_putchar(i);
540
                delay_ms(250);
541
        if(j > 50) {
542
            lcd_clear_screen();
543
            j = 0;
544
        }
545
        j++;
546
        }
547
        
548
        
549
        return;
550
        
551
}
552

    
553
void serial_test( void ) {
554
        int i;
555
        
556
        usb_init();
557

    
558
        for(i = 32; i <= 126; i++) {
559
                usb_putc(i);
560
                delay_ms(250);
561
        }
562

    
563
        return;
564
}
565

    
566
void pullup_test()
567
{
568
        lcd_init();
569
        lcd_putstr("pullup test");
570
        delay_ms(100);
571
        
572
        digital_pull_up(PIN_A4);
573
        digital_pull_up(PIN_A5);
574
        digital_pull_up(PIN_A6);
575
        digital_pull_up(PIN_A7);
576
        while(1){
577
                lcd_clear_screen();
578
                if(!digital_input(PIN_A4))
579
                        lcd_putchar('0');
580
                else
581
                        lcd_putchar(' ');
582
                if(!digital_input(PIN_A5))
583
                        lcd_putchar('1');
584
                else
585
                        lcd_putchar(' ');
586
                if(!digital_input(PIN_A6))
587
                        lcd_putchar('2');
588
                else
589
                        lcd_putchar(' ');
590
                if(!digital_input(PIN_A7))
591
                        lcd_putchar('3');
592
                else
593
                        lcd_putchar(' ');
594
                delay_ms(100);
595
        }
596
}
597

    
598
void batt_test()
599
{
600
        lcd_init();
601
  usb_init();
602

    
603
        analog_init();
604

    
605
        while(1){
606
    usb_puti(battery8());
607
    usb_putc(' ');
608
                delay_ms(10000);
609
        }
610
}
611

    
612

    
613
void analog_test(void){
614
  //int i;
615
  analog_init();
616
  usb_init();
617
  range_init();
618
  usb_puts(" information:\n");
619
  while(1){
620
    printAllBoms();
621
    /*for(i=0;i<16;i++){
622
      digital_output(MONK0,i&1);
623
      digital_output(MONK1, (i>>1)&1);
624
      digital_output(MONK2, (i>>2)&1);
625
      digital_output(MONK3, (i>>3)&1);
626
      usb_puts("Bom ");
627
      usb_puti(i);
628
      usb_puts(": ");
629
      usb_puti(analog8(MONKI));
630
      usb_puts("\n\r");
631
    }*/
632
  
633
    /*for(i=1;i<8;i++){
634
      usb_puts("Analog Ext ");
635
      usb_puti(i);
636
      usb_puts(":  ");
637
      usb_puti(analog8(i));
638
      usb_puts("\n\r");
639
    }
640
    
641
    usb_puts("IR1 val: ");
642
    usb_puti(read_distance(IR1));
643
    usb_puts("\n\rIR2 val: ");
644
    usb_puti(read_distance(IR2));
645
    usb_puts("\n\rIR3 val: ");
646
    usb_puti(read_distance(IR3));
647
    usb_puts("\n\rIR4 val: ");
648
    usb_puti(read_distance(IR4));
649
    usb_puts("\n\rIR5 val: ");
650
    usb_puti(read_distance(IR5));
651
    */
652
    delay_ms(2000);
653
  }
654
}
655

    
656
void dio_test()
657
{
658
        while(1)
659
        {
660
                digital_output(_PIN_E5,1);
661
                delay_ms(1000);
662
                digital_output(_PIN_E5,0);
663
                delay_ms(1000);
664
        }
665
}
666

    
667
void rtc_test_pulse() {
668
        usb_putc('s');
669
}
670

    
671
void rtc_test() {
672
        sei();
673
        usb_init();
674
        usb_putc('a');
675
        rtc_init(HALF_SECOND, &rtc_test_pulse);
676
}
677

    
678
#define RECEIVE 1
679

    
680
#define MY_ADDR (RECEIVE == 1 ? 0x01 : 0x02)
681
#define TARGET_ADDR (RECEIVE == 1 ? 0x02 : 0x01)
682

    
683
void i2c_test() {
684
  char c = 0;
685
  char i = 0;
686
  
687
  sei();
688
  i2c_init(MY_ADDR);
689
  usb_init();
690

    
691
  usb_putc('5');
692
  delay_ms(1000);
693
  
694
  while(1) {
695
    if (RECEIVE) {
696
      while(c != 'z') {
697
        if(!i2c_getc(&c)) {
698
          usb_putc(c);
699
          usb_putc(' ');
700
        }
701
      }
702
    } else {
703
    while(i < 26) {
704
      if(!i2c_putc(TARGET_ADDR, i + 0x61))
705
        i++;
706
      }
707
    }
708
  
709
    delay_ms(1000);
710
  
711
    if (!RECEIVE) {
712
      while(c != 'z') {
713
        if(!i2c_getc(&c)) {
714
          usb_putc(c);
715
          usb_putc(' ');
716
        }
717
      }
718
    } else {
719
      while(i < 26) {
720
        if(!i2c_putc(TARGET_ADDR, i + 0x61))
721
          i++;
722
      }
723
    }
724
    
725
    c = 0;
726
    i = 0;
727
  }
728
  while(1);
729
}