Subversion Repositories HomeAutomation

Rev

Rev 1901 | Details | Compare with Previous | Last modification | View Log | SVN | RSS feed

Rev Author Line No. Line
868 migan 1
 
2
#include "sns_SimpleDTMF.h"
3
 
883 arune 4
uint8_t pollrxbuffer[MT_MAX_TONES];
5
uint8_t pollrxlen=0;
868 migan 6
uint8_t rxbuffer[MT_MAX_TONES];
7
uint8_t state = SNS_SIMPLEDTMF_STATE_IDLE;
8
uint8_t rxlen = 0;
9
 
10
void sns_SimpleDTMF_Init(void)
11
{
12
    DTMFin_Init();
13
}
14
 
15
void sns_SimpleDTMF_Process(void)
16
{
17
    StdCan_Msg_t txMsg;
883 arune 18
    DTMF_Ret_t retval;
868 migan 19
 
20
    switch (state)
21
    {
22
    case SNS_SIMPLEDTMF_STATE_IDLE:
883 arune 23
        if (DTMFin_Pop(pollrxbuffer, &pollrxlen) == DTMF_Ret_Data_avail) {
24
            state = SNS_SIMPLEDTMF_STATE_COPYDATA;
25
        } else {
26
            //go into sleep or something, incoming data from mt8870 is interrupted so we will wake up
27
        }
868 migan 28
    break;
29
 
883 arune 30
    case SNS_SIMPLEDTMF_STATE_COPYDATA:
31
        state = SNS_SIMPLEDTMF_STATE_WAIT;
32
        for (uint8_t i=0; i<pollrxlen;i++) {
33
            rxbuffer[rxlen++] = pollrxbuffer[i];
34
            if (rxlen >= MT_MAX_TONES) {
35
                //overflow
36
                rxlen = 0;
37
                state = SNS_SIMPLEDTMF_STATE_IDLE;
38
                break;
39
            }
40
        }
41
 
42
        Timer_SetTimeout(MT_TIMER, MT_DIAL_TIMEOUT, TimerTypeOneShot, 0);
868 migan 43
    break;
44
 
45
    case SNS_SIMPLEDTMF_STATE_WAIT:
883 arune 46
        if (Timer_Expired(MT_TIMER)) {
1704 arune 47
            if (rxlen > 1)
48
            {
49
                state = SNS_SIMPLEDTMF_STATE_SEND;
50
            }
51
            else
52
            {
53
                /* If we have only received one char then it's probably not an incoming number */
54
                rxlen=0;
55
                state = SNS_SIMPLEDTMF_STATE_IDLE;
56
            }
883 arune 57
        }
868 migan 58
 
883 arune 59
        retval = DTMFin_Pop(pollrxbuffer, &pollrxlen);
60
        if (retval == DTMF_Ret_Data_avail) {
61
            state = SNS_SIMPLEDTMF_STATE_COPYDATA;
62
        } else if (retval == DTMF_Ret_Overflow) {
63
            rxlen=0;
64
            state = SNS_SIMPLEDTMF_STATE_IDLE;
65
        }
868 migan 66
    break;
67
 
883 arune 68
    case SNS_SIMPLEDTMF_STATE_SEND:
69
        //if ((rxbuffer[0] == 0xa || rxbuffer[0] == 0xb) && rxbuffer[rxlen-1] == 0xc) {
955 runge 70
        StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_SNS);
71
        StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_FROM_OWNER);
72
        txMsg.Header.ModuleType = CAN_MODULE_TYPE_SNS_SIMPLEDTMF;
868 migan 73
        txMsg.Header.ModuleId = sns_SimpleDTMF_ID;
955 runge 74
        txMsg.Header.Command = CAN_MODULE_CMD_PHYSICAL_PHONENUMBER;
868 migan 75
 
76
        for (uint8_t i = 0; i < 16; i=i+2) {
77
            txMsg.Data[i>>1] = rxbuffer[i]<<4;
78
 
79
            if (i+1 < rxlen)
80
                txMsg.Data[i>>1] |= rxbuffer[i+1];
1901 linlun 81
            else
82
                txMsg.Data[i>>1] |= 0x0c;
868 migan 83
        }
84
        txMsg.Length = (rxlen>>1)+(rxlen&1);
85
 
86
        StdCan_Put(&txMsg);
883 arune 87
        //}
88
        rxlen = 0;
89
        state = SNS_SIMPLEDTMF_STATE_IDLE;
868 migan 90
    break;
91
    }
92
}
93
 
94
void sns_SimpleDTMF_HandleMessage(StdCan_Msg_t *rxMsg)
95
{
955 runge 96
    /*if (  StdCan_Ret_class(rxMsg->Header) == CAN_MODULE_CLASS_SNS && ///TODO: Change this to the actual class type
868 migan 97
        StdCan_Ret_direction(rxMsg->Header) == DIR_TO_OWNER &&
955 runge 98
        rxMsg->Header.ModuleType == CAN_MODULE_TYPE_SNS_SIMPLEDTMF && ///TODO: Change this to the actual module type
868 migan 99
        rxMsg->Header.ModuleId == sns_SimpleDTMF_ID)
100
    {
101
        switch (rxMsg->Header.Command)
102
        {
103
        case CAN_CMD_MODULE_DUMMY:
104
        ///TODO: Do something dummy
105
        break;
106
        }
107
    }*/
108
}
109
 
110
void sns_SimpleDTMF_List(uint8_t ModuleSequenceNumber)
111
{
112
    StdCan_Msg_t txMsg;
113
 
955 runge 114
    StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_SNS);
115
    StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_FROM_OWNER);
116
    txMsg.Header.ModuleType = CAN_MODULE_TYPE_SNS_SIMPLEDTMF;
868 migan 117
    txMsg.Header.ModuleId = sns_SimpleDTMF_ID;
955 runge 118
    txMsg.Header.Command = CAN_MODULE_CMD_GLOBAL_LIST;
868 migan 119
    txMsg.Length = 6;
120
 
1910 arune 121
    uint32_t HwId=BIOS_GetHwId();
122
    txMsg.Data[0] = HwId&0xff;
123
    txMsg.Data[1] = (HwId>>8)&0xff;
124
    txMsg.Data[2] = (HwId>>16)&0xff;
125
    txMsg.Data[3] = (HwId>>24)&0xff;
868 migan 126
 
127
    txMsg.Data[4] = NUMBER_OF_MODULES;
128
    txMsg.Data[5] = ModuleSequenceNumber;
129
 
967 runge 130
    while (StdCan_Put(&txMsg) != StdCan_Ret_OK);
868 migan 131
}