📄 mca25.lst
字号:
506:io/mca25.c **** state = 100;
507:io/mca25.c **** else
508:io/mca25.c **** state = 0;
509:io/mca25.c **** }
510:io/mca25.c **** break;
511:io/mca25.c ****
512:io/mca25.c **** default:
513:io/mca25.c **** break;
514:io/mca25.c **** } //case
515:io/mca25.c **** //softuart_put_uint16(skip_count);
516:io/mca25.c **** }else if (mca25_mux_buffer[0] == 0x23){
517:io/mca25.c **** //channel 0x23
518:io/mca25.c **** mca25_handle_channel_x23();
519:io/mca25.c **** }else if (mca25_mux_buffer[0] == 0x03){
520:io/mca25.c **** //channel 0x03
521:io/mca25.c **** mca25_handle_channel_x03();
522:io/mca25.c **** }else{
523:io/mca25.c **** for(unsigned char f=0; f<40; f++){
524:io/mca25.c **** softuart_put_uint8(f);
525:io/mca25.c **** softuart_putc('=');
526:io/mca25.c **** softuart_put_uint8(mca25_buffer[f]);
527:io/mca25.c **** softuart_putnewline();
528:io/mca25.c ****
529:io/mca25.c **** }softuart_putnewline();softuart_putnewline();//softuart_putc('.');
530:io/mca25.c **** /*softuart_put_uint8(mca25_buffer[1]);
531:io/mca25.c **** softuart_put_uint8(mca25_buffer[2]);
532:io/mca25.c **** softuart_put_uint8(mca25_buffer[3]);
533:io/mca25.c **** softuart_put_uint8(mca25_buffer[4]);
534:io/mca25.c **** softuart_putnewline();*/
535:io/mca25.c **** }
536:io/mca25.c **** }
537:io/mca25.c **** //preview image #i has been grabbed.
538:io/mca25.c **** #if MCA25_DEBUG
539:io/mca25.c **** softuart_putc('-');
540:io/mca25.c **** #endif
541:io/mca25.c **** }
542:io/mca25.c **** #if MCA25_DEBUG
543:io/mca25.c **** softuart_putnewline();
544:io/mca25.c **** softuart_puts_progmem("CAM : preview images done!");
545:io/mca25.c **** softuart_putnewline();
546:io/mca25.c **** softuart_puts_progmem("CAM : sending JPG grab request... ");
547:io/mca25.c **** softuart_putnewline();
548:io/mca25.c **** #endif
549:io/mca25.c ****
550:io/mca25.c **** // send capture start cmd:
551:io/mca25.c **** mca25_puts_progmem2(MCA25_START_JPG, sizeof(MCA25_START_JPG));
552:io/mca25.c **** #if MCA25_DEBUG
553:io/mca25.c **** //softuart_puts_progmem("done!");
554:io/mca25.c **** //softuart_putnewline();
555:io/mca25.c **** #endif
556:io/mca25.c ****
557:io/mca25.c **** //switch light off:
558:io/mca25.c **** MPF10_DISABLE();
559:io/mca25.c ****
560:io/mca25.c **** //cam has transferred no image byte yet -> 0
561:io/mca25.c **** mca25_datapos=0;
562:io/mca25.c **** mca25_pic_state = MCA25_PIC_STATE_PREVIEW_DONE; //preview done!
563:io/mca25.c **** return 1;
564:io/mca25.c **** }
565:io/mca25.c ****
566:io/mca25.c **** //configure mca25
567:io/mca25.c **** unsigned char mca25_configure(void){
568:io/mca25.c **** unsigned char state=0;
569:io/mca25.c **** //unsigned char res = 0;
570:io/mca25.c **** int skip_count=0;
571:io/mca25.c ****
572:io/mca25.c **** mca25_pic_state = MCA25_PIC_STATE_IDLE;
573:io/mca25.c ****
574:io/mca25.c **** if (mca25_ready == 0){
575:io/mca25.c **** //cam not initialised or missing!
576:io/mca25.c **** #if MCA25_DEBUG
577:io/mca25.c **** softuart_puts_progmem("CAM : cam not initialised or missing -> abort.");
578:io/mca25.c **** softuart_putnewline();
579:io/mca25.c **** #endif
580:io/mca25.c **** return 0;
581:io/mca25.c **** }
582:io/mca25.c ****
583:io/mca25.c **** #if MCA25_DEBUG
584:io/mca25.c **** softuart_puts_progmem("CAM : configure...");
585:io/mca25.c **** #endif
586:io/mca25.c ****
587:io/mca25.c **** //config cam:
588:io/mca25.c **** mca25_puts_progmem2(MCA25_CONFIG_640x480, sizeof(MCA25_CONFIG_640x480));
589:io/mca25.c ****
590:io/mca25.c **** while (state != 100){
591:io/mca25.c **** if( ! mca25_read_mux_packet(mca25_buffer,0)){
592:io/mca25.c **** #if MCA25_DEBUG
593:io/mca25.c **** softuart_puts_progmem("TIMEOUT! (MUX2)");
594:io/mca25.c **** softuart_putnewline();
595:io/mca25.c **** #endif
596:io/mca25.c ****
597:io/mca25.c **** //cam error, disable !
598:io/mca25.c **** mca25_ready = 0;
599:io/mca25.c **** return 0; //read failed -> exit!;
600:io/mca25.c **** }
601:io/mca25.c ****
602:io/mca25.c **** if (mca25_mux_buffer[0] == 0x83){
603:io/mca25.c **** if (mca25_mux_buffer[1] == 0xEF){//UIH packet
604:io/mca25.c **** switch (state){
605:io/mca25.c **** case 0:
606:io/mca25.c **** case 1:
607:io/mca25.c **** // wait for cam ACK:
608:io/mca25.c **** // [F9 83 EF 07 A0 00 03 C7 F9
609:io/mca25.c **** //if (string_compare_progmem_plen("\xF9\x83\xEF\x07\xA0\x00\x03\xC7\xF9", mca25_buffer)){
610:io/mca25.c **** if (string_compare_progmem_plen("\xA0\x00\x03", mca25_buffer)){
611:io/mca25.c **** // request camera info:
612:io/mca25.c **** // [F9 81 EF 2F 83 00 17 42 00 14 78 2D 62 74 2F 63
613:io/mca25.c **** // 61 6D 65 72 61 2D 69 6E 66 6F 00 90 F9]
614:io/mca25.c **** mca25_puts_progmem("\xF9\x81\xEF\x2F\x83\x00\x17\x42\x00\x14\x78\x2D\x62\x74\x2F\x63\x61\x6D
615:io/mca25.c **** state = 2;
616:io/mca25.c **** }
617:io/mca25.c **** break;
618:io/mca25.c **** case 2:
619:io/mca25.c **** // ignore camera info ...
620:io/mca25.c **** // new version: read how many config bytes cam wants to send
621:io/mca25.c **** // in order to decide when we can continue!
622:io/mca25.c **** // thanks to jesper for this idea ;) [now works with brand new, unused cams!]
623:io/mca25.c **** skip_count = ((int)mca25_mux_buffer[3]<<8) + mca25_mux_buffer[4];
624:io/mca25.c **** skip_count -= (mca25_mux_buffer[2]>>1);
625:io/mca25.c **** state = 3;
626:io/mca25.c ****
627:io/mca25.c **** break;
628:io/mca25.c ****
629:io/mca25.c **** case 3:
630:io/mca25.c **** //now skip the necessary amount of bytes:
631:io/mca25.c **** skip_count -= (mca25_mux_buffer[2]>>1);
632:io/mca25.c ****
633:io/mca25.c **** //finished !
634:io/mca25.c **** if (skip_count <= 0)
635:io/mca25.c **** state = 100;
636:io/mca25.c **** break;
637:io/mca25.c ****
638:io/mca25.c **** default:
639:io/mca25.c **** break;
640:io/mca25.c **** }
641:io/mca25.c **** }
642:io/mca25.c **** }else if (mca25_mux_buffer[0] == 0x23){
643:io/mca25.c **** //channel 0x23
644:io/mca25.c **** mca25_handle_channel_x23();
645:io/mca25.c **** }else if (mca25_mux_buffer[0] == 0x03){
646:io/mca25.c **** //channel 0x03
647:io/mca25.c **** mca25_handle_channel_x03();
648:io/mca25.c **** }else{
649:io/mca25.c **** softuart_putc('i');
650:io/mca25.c **** }
651:io/mca25.c **** }
652:io/mca25.c **** #if MCA25_DEBUG
653:io/mca25.c **** softuart_puts_progmem("done!");
654:io/mca25.c **** softuart_putnewline();
655:io/mca25.c **** #endif
656:io/mca25.c **** return 1;
657:io/mca25.c **** }
658:io/mca25.c ****
659:io/mca25.c ****
660:io/mca25.c **** //initialise
661:io/mca25.c **** void mca25_init(void){
662:io/mca25.c **** //start with rev016
663:io/mca25.c **** mca25_is_rev017 = 0;
664:io/mca25.c **** mca25_allocated_timeout = 0;
665:io/mca25.c **** mca25_pic_state = MCA25_PIC_STATE_IDLE;
666:io/mca25.c ****
667:io/mca25.c **** mca25_init_cam();
668:io/mca25.c **** }
669:io/mca25.c ****
670:io/mca25.c **** //initialise webcam, return 0 if failed!
671:io/mca25.c **** unsigned char mca25_init_cam(void){
672:io/mca25.c **** unsigned char state=0;
673:io/mca25.c **** #if MCA25_DEBUG
674:io/mca25.c **** //unsigned char old_state=0xFF;
675:io/mca25.c **** #endif
676:io/mca25.c ****
677:io/mca25.c **** //mark cam as not ready:
678:io/mca25.c **** mca25_ready = 0;
679:io/mca25.c ****
680:io/mca25.c **** //make camreset pin output
681:io/mca25.c **** MCA25_RESET_PORT_DIR |= (1<<MCA25_RESET_PIN);
682:io/mca25.c **** PORTD |= (1<<1); //UART TX = output
683:io/mca25.c **** PORTD &= ~(1<<0); //UART RX = input
684:io/mca25.c ****
685:io/mca25.c **** MCA25_RESET_LO();
686:io/mca25.c ****
687:io/mca25.c **** //init uart
688:io/mca25.c **** if (mca25_is_rev017)
689:io/mca25.c **** mca25_uart_init_19200();
690:io/mca25.c **** else
691:io/mca25.c **** mca25_uart_init_9600();
692:io/mca25.c ****
693:io/mca25.c **** //reset cam:
694:io/mca25.c **** MCA25_RESET_LO();
695:io/mca25.c **** _delay_ms(50);
696:io/mca25.c **** MCA25_RESET_HI();
697:io/mca25.c ****
698:io/mca25.c **** #if MCA25_DEBUG
699:io/mca25.c **** softuart_puts_progmem("CAM : reset");
700:io/mca25.c **** softuart_putnewline();
701:io/mca25.c **** #endif
702:io/mca25.c **** /*
703:io/mca25.c **** //WARNING: will block whole server if no cam connected !! -> DO NOT USE!
704:io/mca25.c ****
705:io/mca25.c **** //detect mca25 revision
706:io/mca25.c **** //KTY 105 016 sends always at 9600 baud
707:io/mca25.c **** //KTY 105 017 sends AT at 9600 and then switches to 19200 !!!
708:io/mca25.c **** unsigned int count;
709:io/mca25.c **** for (state = 0; state <4; state++){
710:io/mca25.c **** count=0;
711:io/mca25.c **** while((PIND & (1<<0))){}
712:io/mca25.c **** while(!(PIND & (1<<0))){ count++; }
713:io/mca25.c **** softuart_put_uint16(count);
714:io/mca25.c **** softuart_putnewline();
715:io/mca25.c **** }
716:io/mca25.c ****
717:io/mca25.c ****
718:io/mca25.c **** #if MCA25_DEBUG
719:io/mca25.c **** softuart_puts_progmem("CAM : detected rev");
720:io/mca25.c **** if (count > 50)
721:io/mca25.c **** softuart_puts_progmem("016");
722:io/mca25.c **** else
723:io/mca25.c **** softuart_puts_progmem("017");
724:io/mca25.c **** softuart_putnewline();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -