Subversion Repositories Projects

Rev

Rev 379 | Rev 385 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 379 Rev 383
Line 235... Line 235...
235
        if (variometer == 0) {
235
        if (variometer == 0) {
236
                write_char_xy(x, y, 0xbb); // plain line
236
                write_char_xy(x, y, 0xbb); // plain line
237
        } else if (variometer > 0) { // gain height
237
        } else if (variometer > 0) { // gain height
238
                switch (variometer / 5){
238
                switch (variometer / 5){
239
                        case 0:
239
                        case 0:
240
                                write_char_xy(x, y, 0xba); // smallest arrow up
240
                                //write_char_xy(x, y, 0xba); // smallest arrow up
-
 
241
                                write_char_xy(x, y, 0x70); // one arrow up
241
                                break;
242
                                break;
242
                        case 1:
243
                        case 1:
243
                                write_char_xy(x, y, 0xb9); // small arrow up
244
                                //write_char_xy(x, y, 0xb9); // small arrow up
-
 
245
                                write_char_xy(x, y, 0x71); // two arrows up
244
                                break;
246
                                break;
245
                        case 2:
247
                        case 2:
246
                                write_char_xy(x, y, 0xb8); // large arrow up
248
                                //write_char_xy(x, y, 0xb8); // large arrow up
-
 
249
                                write_char_xy(x, y, 0x72); // three arrows up
247
                                break;
250
                                break;
248
                        default:
251
                        default:
249
                                write_char_xy(x, y, 0xb7); // largest arrow up
252
                                //write_char_xy(x, y, 0xb7); // largest arrow up
-
 
253
                                write_char_xy(x, y, 0x73); // three black arrows up
250
                }
254
                }
251
        } else { // sink
255
        } else { // sink
252
                switch (variometer / -5){
256
                switch (variometer / -5){
253
                        case 0:
257
                        case 0:
254
                                write_char_xy(x, y, 0xbc); // smallest arrow down
258
                                //write_char_xy(x, y, 0xbc); // smallest arrow down
-
 
259
                                write_char_xy(x, y, 0x77); // one arrow down
255
                                break;
260
                                break;
256
                        case 1:
261
                        case 1:
257
                                write_char_xy(x, y, 0xbd); // small arrow down
262
                                //write_char_xy(x, y, 0xbd); // small arrow down
-
 
263
                                write_char_xy(x, y, 0x76); // two arrows down
258
                                break;
264
                                break;
259
                        case 2:
265
                        case 2:
260
                                write_char_xy(x, y, 0xbe); // large arrow down
266
                                //write_char_xy(x, y, 0xbe); // large arrow down
-
 
267
                                write_char_xy(x, y, 0x75); // three arrows down
261
                                break;
268
                                break;
262
                        default:
269
                        default:
263
                                write_char_xy(x, y, 0xbf); // largest arrow down
270
                                //write_char_xy(x, y, 0xbf); // largest arrow down
-
 
271
                                write_char_xy(x, y, 0x74); // three black arrows down
264
                }
272
                }
265
        }
273
        }
266
}
274
}
Line 267... Line 275...
267
 
275
 
Line 382... Line 390...
382
/**
390
/**
383
 * helper function for menu updating
391
 * helper function for menu updating
384
 */
392
 */
385
void config_menu_drawings(uint8_t chosen) {
393
void config_menu_drawings(uint8_t chosen) {
386
    // clear prevoius _cursor_
394
    // clear prevoius _cursor_
387
    write_ascii_string(3, (chosen + 6) % 7, " ");
395
    write_ascii_string(3, (chosen + 5) % 8, " ");
388
    // draw current _cursor_
396
    // draw current _cursor_
389
    write_ascii_string(3, chosen + 6, ">");
397
    write_ascii_string(3, chosen + 5, ">");
390
    if (COSD_FLAGS & COSD_FLAG_HUD) {
398
    if (COSD_FLAGS & COSD_FLAG_HUD) {
391
        write_ascii_string_pgm(23, 6, ON);
399
        write_ascii_string_pgm(23, 5, ON);
392
    } else {
400
    } else {
393
                write_ascii_string_pgm(23, 6, OFF);
401
                write_ascii_string_pgm(23, 5, OFF);
394
    }
402
    }
395
    if (COSD_FLAGS & COSD_FLAG_ARTHORIZON) {
403
    if (COSD_FLAGS & COSD_FLAG_ARTHORIZON) {
-
 
404
        write_ascii_string_pgm(23, 6, ON);
-
 
405
    } else {
-
 
406
        write_ascii_string_pgm(23, 6, OFF);
-
 
407
    }
-
 
408
        if (COSD_FLAGS & COSD_FLAG_BIGVARIO) {
396
        write_ascii_string_pgm(23, 7, ON);
409
        write_ascii_string_pgm(23, 7, ON);
397
    } else {
410
    } else {
398
        write_ascii_string_pgm(23, 7, OFF);
411
                write_ascii_string_pgm(23, 7, OFF);
399
    }
412
    }
400
        if (COSD_FLAGS & COSD_FLAG_STATS) {
413
        if (COSD_FLAGS & COSD_FLAG_STATS) {
401
        write_ascii_string_pgm(23, 8, ON);
414
        write_ascii_string_pgm(23, 8, ON);
402
    } else {
415
    } else {
403
        write_ascii_string_pgm(23, 8, OFF);
416
        write_ascii_string_pgm(23, 8, OFF);
Line 411... Line 424...
411
 
424
 
412
/**
425
/**
413
 * some sort of clicking response in the menu
426
 * some sort of clicking response in the menu
414
 */
427
 */
415
void config_menu_doclick(uint8_t chosen, char** menu) {
428
void config_menu_doclick(uint8_t chosen, char** menu) {
416
        write_ascii_string(4, chosen + 6, "DONE              ");
429
        write_ascii_string(4, chosen + 5, "DONE              ");
417
        _delay_ms(1000);
430
        _delay_ms(1000);
418
        write_ascii_string(4, chosen + 6, menu[chosen]);
431
        write_ascii_string(4, chosen + 5, menu[chosen]);
Line 419... Line 432...
419
}
432
}
420
 
433
 
421
/**
434
/**
Line 426... Line 439...
426
        cli();
439
        cli();
Line 427... Line 440...
427
 
440
 
428
        // clear screen
441
        // clear screen
Line 429... Line 442...
429
        clear();
442
        clear();
430
       
443
       
-
 
444
        char* menu[9] = {"Full HUD",
431
        char* menu[8] = {"Full HUD",
445
                                         "Art.Horizon in HUD",
432
                                         "Art.Horizon in HUD",
446
                                         "Big Vario bar",
433
                                         "Statistics",
447
                                         "Statistics",
434
                                         "Warnings",    // TODO: do it!
448
                                         "Warnings",    // TODO: do it!
435
                                         "Reset uptime",
449
                                         "Reset uptime",
Line 442... Line 456...
442
        write_ascii_string(6,  2, "C-OSD Config Menu");
456
        write_ascii_string(6,  2, "C-OSD Config Menu");
Line 443... Line 457...
443
 
457
 
444
        // wait a bit before doing stuff so user has chance to release button
458
        // wait a bit before doing stuff so user has chance to release button
Line -... Line 459...
-
 
459
        _delay_ms(250);
445
        _delay_ms(250);
460
 
446
 
461
        write_ascii_string(4,  5, menu[0]);
447
        write_ascii_string(4,  6, menu[0]);
462
        write_ascii_string(4,  6, menu[1]);
448
        write_ascii_string(4,  7, menu[1]);
463
        write_ascii_string(4,  7, menu[2]);
449
        write_ascii_string(4,  8, menu[2]);
464
        write_ascii_string(4,  8, menu[3]);
450
        write_ascii_string(4,  9, menu[3]);
465
        write_ascii_string(4,  9, menu[4]);
451
        write_ascii_string(4, 10, menu[4]);
466
        write_ascii_string(4, 10, menu[5]);
452
        write_ascii_string(4, 11, menu[5]);
467
        write_ascii_string(4, 11, menu[6]);
Line 453... Line 468...
453
        write_ascii_string(4, 12, menu[6]);
468
        write_ascii_string(4, 12, menu[7]);
Line 454... Line 469...
454
        write_ascii_string(4, 13, menu[7]);
469
        write_ascii_string(4, 13, menu[8]);
455
 
470
 
456
        config_menu_drawings(chosen);
471
        config_menu_drawings(chosen);
457
 
472
 
458
        while (inmenu) {
473
        while (inmenu) {
459
                        if (s2_pressed()) {
474
                        if (s2_pressed()) {
460
                                write_ascii_string(3,  chosen+6, " ");
475
                                write_ascii_string(3,  chosen+5, " ");
461
                                chosen = (chosen + 1) % 8;
476
                                chosen = (chosen + 1) % 9;
462
                                write_ascii_string(3,  chosen+6, ">");
477
                                write_ascii_string(3,  chosen+5, ">");
463
                                _delay_ms(500);
478
                                _delay_ms(500);
Line 469... Line 484...
469
                                                break;
484
                                                break;
470
                                        case 1:         // art horizon
485
                                        case 1:         // art horizon
471
                                                COSD_FLAGS ^= COSD_FLAG_ARTHORIZON;
486
                                                COSD_FLAGS ^= COSD_FLAG_ARTHORIZON;
472
                                                config_menu_drawings(chosen);
487
                                                config_menu_drawings(chosen);
473
                                                break;
488
                                                break;
-
 
489
                                        case 2:         // big vario
-
 
490
                                                COSD_FLAGS ^= COSD_FLAG_BIGVARIO;
-
 
491
                                                config_menu_drawings(chosen);
-
 
492
                                                break;
474
                                        case 2:         // statistics
493
                                        case 3:         // statistics
475
                                                COSD_FLAGS ^= COSD_FLAG_STATS;
494
                                                COSD_FLAGS ^= COSD_FLAG_STATS;
476
                                                config_menu_drawings(chosen);
495
                                                config_menu_drawings(chosen);
477
                                                break;
496
                                                break;
478
                                        case 3:         // warnings
497
                                        case 4:         // warnings
479
                                                COSD_FLAGS ^= COSD_FLAG_WARNINGS;
498
                                                COSD_FLAGS ^= COSD_FLAG_WARNINGS;
480
                                                config_menu_drawings(chosen);
499
                                                config_menu_drawings(chosen);
481
                                                break;
500
                                                break;
482
                                        case 4:         // reset uptime
501
                                        case 5:         // reset uptime
483
                                                uptime = 0;
502
                                                uptime = 0;
484
                                                config_menu_doclick(chosen, menu);
503
                                                config_menu_doclick(chosen, menu);
485
                                                break;
504
                                                break;
486
                                        case 5:         // re-request OSD data
505
                                        case 6:         // re-request OSD data
487
                                                // request OSD Data from NC every 100ms
506
                                                // request OSD Data from NC every 100ms
488
                                                usart1_request_mk_data(1, 'o', 100);
507
                                                usart1_request_mk_data(1, 'o', 100);
489
                                                config_menu_doclick(chosen, menu);
508
                                                config_menu_doclick(chosen, menu);
490
                                                break;
509
                                                break;
491
                                        case 6:         // disable debug data
510
                                        case 7:         // disable debug data
492
                                                // disable sending of debug data
511
                                                // disable sending of debug data
493
                                                // may result in smoother ddata display
512
                                                // may result in smoother ddata display
494
                                                usart1_request_mk_data(0, 'd', 0);
513
                                                usart1_request_mk_data(0, 'd', 0);
495
                                                config_menu_doclick(chosen, menu);
514
                                                config_menu_doclick(chosen, menu);
496
                                                break;
515
                                                break;
497
                                        case 7:         // exit
516
                                        case 8:         // exit
498
                                                inmenu = 0;
517
                                                inmenu = 0;
499
                                                break;
518
                                                break;
500
                                }
519
                                }
501
                                _delay_ms(250);
520
                                _delay_ms(250);
502
                        }
521
                        }
Line 519... Line 538...
519
int main(void) {
538
int main(void) {
520
    // set up FLAGS, compiler should flatten this one
539
    // set up FLAGS, compiler should flatten this one
521
    COSD_FLAGS = (NTSC << 0);
540
    COSD_FLAGS = (NTSC << 0);
522
    COSD_FLAGS |= (HUD << 1);
541
    COSD_FLAGS |= (HUD << 1);
523
    COSD_FLAGS |= (ARTHORIZON << 2);
542
    COSD_FLAGS |= (ARTHORIZON << 2);
-
 
543
        COSD_FLAGS |= (BIGVARIO << 3);
524
        COSD_FLAGS |= (STATS << 3);
544
        COSD_FLAGS |= (STATS << 4);
525
    COSD_FLAGS |= (WARNINGS << 4);
545
    COSD_FLAGS |= (WARNINGS << 5);
Line 526... Line 546...
526
 
546
 
527
    // set up Atmega162 Ports
547
    // set up Atmega162 Ports
528
    DDRA |= (1 << PA1); // PA1 output (/CS)
548
    DDRA |= (1 << PA1); // PA1 output (/CS)
529
    MAX_CS_HIGH
549
    MAX_CS_HIGH
Line 679... Line 699...
679
        // write icons at init or after menu/mode-switch
699
        // write icons at init or after menu/mode-switch
680
        if (!(COSD_FLAGS & COSD_ICONS_WRITTEN) && (COSD_FLAGS & COSD_FLAG_HUD)) {
700
        if (!(COSD_FLAGS & COSD_ICONS_WRITTEN) && (COSD_FLAGS & COSD_FLAG_HUD)) {
681
            write_char_xy(5, top_line, 203); // km/h
701
            write_char_xy(5, top_line, 203); // km/h
682
            write_char_xy(10, top_line, 202); // RC-transmitter
702
            write_char_xy(10, top_line, 202); // RC-transmitter
683
            write_char_xy(16, top_line, 208); // degree symbol
703
            write_char_xy(16, top_line, 208); // degree symbol
684
            write_char_xy(27, top_line, 204); // small meters m
704
            write_char_xy(27, top_line, 204); // small meters m height
-
 
705
                        write_char_xy(20, top_line+1, 0xb0); // left circle
-
 
706
                        write_char_xy(22, top_line+1, 0xb2); // right circle
-
 
707
                        write_char_xy(27, top_line+1, 204); // small meters m home
685
            //write_ascii_string(6, bottom_line, "V"); // voltage
708
            //write_ascii_string(6, bottom_line, "V"); // voltage
686
            write_char_xy(14, bottom_line, 209); // on clock
709
            write_char_xy(14, bottom_line, 209); // on clock
687
            write_char_xy(22, bottom_line, 210); // fly clock
710
            write_char_xy(22, bottom_line, 210); // fly clock
688
            write_char_xy(26, bottom_line, 200); // sat1
711
            write_char_xy(26, bottom_line, 200); // sat1
689
            write_char_xy(27, bottom_line, 201); // sat2
712
            write_char_xy(27, bottom_line, 201); // sat2
Line 703... Line 726...
703
                    write_number_s(12, 7, debugData.Analog[10]);// RC Signal
726
                    write_number_s(12, 7, debugData.Analog[10]);// RC Signal
704
                                        write_number_s(12, 8, debugData.Analog[11]);// Gyro compass*/
727
                                        write_number_s(12, 8, debugData.Analog[11]);// Gyro compass*/
705
                } else if (rxd_buffer[2] == 'O') { // NC OSD Data
728
                } else if (rxd_buffer[2] == 'O') { // NC OSD Data
706
                    Decode64();
729
                    Decode64();
707
                    naviData = *((NaviData_t*) pRxData);
730
                    naviData = *((NaviData_t*) pRxData);
708
 
731
                                       
709
                                        draw_big_variometer(27, 8, naviData.Variometer);
-
 
710
 
-
 
711
                    // first line
732
                    // first line
712
                    write_ndigit_number_u(2, top_line, (uint16_t) (((uint32_t) naviData.GroundSpeed * (uint32_t)9) / (uint32_t)250), 100, 0);
733
                    write_ndigit_number_u(2, top_line, (uint16_t) (((uint32_t) naviData.GroundSpeed * (uint32_t)9) / (uint32_t)250), 100, 0);
Line 713... Line 734...
713
 
734
 
714
                    write_ndigit_number_u(7, top_line, naviData.RC_Quality, 100, 0);
735
                    write_ndigit_number_u(7, top_line, naviData.RC_Quality, 100, 0);
Line 723... Line 744...
723
 
744
 
Line 724... Line 745...
724
                    write_ndigit_number_u(13, top_line, naviData.CompassHeading, 100, 0);
745
                    write_ndigit_number_u(13, top_line, naviData.CompassHeading, 100, 0);
Line 725... Line 746...
725
 
746
 
Line 726... Line 747...
726
                    write_ascii_string(17, top_line, directions[heading_conv(naviData.CompassHeading)]);
747
                    write_ascii_string(17, top_line, directions[heading_conv(naviData.CompassHeading)]);
727
                                       
748
                                       
728
                                        draw_variometer(20, top_line, naviData.Variometer);
749
                                        draw_variometer(21, top_line, naviData.Variometer);
729
 
750
 
Line 740... Line 761...
740
                    // seccond line
761
                    // seccond line
741
                    draw_compass(11, top_line + 1, naviData.CompassHeading);
762
                    draw_compass(11, top_line + 1, naviData.CompassHeading);
Line 742... Line 763...
742
 
763
 
743
                    // TODO: verify correctness
764
                    // TODO: verify correctness
744
                    uint16_t heading_home = (naviData.HomePositionDeviation.Bearing + 360 - naviData.CompassHeading) % 360;
765
                    uint16_t heading_home = (naviData.HomePositionDeviation.Bearing + 360 - naviData.CompassHeading) % 360;
745
                    //write_char_xy(27, top_line + 1, arrowdir[heading_conv(heading_home)]);
766
                    //write_char_xy(21, top_line + 1, arrowdir[heading_conv(heading_home)]);
746
                                        // finer resolution, 0xa0 is first character and we add the index 0 <= index < 16
767
                                        // finer resolution, 0xa0 is first character and we add the index 0 <= index < 16
Line 747... Line 768...
747
                                        write_char_xy(27, top_line + 1, 0xa0 + heading_fine_conv(heading_home));
768
                                        write_char_xy(21, top_line + 1, 0xa0 + heading_fine_conv(heading_home));
Line 748... Line 769...
748
 
769
 
749
                    write_ndigit_number_u(24, top_line + 1, naviData.HomePositionDeviation.Distance / 10, 100, 0);
770
                    write_ndigit_number_u(24, top_line + 1, naviData.HomePositionDeviation.Distance / 10, 100, 0);
Line 778... Line 799...
778
                                write_char_xy(22, 9, 210); // fly clock
799
                                write_char_xy(22, 9, 210); // fly clock
779
                                                } else if (COSD_FLAGS & COSD_FLAG_ARTHORIZON) { // if no stats there is space horizon
800
                                                } else if (COSD_FLAGS & COSD_FLAG_ARTHORIZON) { // if no stats there is space horizon
780
                            draw_artificial_horizon(top_line + 2, bottom_line - 1, naviData.AngleNick, naviData.AngleRoll);
801
                            draw_artificial_horizon(top_line + 2, bottom_line - 1, naviData.AngleNick, naviData.AngleRoll);
781
                        }
802
                        }
782
                    }
803
                    }
-
 
804
                                        if (COSD_FLAGS & COSD_FLAG_BIGVARIO) {
-
 
805
                                                draw_big_variometer(27, 8, naviData.Variometer);
-
 
806
                                        }
Line 783... Line 807...
783
 
807
 
784
                    // bottom line
808
                    // bottom line
785
                                        write_ndigit_number_u_10th(2, bottom_line, naviData.UBat, 100, 0);
809
                                        write_ndigit_number_u_10th(2, bottom_line, naviData.UBat, 100, 0);
786
                    if (naviData.UBat <= UBAT_WRN && last_UBat > UBAT_WRN) {
810
                    if (naviData.UBat <= UBAT_WRN && last_UBat > UBAT_WRN) {