Rev 1834 | Rev 1837 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed
| Rev 1834 | Rev 1835 | ||
|---|---|---|---|
| Line 45... | Line 45... | ||
| 45 | uint8_t sendComplete; |
45 | uint8_t sendComplete; |
| 46 | // pronto params |
46 | // pronto params |
| 47 | uint8_t sendingPronto; |
47 | uint8_t sendingPronto; |
| 48 | uint8_t onceSeqLen; |
48 | uint8_t onceSeqLen; |
| 49 | uint8_t repSeqLen; |
49 | uint8_t repSeqLen; |
| 50 | uint8_t numberOfRepeats; |
- | |
| 51 | } irTxChannel[IR_SUPPORTED_NUM_CHANNELS]; |
50 | } irTxChannel[IR_SUPPORTED_NUM_CHANNELS]; |
| 52 | #endif |
51 | #endif |
| 53 | 52 | ||
| 54 | uint16_t buf[IR_SUPPORTED_NUM_CHANNELS][MAX_NR_TIMES]; |
53 | uint16_t buf[IR_SUPPORTED_NUM_CHANNELS][MAX_NR_TIMES]; |
| 55 | 54 | ||
| Line 597... | Line 596... | ||
| 597 | case sns_irTransceive_STATE_IDLE: |
596 | case sns_irTransceive_STATE_IDLE: |
| 598 | /* transmission is started when a command is received on can */ |
597 | /* transmission is started when a command is received on can */ |
| 599 | break; |
598 | break; |
| 600 | 599 | ||
| 601 | case sns_irTransceive_STATE_START_TRANSMIT: |
600 | case sns_irTransceive_STATE_START_TRANSMIT: |
| - | 601 | { |
|
| 602 | if (expandProtocol(irTxChannel[channel].txbuf, &irTxChannel[channel].txlen, &irTxChannel[channel].proto) == IR_OK) |
602 | if (expandProtocol(irTxChannel[channel].txbuf, &irTxChannel[channel].txlen, &irTxChannel[channel].proto) == IR_OK) |
| 603 | { |
603 | { |
| 604 | IrTransceiver_Transmit(channel, irTxChannel[channel].txbuf, 0, irTxChannel[channel].txlen); |
604 | IrTransceiver_Transmit(channel, irTxChannel[channel].txbuf, 0, irTxChannel[channel].txlen); |
| 605 | irTxChannel[channel].state = sns_irTransceive_STATE_TRANSMITTING; |
605 | irTxChannel[channel].state = sns_irTransceive_STATE_TRANSMITTING; |
| 606 | } |
606 | } |
| 607 | else |
607 | else |
| 608 | { |
608 | { |
| 609 | irTxChannel[channel].state = sns_irTransceive_STATE_IDLE; |
609 | irTxChannel[channel].state = sns_irTransceive_STATE_IDLE; |
| 610 | } |
610 | } |
| 611 | break; |
611 | break; |
| 612 | 612 | } |
|
| 613 | case sns_irTransceive_STATE_START_TRANSMIT_PRONTO: |
613 | case sns_irTransceive_STATE_START_TRANSMIT_PRONTO: |
| - | 614 | { |
|
| - | 615 | /* Start IR transmission. */ |
|
| 614 | IrTransceiver_Transmit(channel, irTxChannel[channel].txbuf, 0, irTxChannel[channel]. |
616 | IrTransceiver_Transmit(channel, irTxChannel[channel].txbuf, 0, irTxChannel[channel].onceSeqLen - 1); |
| - | 617 | ||
| 615 |
|
618 | /* Enter transmitting state. */ |
| 616 | irTxChannel[channel].sendingPronto = TRUE; |
619 | irTxChannel[channel].sendingPronto = TRUE; |
| - | 620 | irTxChannel[channel].state = sns_irTransceive_STATE_TRANSMITTING; |
|
| - | 621 | break; |
|
| - | 622 | } |
|
| - | 623 | case sns_irTransceive_STATE_PRONTO_REPEAT: |
|
| - | 624 | { |
|
| - | 625 | /* Check if done. */ |
|
| - | 626 | if (irTxChannel[channel].repeatCount >= irTxChannel[channel].proto.repeats && irTxChannel[channel].proto.repeats != 0xFF) |
|
| - | 627 | { |
|
| - | 628 | irTxChannel[channel].state = sns_irTransceive_STATE_START_IDLE; |
|
| 617 | break; |
629 | break; |
| - | 630 | } |
|
| - | 631 | ||
| - | 632 | if (irTxChannel[channel].repeatCount < 255) { |
|
| - | 633 | irTxChannel[channel].repeatCount++; |
|
| - | 634 | } |
|
| 618 | 635 | ||
| - | 636 | // repeat sequence exists? |
|
| - | 637 | if (irTxChannel[channel].repSeqLen != 0) { |
|
| - | 638 | // use repeat seq |
|
| - | 639 | uint16_t offset = ((uint16_t)irTxChannel[channel].onceSeqLen); |
|
| - | 640 | // don't transmit last passive. last passive handled by timer |
|
| - | 641 | IrTransceiver_Transmit(channel, &irTxChannel[channel].txbuf[offset], 0, ((uint16_t)irTxChannel[channel].repSeqLen) - 1); |
|
| - | 642 | } |
|
| - | 643 | else { |
|
| - | 644 | // use once seq |
|
| - | 645 | // don't transmit last passive. last passive handled by timer |
|
| - | 646 | IrTransceiver_Transmit(channel, irTxChannel[channel].txbuf, 0, irTxChannel[channel].txlen - 1); |
|
| - | 647 | } |
|
| - | 648 | irTxChannel[channel].state = sns_irTransceive_STATE_TRANSMITTING; |
|
| - | 649 | } |
|
| 619 | case sns_irTransceive_STATE_TRANSMITTING: |
650 | case sns_irTransceive_STATE_TRANSMITTING: |
| - | 651 | { |
|
| 620 | if (irTxChannel[channel].sendComplete == TRUE) |
652 | if (irTxChannel[channel].sendComplete == TRUE) |
| 621 | { |
653 | { |
| 622 | cli(); |
654 | cli(); |
| 623 | irTxChannel[channel].sendComplete = FALSE; |
655 | irTxChannel[channel].sendComplete = FALSE; |
| 624 | sei(); |
656 | sei(); |
| - | 657 | ||
| - | 658 | if (irTxChannel[channel].sendingPronto) |
|
| - | 659 | { |
|
| - | 660 | if(irTxChannel[channel].repeatCount == 0 || irTxChannel[channel].repSeqLen == 0) |
|
| - | 661 | { |
|
| - | 662 | // use last passive time as timeout |
|
| - | 663 | uint16_t lastPasTime = irTxChannel[channel].txbuf[irTxChannel[channel].onceSeqLen - 1] / 1000; |
|
| - | 664 | Timer_SetTimeout(irTxChannel[channel].timerNum, lastPasTime==0 ? 1 : lastPasTime, TimerTypeOneShot, 0); |
|
| - | 665 | } |
|
| - | 666 | else |
|
| - | 667 | { |
|
| - | 668 | // use last passive time as timeout |
|
| - | 669 | uint16_t lastPasTime = irTxChannel[channel].txbuf[irTxChannel[channel].txlen - 1] / 1000; |
|
| - | 670 | Timer_SetTimeout(irTxChannel[channel].timerNum, lastPasTime==0 ? 1 : lastPasTime, TimerTypeOneShot, 0); |
|
| - | 671 | } |
|
| - | 672 | irTxChannel[channel].state = sns_irTransceive_STATE_PAUSING; |
|
| - | 673 | } |
|
| - | 674 | else |
|
| - | 675 | { |
|
| 625 | irTxChannel[channel].state = sns_irTransceive_STATE_START_PAUSE; |
676 | irTxChannel[channel].state = sns_irTransceive_STATE_START_PAUSE; |
| - | 677 | } |
|
| 626 | } |
678 | } |
| 627 | break; |
679 | break; |
| 628 | 680 | } |
|
| 629 | case sns_irTransceive_STATE_START_PAUSE: |
681 | case sns_irTransceive_STATE_START_PAUSE: |
| - | 682 | { |
|
| 630 | if (irTxChannel[channel].repeatCount < irTxChannel[channel].proto.repeats) |
683 | if (irTxChannel[channel].repeatCount < irTxChannel[channel].proto.repeats) |
| 631 | { |
684 | { |
| 632 | irTxChannel[channel].repeatCount++; |
685 | irTxChannel[channel].repeatCount++; |
| 633 | } |
686 | } |
| 634 | 687 | ||
| 635 | Timer_SetTimeout(irTxChannel[channel].timerNum, irTxChannel[channel].proto.timeout, TimerTypeOneShot, 0); |
688 | Timer_SetTimeout(irTxChannel[channel].timerNum, irTxChannel[channel].proto.timeout, TimerTypeOneShot, 0); |
| 636 | 689 | ||
| 637 | if (irTxChannel[channel].proto.framecnt != 255) |
690 | if (irTxChannel[channel].proto.framecnt != 255) |
| 638 | { |
691 | { |
| 639 | irTxChannel[channel].proto.framecnt++; |
692 | irTxChannel[channel].proto.framecnt++; |
| 640 | } |
693 | } |
| 641 | 694 | ||
| 642 | irTxChannel[channel].state = sns_irTransceive_STATE_PAUSING; |
695 | irTxChannel[channel].state = sns_irTransceive_STATE_PAUSING; |
| 643 | break; |
696 | break; |
| 644 | 697 | } |
|
| 645 | case sns_irTransceive_STATE_PAUSING: |
698 | case sns_irTransceive_STATE_PAUSING: |
| 646 | if (Timer_Expired(irTxChannel[channel].timerNum)) |
- | |
| 647 | { |
699 | { |
| 648 |
|
700 | if (irTxChannel[channel].sendingPronto) |
| 649 | irTxChannel[channel].state = sns_irTransceive_STATE_START_TRANSMIT_PRONTO; |
- | |
| 650 |
|
701 | { |
| - | 702 | if (Timer_Expired(irTxChannel[channel].timerNum)) |
|
| 651 |
|
703 | { |
| 652 | irTxChannel[channel].state = |
704 | irTxChannel[channel].state = sns_irTransceive_STATE_PRONTO_REPEAT; |
| 653 | } |
705 | } |
| - | 706 | break; |
|
| - | 707 | } |
|
| - | 708 | ||
| - | 709 | if (Timer_Expired(irTxChannel[channel].timerNum)) |
|
| - | 710 | { |
|
| - | 711 | irTxChannel[channel].state = sns_irTransceive_STATE_START_TRANSMIT; |
|
| 654 | } |
712 | } |
| 655 | 713 | ||
| 656 | /* transmission is stopped when such command is recevied on can */ |
714 | /* transmission is stopped when such command is recevied on can */ |
| 657 | if (irTxChannel[channel].stopSend == TRUE && irTxChannel[channel].repeatCount >= irTxChannel[channel].proto.repeats) |
715 | if (irTxChannel[channel].stopSend == TRUE && irTxChannel[channel].repeatCount >= irTxChannel[channel].proto.repeats) |
| 658 | { |
716 | { |
| 659 | //TODO maybe send message on can for status? to confirm stopped sending, ready for new command |
717 | //TODO maybe send message on can for status? to confirm stopped sending, ready for new command |
| 660 | irTxChannel[channel].state = sns_irTransceive_STATE_START_IDLE; |
718 | irTxChannel[channel].state = sns_irTransceive_STATE_START_IDLE; |
| 661 | } |
719 | } |
| 662 | - | ||
| 663 | if (irTxChannel[channel].sendingPronto && irTxChannel[channel].repeatCount >= irTxChannel[channel].proto.repeats) |
- | |
| 664 | { |
- | |
| 665 | irTxChannel[channel].state = sns_irTransceive_STATE_START_IDLE; |
- | |
| 666 | } |
- | |
| 667 | - | ||
| 668 | break; |
720 | break; |
| 669 | 721 | } |
|
| 670 | case sns_irTransceive_STATE_START_IDLE: |
722 | case sns_irTransceive_STATE_START_IDLE: |
| 671 | irTxChannel[channel].stopSend = FALSE; |
723 | irTxChannel[channel].stopSend = FALSE; |
| 672 | irTxChannel[channel].repeatCount = 0; |
724 | irTxChannel[channel].repeatCount = 0; |
| 673 | irTxChannel[channel].proto.framecnt = 0; |
725 | irTxChannel[channel].proto.framecnt = 0; |
| 674 | irTxChannel[channel].sendingPronto = FALSE; |
726 | irTxChannel[channel].sendingPronto = FALSE; |
| 675 | - | ||
| 676 | irTxChannel[channel].state = sns_irTransceive_STATE_IDLE; |
727 | irTxChannel[channel].state = sns_irTransceive_STATE_IDLE; |
| 677 | break; |
728 | break; |
| 678 | 729 | ||
| 679 | default: |
730 | default: |
| 680 | break; |
731 | break; |
| 681 | } |
732 | } |
| 682 | #endif |
733 | #endif |
| 683 | 734 | ||
| 684 | } |
735 | } |
| 685 | } |
736 | } |
| 686 | 737 | ||
| 687 | 738 | ||
| 688 | /* Handle incoming CAN data */ |
739 | /* Handle incoming CAN data */ |
| 689 | void sns_irTransceive_HandleMessage(StdCan_Msg_t *rxMsg) |
740 | void sns_irTransceive_HandleMessage(StdCan_Msg_t *rxMsg) |
| 690 | { |
741 | { |
| - | 742 | /* Sanity check. */ |
|
| 691 | if ( |
743 | if (StdCan_Ret_class(rxMsg->Header) != CAN_MODULE_CLASS_SNS || |
| 692 | StdCan_Ret_direction(rxMsg->Header) |
744 | StdCan_Ret_direction(rxMsg->Header) != DIRECTIONFLAG_TO_OWNER || |
| 693 | rxMsg->Header.ModuleType |
745 | rxMsg->Header.ModuleType != CAN_MODULE_TYPE_SNS_IRTRANSCEIVE || |
| 694 | rxMsg->Header.ModuleId |
746 | rxMsg->Header.ModuleId != sns_irTransceive_ID) return; |
| - | 747 | ||
| - | 748 | /* Get IR channel. */ |
|
| - | 749 | uint8_t channel = rxMsg->Data[0] >> 4; |
|
| 695 | { |
750 | |
| 696 | switch (rxMsg->Header.Command) |
751 | switch (rxMsg->Header.Command) |
| 697 | { |
752 | { |
| 698 | #if IR_TX_ENABLE==1 |
753 | #if IR_TX_ENABLE==1 |
| 699 |
|
754 | case CAN_MODULE_CMD_PHYSICAL_IR: |
| 700 | uint8_t channel = rxMsg->Data[0]>>4; |
- | |
| - | 755 | { |
|
| 701 | if ((0xf&rxMsg->Data[0]) == CAN_MODULE_ENUM_PHYSICAL_IR_STATUS_PRESSED && channel < IR_SUPPORTED_NUM_CHANNELS) |
756 | if ((0xf&rxMsg->Data[0]) == CAN_MODULE_ENUM_PHYSICAL_IR_STATUS_PRESSED && channel < IR_SUPPORTED_NUM_CHANNELS) |
| 702 | { |
757 | { |
| 703 | if (irTxChannel[channel].state == sns_irTransceive_STATE_IDLE) |
758 | if (irTxChannel[channel].state == sns_irTransceive_STATE_IDLE) |
| 704 | { |
759 | { |
| 705 | irTxChannel[channel].proto.protocol = rxMsg->Data[1]; |
760 | irTxChannel[channel].proto.protocol = rxMsg->Data[1]; |
| Line 726... | Line 781... | ||
| 726 | } |
781 | } |
| 727 | 782 | ||
| 728 | #if sns_irTransceive_PRONTO_SUPPORT==1 |
783 | #if sns_irTransceive_PRONTO_SUPPORT==1 |
| 729 | /* TODO: add struct which stores pronto info: |
784 | /* TODO: add struct which stores pronto info: |
| 730 | channel, pronto receive state, buffer length of once burst pairs, buffer length of repeat burst pairs */ |
785 | channel, pronto receive state, buffer length of once burst pairs, buffer length of repeat burst pairs */ |
| 731 |
|
786 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOSTART: |
| - | 787 | { |
|
| - | 788 | /* Sanity check. */ |
|
| - | 789 | if (channel >= IR_SUPPORTED_NUM_CHANNELS) break; |
|
| - | 790 | if (irTxChannel[channel].state != sns_irTransceive_STATE_IDLE) break; |
|
| 732 | 791 | ||
| 733 |
|
792 | /* Check if format is supported. */ |
| 734 | if (channel >= IR_SUPPORTED_NUM_CHANNELS) { |
- | |
| 735 | // invalid channel |
- | |
| 736 | break; |
- | |
| 737 | } |
- | |
| 738 | - | ||
| 739 | printf("TxSt=%03d", irTxChannel[channel].state); |
- | |
| 740 | - | ||
| 741 | if (irTxChannel[channel].state != sns_irTransceive_STATE_IDLE) { |
- | |
| 742 | // busy |
- | |
| 743 | break; |
- | |
| 744 | } |
- | |
| 745 | - | ||
| 746 | /* TODO: check pronto state, response is different if already sending data */ |
- | |
| 747 |
|
793 | if ((uint16_t)(rxMsg->Data[0] & 0x0F) << 8 | (uint16_t)(rxMsg->Data[1]) != 0) break; |
| 748 | if (format != 0) { |
- | |
| 749 | // unsupported format |
- | |
| 750 | break; |
- | |
| 751 | } |
- | |
| 752 | - | ||
| 753 | irTxChannel[channel].state = sns_irTransceive_STATE_PREPARING_PRONTO; |
- | |
| 754 | irTxChannel[channel].txlen = 0; |
- | |
| 755 | 794 | ||
| - | 795 | /* Extract received data. */ |
|
| 756 | //irTxChannel[channel].modfreq = rxMsg->Data[2]; |
796 | //irTxChannel[channel].modfreq = rxMsg->Data[2]; |
| 757 | irTxChannel[channel].modfreq = (((F_CPU/2000)/IR_NEC_F_MOD) -1); // for testing |
797 | irTxChannel[channel].modfreq = (((F_CPU/2000)/IR_NEC_F_MOD) -1); // for testing |
| 758 | irTxChannel[channel].proto.modfreq = (((F_CPU/2000)/IR_NEC_F_MOD) -1); |
798 | irTxChannel[channel].proto.modfreq = (((F_CPU/2000)/IR_NEC_F_MOD) -1); |
| 759 | irTxChannel[channel].proto.timeout = 100; |
- | |
| 760 |
|
799 | // convert lenghts to bytes |
| 761 | - | ||
| 762 |
|
800 | irTxChannel[channel].onceSeqLen = 2*((((uint16_t)rxMsg->Data[4]) << 8) | (((uint16_t)rxMsg->Data[5]) << 0)); |
| 763 |
|
801 | irTxChannel[channel].repSeqLen = 2*((((uint16_t)rxMsg->Data[6]) << 8) | (((uint16_t)rxMsg->Data[7]) << 0)); |
| 764 | 802 | ||
| - | 803 | /* Enter prepering pronto state and clear transmit buffer. */ |
|
| - | 804 | irTxChannel[channel].state = sns_irTransceive_STATE_PREPARING_PRONTO; |
|
| - | 805 | irTxChannel[channel].txlen = 0; |
|
| 765 | activeChannel = channel; |
806 | activeChannel = channel; |
| 766 | 807 | ||
| 767 | /* TODO: Send response frame */ |
808 | /* TODO: Send response frame */ |
| 768 | break; |
809 | break; |
| 769 | } |
810 | } |
| Line 792... | Line 833... | ||
| 792 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA11: /* Fall through */ |
833 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA11: /* Fall through */ |
| 793 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA12: /* Fall through */ |
834 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA12: /* Fall through */ |
| 794 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA13: /* Fall through */ |
835 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA13: /* Fall through */ |
| 795 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA14: /* Fall through */ |
836 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA14: /* Fall through */ |
| 796 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA15: /* Fall through */ |
837 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA15: /* Fall through */ |
| 797 |
|
838 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA16: |
| 798 | if (activeChannel>=IR_SUPPORTED_NUM_CHANNELS) { |
- | |
| 799 | break; |
- | |
| 800 |
|
839 | { |
| - | 840 | // unexpected CAN msg, out of order |
|
| 801 |
|
841 | if (irTxChannel[activeChannel].state != sns_irTransceive_STATE_PREPARING_PRONTO) break; |
| 802 | // invalid state |
- | |
| 803 | break; |
- | |
| 804 | } |
842 | |
| 805 | if ((uint16_t)irTxChannel[activeChannel].txlen+(uint16_t)rxMsg->Length >= MAX_NR_TIMES) { |
843 | if ((uint16_t)irTxChannel[activeChannel].txlen + (uint16_t)rxMsg->Length >= MAX_NR_TIMES) { |
| 806 | // too long |
844 | // too long |
| - | 845 | irTxChannel[activeChannel].state = sns_irTransceive_STATE_IDLE; |
|
| 807 | break; |
846 | break; |
| 808 | } |
847 | } |
| 809 | for (uint8_t i=0; i<rxMsg->Length; i++) { |
848 | for (uint8_t i=0; i < rxMsg->Length; i++) { |
| 810 | // TODO: (109 * 1) / (4.145146 MHz) = 27, fix formula with modfreq |
849 | // TODO: (109 * 1) / (4.145146 MHz) = 27, fix formula with modfreq |
| 811 | irTxChannel[activeChannel].txbuf[irTxChannel[activeChannel].txlen++] = 27*rxMsg->Data[i]; |
850 | irTxChannel[activeChannel].txbuf[irTxChannel[activeChannel].txlen++] = 27 * rxMsg->Data[i]; |
| 812 | } |
851 | } |
| 813 | break; |
852 | break; |
| 814 | } |
853 | } |
| 815 | - | ||
| 816 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND1: /* Fall through */ |
854 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND1: /* Fall through */ |
| 817 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND2: /* Fall through */ |
855 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND2: /* Fall through */ |
| 818 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND3: /* Fall through */ |
856 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND3: /* Fall through */ |
| 819 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND4: /* Fall through */ |
857 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND4: /* Fall through */ |
| 820 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND5: /* Fall through */ |
858 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND5: /* Fall through */ |
| Line 827... | Line 865... | ||
| 827 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND12: /* Fall through */ |
865 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND12: /* Fall through */ |
| 828 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND13: /* Fall through */ |
866 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND13: /* Fall through */ |
| 829 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND14: /* Fall through */ |
867 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND14: /* Fall through */ |
| 830 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND15: /* Fall through */ |
868 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND15: /* Fall through */ |
| 831 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND16: /* Fall through */ |
869 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND16: /* Fall through */ |
| 832 |
|
870 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND17: |
| 833 | if (activeChannel>=IR_SUPPORTED_NUM_CHANNELS) { |
- | |
| 834 | break; |
- | |
| 835 |
|
871 | { |
| - | 872 | // unexpected CAN msg, out of order |
|
| 836 | if (irTxChannel[activeChannel].state!=sns_irTransceive_STATE_PREPARING_PRONTO) { |
873 | if (irTxChannel[activeChannel].state != sns_irTransceive_STATE_PREPARING_PRONTO) { |
| 837 |
|
874 | //printf("StERR:%02d", irTxChannel[activeChannel].state); |
| 838 | break; |
875 | break; |
| 839 | } |
876 | } |
| - | 877 | ||
| 840 | if ((uint16_t)irTxChannel[activeChannel].txlen + (uint16_t)(rxMsg->Length-1) >= MAX_NR_TIMES) { |
878 | if ((uint16_t)irTxChannel[activeChannel].txlen + (uint16_t)(rxMsg->Length - 1) >= MAX_NR_TIMES) { |
| 841 | // too long |
879 | // too long |
| - | 880 | irTxChannel[activeChannel].state = sns_irTransceive_STATE_IDLE; |
|
| 842 | break; |
881 | break; |
| 843 | } |
882 | } |
| - | 883 | ||
| - | 884 | uint16_t nrBytesRemaining = (((uint16_t)irTxChannel[activeChannel].onceSeqLen + (uint16_t)irTxChannel[activeChannel].repSeqLen)) - irTxChannel[activeChannel].txlen; |
|
| - | 885 | //printf("TXLEN:%02d", irTxChannel[activeChannel].txlen); |
|
| - | 886 | //printf("BYTES:%02d", nrBytesRemaining); |
|
| 844 | // end packet does not always contain data, last byte is reserved |
887 | // end packet does not always contain data, last byte is reserved |
| 845 |
|
888 | for (uint8_t i=0; i < nrBytesRemaining; i++) { |
| 846 | // TODO: (109 * 1) / (4.145146 MHz) = 27, fix formula with modfreq |
889 | // TODO: (109 * 1) / (4.145146 MHz) = 27, fix formula with modfreq |
| 847 | irTxChannel[activeChannel].txbuf[irTxChannel[activeChannel].txlen++] = 27*rxMsg->Data[i]; |
890 | irTxChannel[activeChannel].txbuf[irTxChannel[activeChannel].txlen++] = 27 * rxMsg->Data[i]; |
| 848 | } |
891 | } |
| - | 892 | ||
| - | 893 | // sanity check |
|
| - | 894 | if(irTxChannel[activeChannel].txlen != (((uint16_t)irTxChannel[activeChannel].onceSeqLen + (uint16_t)irTxChannel[activeChannel].repSeqLen))) |
|
| - | 895 | { |
|
| - | 896 | irTxChannel[activeChannel].state = sns_irTransceive_STATE_IDLE; |
|
| - | 897 | break; |
|
| - | 898 | } |
|
| - | 899 | ||
| 849 | // last byte tells what to do with IR data (nr of repeats) |
900 | // last byte tells what to do with IR data (nr of repeats) |
| 850 |
|
901 | irTxChannel[activeChannel].proto.repeats = rxMsg->Data[rxMsg->Length-1]; |
| - | 902 | irTxChannel[activeChannel].proto.timeout = 1; |
|
| 851 | 903 | ||
| 852 | // send |
904 | // send |
| 853 | irTxChannel[activeChannel].state = sns_irTransceive_STATE_START_TRANSMIT_PRONTO; |
905 | irTxChannel[activeChannel].state = sns_irTransceive_STATE_START_TRANSMIT_PRONTO; |
| 854 | 906 | ||
| 855 | irTxChannel[activeChannel].sendingPronto = TRUE; |
- | |
| 856 | - | ||
| 857 | /* TODO: Send response frame */ |
907 | /* TODO: Send response frame */ |
| 858 | - | ||
| 859 | break; |
908 | break; |
| 860 | } |
909 | } |
| 861 | 910 | ||
| 862 | /* TODO: In IR state machine add sending a response frame when ir stops sending, also implement pronto repeat */ |
911 | /* TODO: In IR state machine add sending a response frame when ir stops sending, also implement pronto repeat */ |
| 863 | #endif |
912 | #endif |
| 864 | #endif |
913 | #endif |
| 865 | 914 | ||
| 866 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRCONFIG: { |
915 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRCONFIG: { |
| 867 | uint8_t channel = rxMsg->Data[0]>>4; |
- | |
| 868 | uint8_t config = rxMsg->Data[0] & 0x0f; |
916 | uint8_t config = rxMsg->Data[0] & 0x0f; |
| 869 | uint8_t power = rxMsg->Data[1]>>6; |
917 | uint8_t power = rxMsg->Data[1]>>6; |
| 870 | uint8_t modfreq = rxMsg->Data[2]; |
918 | uint8_t modfreq = rxMsg->Data[2]; |
| 871 | 919 | ||
| 872 | sns_irTransceive_setConfig(channel, config, power, modfreq); |
920 | sns_irTransceive_setConfig(channel, config, power, modfreq); |
| 873 | 921 | ||
| 874 | #ifdef sns_irTransceive_USEEEPROM |
922 | #ifdef sns_irTransceive_USEEEPROM |
| 875 | if (channel < IR_SUPPORTED_NUM_CHANNELS && config <= CAN_MODULE_ENUM_IRTRANSCEIVE_IRCONFIG_DIRECTION_RECEIVE && power < 4) |
923 | if (channel < IR_SUPPORTED_NUM_CHANNELS && config <= CAN_MODULE_ENUM_IRTRANSCEIVE_IRCONFIG_DIRECTION_RECEIVE && power < 4) |
| 876 | { |
924 | { |
| 877 | switch (channel) |
925 | switch (channel) |
| 878 | { |
926 | { |
| Line 889... | Line 937... | ||
| 889 | case 2: |
937 | case 2: |
| 890 | eeprom_write_byte_crc(EEDATA.ch2_config, config, WITHOUT_CRC); |
938 | eeprom_write_byte_crc(EEDATA.ch2_config, config, WITHOUT_CRC); |
| 891 | eeprom_write_byte_crc(EEDATA.ch2_txpower, power, WITHOUT_CRC); |
939 | eeprom_write_byte_crc(EEDATA.ch2_txpower, power, WITHOUT_CRC); |
| 892 | eeprom_write_byte_crc(EEDATA.ch2_modfreq, modfreq, WITHOUT_CRC); |
940 | eeprom_write_byte_crc(EEDATA.ch2_modfreq, modfreq, WITHOUT_CRC); |
| 893 | break; |
941 | break; |
| 894 | default: |
942 | default: |
| 895 | break; |
943 | break; |
| 896 | } |
944 | } |
| 897 | EEDATA_UPDATE_CRC; |
945 | EEDATA_UPDATE_CRC; |
| 898 | } |
946 | } |
| 899 | #endif |
947 | #endif |
| 900 | break; |
948 | break; |
| 901 | } |
949 | } |
| 902 | 950 | ||
| 903 | default: |
951 | default: |
| 904 | break; |
952 | break; |
| 905 | 953 | ||
| 906 | } |
954 | } |
| 907 | } |
955 | |
| 908 | } |
956 | } |
| 909 | 957 | ||
| 910 | void sns_irTransceive_List(uint8_t ModuleSequenceNumber) |
958 | void sns_irTransceive_List(uint8_t ModuleSequenceNumber) |
| 911 | { |
959 | { |
| 912 | StdCan_Msg_t txMsg; |
960 | StdCan_Msg_t txMsg; |