Subversion Repositories HomeAutomation

Rev

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 0
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*modfreq/sns_irTransceive_BaseFrq);
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
        uint8_t length = rxMsg->Length;
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
            if (((rxMsg->Data[0]&0xf) == 0) && rxMsg->Data[1] == 0)
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
                uint8_t channel = (rxMsg->Data[0]>>4)&0xf;
732
            irTxChannel[channel].state = sns_irTransceive_STATE_TRANSMIT_PREPARING_PRONTO;
-
 
733
 
712
                /* TODO: add channel to pronto struct */
734
            //irTxChannel[channel].modfreq = rxMsg->Data[2];
713
                /* TODO: find freqdiv, number of once burst pairs, number of repeat burst pairs */
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
                uint8_t modfreq;
737
            irTxChannel[channel].proto.timeout = 40;
715
                uint8_t oncebursts;
738
            irTxChannel[channel].proto.repeats = 1;
-
 
739
 
716
                uint8_t repeatbursts;
740
            irTxChannel[channel].onceSeqLen = rxMsg->Data[3];
717
                /* TODO: add to pronto struct */
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: /* Fall through */
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
                /* TODO: pack data into buffer irTxChannel[channel].txbuf */
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:  /* Fall through */
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
            ; /* Added to avoid compilation error "a label can only be part of a statement ..." */
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
            uint8_t endindex = rxMsg->Header.Command - CAN_MODULE_CMD_IRTRANSCEIVE_IRPRONTOEND1;
828
            irTxChannel[activeChannel].numberOfRepeats = rxMsg->Data[rxMsg->Length-1];
-
 
829
 
-
 
830
            // send
774
            /* TODO: pack data, if any, into buffer irTxChannel[channel].txbuf */
831
            IrTransceiver_Transmit(activeChannel, irTxChannel[activeChannel].txbuf, 0, irTxChannel[activeChannel].txlen);
-
 
832
            irTxChannel[activeChannel].state = sns_irTransceive_STATE_TRANSMITTING;
775
 
833
 
776
            /* TODO: Last byte contains once/repeat information */
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
        }