Rev 1829 | Rev 1832 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed
| Rev 1829 | Rev 1830 | ||
|---|---|---|---|
| Line 41... | Line 41... | ||
| 41 | uint8_t timerNum; |
41 | uint8_t timerNum; |
| 42 | uint8_t repeatCount; |
42 | uint8_t repeatCount; |
| 43 | Ir_Protocol_Data_t proto; |
43 | Ir_Protocol_Data_t proto; |
| 44 | uint8_t stopSend; |
44 | uint8_t stopSend; |
| 45 | uint8_t sendComplete; |
45 | uint8_t sendComplete; |
| - | 46 | // pronto params |
|
| - | 47 | uint8_t onceSeqLen; |
|
| - | 48 | uint8_t repSeqLen; |
|
| - | 49 | uint8_t numberOfRepeats; |
|
| 46 | } irTxChannel[IR_SUPPORTED_NUM_CHANNELS]; |
50 | } irTxChannel[IR_SUPPORTED_NUM_CHANNELS]; |
| 47 | #endif |
51 | #endif |
| 48 | 52 | ||
| 49 | uint16_t buf[IR_SUPPORTED_NUM_CHANNELS][MAX_NR_TIMES]; |
53 | uint16_t buf[IR_SUPPORTED_NUM_CHANNELS][MAX_NR_TIMES]; |
| 50 | 54 | ||
| Line 94... | Line 98... | ||
| 94 | #endif |
98 | #endif |
| 95 | 99 | ||
| 96 | #define sns_irTransceive_BaseFrq (4145146ULL) |
100 | #define sns_irTransceive_BaseFrq (4145146ULL) |
| 97 | 101 | ||
| 98 | #ifndef sns_irTransceive_PRONTO_SUPPORT |
102 | #ifndef sns_irTransceive_PRONTO_SUPPORT |
| 99 | #define sns_irTransceive_PRONTO_SUPPORT |
103 | #define sns_irTransceive_PRONTO_SUPPORT 1 |
| 100 | #endif |
104 | #endif |
| 101 | 105 | ||
| 102 | #if sns_irTransceive_PRONTO_SUPPORT==1 |
106 | #if sns_irTransceive_PRONTO_SUPPORT==1 |
| 103 | volatile uint32_t sns_irTransceive_LastPronto=0; |
107 | volatile uint32_t sns_irTransceive_LastPronto=0; |
| - | 108 | static uint8_t activeChannel = 0; |
|
| 104 | #define sns_irTransceive_MAXTIMING (16*1000) |
109 | #define sns_irTransceive_MAXTIMING (16*1000) |
| 105 | 110 | ||
| 106 | void send_pronto(uint16_t *buffer, uint8_t len, uint8_t channel, uint8_t modfreq) { |
111 | void send_pronto(uint16_t *buffer, uint8_t len, uint8_t channel, uint8_t modfreq) { |
| 107 | StdCan_Msg_t msg; |
112 | StdCan_Msg_t msg; |
| 108 | 113 | ||
| Line 142... | Line 147... | ||
| 142 | 147 | ||
| 143 | while (StdCan_Put(&msg) != StdCan_Ret_OK) {} |
148 | while (StdCan_Put(&msg) != StdCan_Ret_OK) {} |
| 144 | _delay_ms(1); |
149 | _delay_ms(1); |
| 145 | 150 | ||
| 146 | /* Send pronto data */ |
151 | /* Send pronto data */ |
| 147 | uint16_t divider = (1000000ULL* |
152 | uint16_t divider = ((1000000ULL*modfreq)/sns_irTransceive_BaseFrq); |
| 148 | msg.Header.Command = CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA1; |
153 | msg.Header.Command = CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA1; |
| 149 | /* Counter for buffer */ |
154 | /* Counter for buffer */ |
| 150 | uint8_t i = 0; |
155 | uint8_t i = 0; |
| 151 | /* Counter for filling can frame data */ |
156 | /* Counter for filling can frame data */ |
| 152 | uint8_t j = 0; |
157 | uint8_t j = 0; |
| Line 667... | Line 672... | ||
| 667 | if ( StdCan_Ret_class(rxMsg->Header) == CAN_MODULE_CLASS_SNS && |
672 | if ( StdCan_Ret_class(rxMsg->Header) == CAN_MODULE_CLASS_SNS && |
| 668 | StdCan_Ret_direction(rxMsg->Header) == DIRECTIONFLAG_TO_OWNER && |
673 | StdCan_Ret_direction(rxMsg->Header) == DIRECTIONFLAG_TO_OWNER && |
| 669 | rxMsg->Header.ModuleType == CAN_MODULE_TYPE_SNS_IRTRANSCEIVE && |
674 | rxMsg->Header.ModuleType == CAN_MODULE_TYPE_SNS_IRTRANSCEIVE && |
| 670 | rxMsg->Header.ModuleId == sns_irTransceive_ID) |
675 | rxMsg->Header.ModuleId == sns_irTransceive_ID) |
| 671 | { |
676 | { |
| 672 | uint8_t channel; |
- | |
| 673 |
|
677 | //printf("CMD= %u", rxMsg->Header.Command); |
| 674 | switch (rxMsg->Header.Command) |
678 | switch (rxMsg->Header.Command) |
| 675 | { |
679 | { |
| 676 | #if IR_TX_ENABLE==1 |
680 | #if IR_TX_ENABLE==1 |
| 677 | case CAN_MODULE_CMD_PHYSICAL_IR: |
681 | case CAN_MODULE_CMD_PHYSICAL_IR: { |
| 678 | channel = rxMsg->Data[0]>>4; |
682 | uint8_t channel = rxMsg->Data[0]>>4; |
| 679 | if ((0xf&rxMsg->Data[0]) == CAN_MODULE_ENUM_PHYSICAL_IR_STATUS_PRESSED && channel < IR_SUPPORTED_NUM_CHANNELS) |
683 | if ((0xf&rxMsg->Data[0]) == CAN_MODULE_ENUM_PHYSICAL_IR_STATUS_PRESSED && channel < IR_SUPPORTED_NUM_CHANNELS) |
| 680 | { |
684 | { |
| 681 | if (irTxChannel[channel].state == sns_irTransceive_STATE_IDLE) |
685 | if (irTxChannel[channel].state == sns_irTransceive_STATE_IDLE) |
| 682 | { |
686 | { |
| 683 | irTxChannel[channel].proto.protocol = rxMsg->Data[1]; |
687 | irTxChannel[channel].proto.protocol = rxMsg->Data[1]; |
| Line 699... | Line 703... | ||
| 699 | { |
703 | { |
| 700 | irTxChannel[channel].stopSend = TRUE; |
704 | irTxChannel[channel].stopSend = TRUE; |
| 701 | } |
705 | } |
| 702 | } |
706 | } |
| 703 | break; |
707 | break; |
| - | 708 | } |
|
| 704 | 709 | ||
| 705 | /* TODO: add struct which stores pronto info: |
710 | /* TODO: add struct which stores pronto info: |
| 706 | channel, pronto receive state, buffer length of once burst pairs, buffer length of repeat burst pairs */ |
711 | channel, pronto receive state, buffer length of once burst pairs, buffer length of repeat burst pairs */ |
| 707 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOSTART: |
712 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOSTART: { |
| - | 713 | ||
| - | 714 | uint8_t channel = rxMsg->Data[0]>>4; |
|
| - | 715 | if (channel >= IR_SUPPORTED_NUM_CHANNELS) { |
|
| - | 716 | // invalid channel |
|
| - | 717 | break; |
|
| - | 718 | } |
|
| - | 719 | ||
| - | 720 | if (irTxChannel[channel].state != sns_irTransceive_STATE_IDLE) { |
|
| - | 721 | // busy |
|
| - | 722 | break; |
|
| - | 723 | } |
|
| - | 724 | ||
| 708 | /* TODO: check pronto state, response is different if already sending data */ |
725 | /* TODO: check pronto state, response is different if already sending data */ |
| 709 |
|
726 | uint16_t format = (uint16_t)(rxMsg->Data[0] & 0x0F) << 8 | (uint16_t)(rxMsg->Data[1]); |
| - | 727 | if (format != 0) { |
|
| - | 728 | // unsupported format |
|
| - | 729 | break; |
|
| 710 | |
730 | } |
| - | 731 | ||
| 711 |
|
732 | irTxChannel[channel].state = sns_irTransceive_STATE_TRANSMIT_PREPARING_PRONTO; |
| - | 733 | ||
| 712 |
|
734 | //irTxChannel[channel].modfreq = rxMsg->Data[2]; |
| 713 |
|
735 | irTxChannel[channel].modfreq = (((F_CPU/2000)/IR_NEC_F_MOD) -1); // for testing |
| - | 736 | irTxChannel[channel].proto.modfreq = (((F_CPU/2000)/IR_NEC_F_MOD) -1); |
|
| 714 |
|
737 | irTxChannel[channel].proto.timeout = 40; |
| 715 |
|
738 | irTxChannel[channel].proto.repeats = 1; |
| - | 739 | ||
| 716 |
|
740 | irTxChannel[channel].onceSeqLen = rxMsg->Data[3]; |
| 717 |
|
741 | irTxChannel[channel].repSeqLen = rxMsg->Data[4]; |
| 718 | } |
742 | |
| - | 743 | activeChannel = channel; |
|
| 719 | 744 | ||
| 720 | /* TODO: Send response frame */ |
745 | /* TODO: Send response frame */ |
| 721 | break; |
746 | break; |
| - | 747 | } |
|
| - | 748 | ||
| 722 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOSTOP: |
749 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOSTOP: |
| 723 | /* TODO: stop sending IR */ |
750 | /* TODO: stop sending IR */ |
| 724 | 751 | ||
| 725 | /* TODO: Send response frame */ |
752 | /* TODO: Send response frame */ |
| 726 | break; |
753 | break; |
| 727 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOCONTINUE: |
754 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOCONTINUE: |
| 728 | /* TODO: reset timeout to continue sending repeat sequences */ |
755 | /* TODO: reset timeout to continue sending repeat sequences */ |
| 729 | 756 | ||
| 730 | /* TODO: Send response frame */ |
757 | /* TODO: Send response frame */ |
| 731 | break; |
758 | break; |
| - | 759 | ||
| 732 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA1: /* Fall through */ |
760 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA1: /* Fall through */ |
| 733 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA2: /* Fall through */ |
761 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA2: /* Fall through */ |
| 734 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA3: /* Fall through */ |
762 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA3: /* Fall through */ |
| 735 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA4: /* Fall through */ |
763 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA4: /* Fall through */ |
| 736 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA5: /* Fall through */ |
764 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA5: /* Fall through */ |
| Line 742... | Line 770... | ||
| 742 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA11: /* Fall through */ |
770 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA11: /* Fall through */ |
| 743 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA12: /* Fall through */ |
771 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA12: /* Fall through */ |
| 744 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA13: /* Fall through */ |
772 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA13: /* Fall through */ |
| 745 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA14: /* Fall through */ |
773 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA14: /* Fall through */ |
| 746 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA15: /* Fall through */ |
774 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA15: /* Fall through */ |
| 747 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA16: |
775 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA16: { |
| 748 | ; /* Added to avoid compilation error "a label can only be part of a statement ..." */ |
- | |
| 749 | uint8_t dataindex = rxMsg->Header.Command - CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTODATA1; |
- | |
| 750 | for (uint8_t i=0; i<length; i++) |
- | |
| 751 | { |
- | |
| 752 |
|
776 | if (activeChannel>=IR_SUPPORTED_NUM_CHANNELS) { |
| 753 | } |
- | |
| 754 | break; |
777 | break; |
| - | 778 | } |
|
| - | 779 | if (irTxChannel[activeChannel].state!=sns_irTransceive_STATE_TRANSMIT_PREPARING_PRONTO) { |
|
| - | 780 | // invalid state |
|
| - | 781 | break; |
|
| - | 782 | } |
|
| - | 783 | if ((uint16_t)irTxChannel[activeChannel].txlen+(uint16_t)rxMsg->Length >= MAX_NR_TIMES) { |
|
| - | 784 | // too long |
|
| - | 785 | break; |
|
| - | 786 | } |
|
| - | 787 | for (uint8_t i=0; i<rxMsg->Length; i++) { |
|
| - | 788 | // TODO: (109 * 1) / (4.145146 MHz) = 27, fix formula with modfreq |
|
| - | 789 | irTxChannel[activeChannel].txbuf[irTxChannel[activeChannel].txlen++] = 27*rxMsg->Data[i]; |
|
| - | 790 | } |
|
| - | 791 | break; |
|
| - | 792 | } |
|
| - | 793 | ||
| 755 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND1: /* Fall through */ |
794 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND1: /* Fall through */ |
| 756 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND2: /* Fall through */ |
795 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND2: /* Fall through */ |
| 757 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND3: /* Fall through */ |
796 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND3: /* Fall through */ |
| 758 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND4: /* Fall through */ |
797 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND4: /* Fall through */ |
| 759 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND5: /* Fall through */ |
798 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND5: /* Fall through */ |
| Line 766... | Line 805... | ||
| 766 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND12: /* Fall through */ |
805 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND12: /* Fall through */ |
| 767 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND13: /* Fall through */ |
806 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND13: /* Fall through */ |
| 768 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND14: /* Fall through */ |
807 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND14: /* Fall through */ |
| 769 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND15: /* Fall through */ |
808 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND15: /* Fall through */ |
| 770 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND16: /* Fall through */ |
809 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND16: /* Fall through */ |
| 771 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND17: |
810 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND17: { |
| - | 811 | if (activeChannel>=IR_SUPPORTED_NUM_CHANNELS) { |
|
| - | 812 | break; |
|
| - | 813 | } |
|
| - | 814 | if (irTxChannel[activeChannel].state!=sns_irTransceive_STATE_TRANSMIT_PREPARING_PRONTO) { |
|
| - | 815 | // invalid state |
|
| - | 816 | break; |
|
| - | 817 | } |
|
| - | 818 | if ((uint16_t)irTxChannel[activeChannel].txlen + (uint16_t)(rxMsg->Length-1) >= MAX_NR_TIMES) { |
|
| - | 819 | // too long |
|
| - | 820 | break; |
|
| - | 821 | } |
|
| 772 |
|
822 | // end packet does not always contain data, last byte is reserved |
| - | 823 | for (uint8_t i=0; i<rxMsg->Length-1; i++) { |
|
| - | 824 | // TODO: (109 * 1) / (4.145146 MHz) = 27, fix formula with modfreq |
|
| - | 825 | irTxChannel[activeChannel].txbuf[irTxChannel[activeChannel].txlen++] = 27*rxMsg->Data[i]; |
|
| - | 826 | } |
|
| - | 827 | // last byte tells what to do with IR data (nr of repeats) |
|
| 773 |
|
828 | irTxChannel[activeChannel].numberOfRepeats = rxMsg->Data[rxMsg->Length-1]; |
| - | 829 | ||
| - | 830 | // send |
|
| 774 |
|
831 | IrTransceiver_Transmit(activeChannel, irTxChannel[activeChannel].txbuf, 0, irTxChannel[activeChannel].txlen); |
| - | 832 | irTxChannel[activeChannel].state = sns_irTransceive_STATE_TRANSMITTING; |
|
| 775 | 833 | ||
| 776 |
|
834 | printf("SEND:%03u", irTxChannel[activeChannel].txlen); |
| 777 | 835 | ||
| 778 | /* TODO: Send response frame */ |
836 | /* TODO: Send response frame */ |
| 779 | 837 | ||
| 780 | /* TODO: start transmitt ir! */ |
- | |
| 781 | break; |
838 | break; |
| - | 839 | } |
|
| 782 | 840 | ||
| 783 | /* TODO: In IR state machine add sending a response frame when ir stops sending, also implement pronto repeat */ |
841 | /* TODO: In IR state machine add sending a response frame when ir stops sending, also implement pronto repeat */ |
| 784 | #endif |
842 | #endif |
| 785 | 843 | ||
| 786 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRCONFIG: |
844 | case CAN_MODULE_CMD_IRTRANSCEIVE_IRCONFIG: { |
| 787 | channel = rxMsg->Data[0]>>4; |
845 | uint8_t channel = rxMsg->Data[0]>>4; |
| 788 | uint8_t config = rxMsg->Data[0] & 0x0f; |
846 | uint8_t config = rxMsg->Data[0] & 0x0f; |
| 789 | uint8_t power = rxMsg->Data[1]>>6; |
847 | uint8_t power = rxMsg->Data[1]>>6; |
| 790 | uint8_t modfreq = rxMsg->Data[2]; |
848 | uint8_t modfreq = rxMsg->Data[2]; |
| 791 | 849 | ||
| 792 | sns_irTransceive_setConfig(channel, config, power, modfreq); |
850 | sns_irTransceive_setConfig(channel, config, power, modfreq); |
| Line 816... | Line 874... | ||
| 816 | } |
874 | } |
| 817 | EEDATA_UPDATE_CRC; |
875 | EEDATA_UPDATE_CRC; |
| 818 | } |
876 | } |
| 819 | #endif |
877 | #endif |
| 820 | break; |
878 | break; |
| - | 879 | } |
|
| 821 | 880 | ||
| 822 | default: |
881 | default: |
| 823 | break; |
882 | break; |
| 824 | 883 | ||
| 825 | } |
884 | } |