Subversion Repositories HomeAutomation

Rev

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

Rev Author Line No. Line
1113 linlun 1
 
2
#include "act_SlowPWM.h"
3
 
1978 arune 4
#if act_SlowPWM_USEEEPROM==1
1113 linlun 5
#include "act_SlowPWM_eeprom.h"
6
struct eeprom_act_SlowPWM EEMEM eeprom_act_SlowPWM =
7
{
8
    {
9
        ///TODO: Define initialization values on the EEPROM variables here, this will generate a *.eep file that can be used to store this values to the node, can in future be done with a EEPROM module and the make-scrips. Write the values in the exact same order as the struct is defined in the *.h file. 
10
        0xABcd, // x
11
        0x1234, // y
1119 linlun 12
        0x00,
13
        0x14    //Reportinteval 20 sec.
1113 linlun 14
    },
15
 
16
};
17
#endif
18
 
1119 linlun 19
uint8_t pwmDefaultState,pwmDefaultStartState,act_SlowPWM_ReportInterval;
1113 linlun 20
uint16_t pwmDefaultValue;
21
uint16_t pwmPeriod, pwmValue;
22
uint8_t pwmStatus;
23
 
24
#define PWM_LOW 0
25
#define PWM_HIGH 1
26
#define PWM_OFF 2
27
void updatePWM_callback(uint8_t timer) {
28
    //pwmValue = DEFAULT_PWM_VALUE;
1119 linlun 29
StdCan_Msg_t txMsg;
1113 linlun 30
    if (pwmStatus == PWM_HIGH) { //Pwm output is low
31
        gpio_clr_pin(PWM_PIN);  //Sets low
1119 linlun 32
        pwmStatus = PWM_LOW;
33
        Timer_SetTimeout(timer, pwmValue, TimerTypeOneShot, &updatePWM_callback);
34
 
35
/*
36
        StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_ACT);
37
        StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_FROM_OWNER);
38
        txMsg.Header.ModuleType = CAN_MODULE_TYPE_ACT_SLOWPWM;
39
        txMsg.Header.ModuleId = act_SlowPWM_ID;
40
        txMsg.Header.Command = CAN_MODULE_CMD_GLOBAL_REPORT_INTERVAL;
41
        txMsg.Length = 1;
42
 
43
        txMsg.Data[0] = 10;
44
        StdCan_Put(&txMsg);
45
        */
1113 linlun 46
    } else if (pwmStatus == PWM_LOW){ //Pwm output is high
47
        gpio_set_pin(PWM_PIN);  //Sets high
1119 linlun 48
        pwmStatus = PWM_HIGH;
49
        Timer_SetTimeout(timer, pwmPeriod - pwmValue, TimerTypeOneShot, &updatePWM_callback);
50
/*
51
StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_ACT);
52
        StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_FROM_OWNER);
53
        txMsg.Header.ModuleType = CAN_MODULE_TYPE_ACT_SLOWPWM;
54
        txMsg.Header.ModuleId = act_SlowPWM_ID;
55
        txMsg.Header.Command = CAN_MODULE_CMD_GLOBAL_REPORT_INTERVAL;
56
        txMsg.Length = 1;
57
 
58
        txMsg.Data[0] = 20;
59
        StdCan_Put(&txMsg);
60
*/  } else  //PWM_OFF
1113 linlun 61
    {
62
      if (pwmDefaultState == CAN_MODULE_ENUM_SLOWPWM_CONFIG_DEFAULTSTATE_LOW)
63
      {
64
        gpio_set_out(PWM_PIN);
65
        gpio_clr_pin(PWM_PIN);
66
      } else if (pwmDefaultState == CAN_MODULE_ENUM_SLOWPWM_CONFIG_DEFAULTSTATE_HIGH)
67
      {
68
        gpio_set_out(PWM_PIN);
69
        gpio_set_pin(PWM_PIN);
70
      } else if (pwmDefaultState == CAN_MODULE_ENUM_SLOWPWM_CONFIG_DEFAULTSTATE_TRISTATE)
71
      {
72
        gpio_set_in(PWM_PIN);
73
        gpio_clr_pin(PWM_PIN);
74
      }
75
    }
76
}
77
 
78
 
79
void pwmInit(void) {
80
    if (pwmDefaultState == CAN_MODULE_ENUM_SLOWPWM_CONFIG_DEFAULTSTATE_LOW)
81
      {
82
        gpio_set_out(PWM_PIN);
83
        gpio_clr_pin(PWM_PIN);
84
      } else if (pwmDefaultState == CAN_MODULE_ENUM_SLOWPWM_CONFIG_DEFAULTSTATE_HIGH)
85
      {
86
        gpio_set_out(PWM_PIN);
87
        gpio_set_pin(PWM_PIN);
88
      } else if (pwmDefaultState == CAN_MODULE_ENUM_SLOWPWM_CONFIG_DEFAULTSTATE_TRISTATE)
89
      {
90
        gpio_set_in(PWM_PIN);
91
        gpio_clr_pin(PWM_PIN);
92
      }
93
 
94
    pwmValue = pwmDefaultValue;
95
    pwmStatus = PWM_OFF;
96
    if (pwmDefaultStartState==CAN_MODULE_ENUM_SLOWPWM_CONFIG_STARTUPSTATE_ON) {
97
        Timer_SetTimeout(act_SlowPWM_TIMER, pwmValue, TimerTypeOneShot, &updatePWM_callback);
98
        pwmStatus = PWM_LOW;
99
        gpio_set_out(PWM_PIN);
100
        gpio_clr_pin(PWM_PIN);
101
    }
102
}
103
 
104
void act_SlowPWM_Init(void)
105
{
1978 arune 106
#if act_SlowPWM_USEEEPROM==1
1113 linlun 107
    if (EEDATA_OK)
108
    {
109
      ;
110
    } else
111
    {   //The CRC of the EEPROM is not correct, store default values and update CRC
112
        eeprom_write_word_crc(EEDATA16.PwmPeriod, DEFAULT_PWM_PERIOD , WITHOUT_CRC);
113
        eeprom_write_word_crc(EEDATA16.defaultPwmValue, DEFAULT_PWM_VALUE , WITHOUT_CRC);
114
        eeprom_write_byte_crc(EEDATA.defaultStates, 0xa0 , WITHOUT_CRC);
1119 linlun 115
        eeprom_write_byte_crc(EEDATA.ReportInterval, 0x14 , WITHOUT_CRC);
1113 linlun 116
        EEDATA_UPDATE_CRC;
117
    }
118
    pwmDefaultValue = eeprom_read_word(EEDATA16.defaultPwmValue);
119
    pwmPeriod = eeprom_read_word(EEDATA16.PwmPeriod);
120
    pwmDefaultState = (eeprom_read_byte(EEDATA.defaultStates)>>6) & 0x03;
121
    pwmDefaultStartState = ((eeprom_read_byte(EEDATA.defaultStates)>>5) & 0x01);
1119 linlun 122
    act_SlowPWM_ReportInterval = (eeprom_read_byte(EEDATA.ReportInterval));
123
    Timer_SetTimeout(act_SlowPWM_SEND_TIMER, act_SlowPWM_ReportInterval*1000 , TimerTypeFreeRunning, 0);
1113 linlun 124
#endif  
125
    ///TODO: Initialize hardware etc here
126
    pwmInit();
127
}
128
 
129
void act_SlowPWM_Process(void)
130
{
131
    ///TODO: Stuff that needs doing is done here
1119 linlun 132
    if (Timer_Expired(act_SlowPWM_SEND_TIMER)) {
133
        StdCan_Msg_t txMsg;
134
        StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_ACT);
135
        StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_FROM_OWNER);
136
        txMsg.Header.ModuleType = CAN_MODULE_TYPE_ACT_SLOWPWM;
137
        txMsg.Header.ModuleId = act_SlowPWM_ID;
1178 linlun 138
        txMsg.Header.Command = CAN_MODULE_CMD_PHYSICAL_PWM;
1119 linlun 139
        txMsg.Length = 3;
140
        txMsg.Data[0] = PWMSENSORID;
141
        txMsg.Data[1] = (pwmValue>>8)&0xff;
142
        txMsg.Data[2] = (pwmValue)&0xff;
143
        StdCan_Put(&txMsg);
144
    }
1113 linlun 145
}
146
 
147
void act_SlowPWM_HandleMessage(StdCan_Msg_t *rxMsg)
148
{
149
    if (    StdCan_Ret_class(rxMsg->Header) == CAN_MODULE_CLASS_ACT &&
150
            StdCan_Ret_direction(rxMsg->Header) == DIRECTIONFLAG_TO_OWNER &&
151
            rxMsg->Header.ModuleType == CAN_MODULE_TYPE_ACT_SLOWPWM &&
152
            rxMsg->Header.ModuleId == act_SlowPWM_ID)
153
    {
154
        switch (rxMsg->Header.Command)
155
        {
1178 linlun 156
        case CAN_MODULE_CMD_PHYSICAL_PWM:
1113 linlun 157
            if (rxMsg->Data[0] == PWMSENSORID)
158
            {
159
                if (rxMsg->Length == 3)
160
                {
161
                    pwmValue= (rxMsg->Data[1]<<8) + rxMsg->Data[2];
162
                    if (pwmValue > pwmPeriod)
163
                        pwmValue = pwmPeriod;
1119 linlun 164
                    Timer_SetTimeout(act_SlowPWM_TIMER, pwmValue, TimerTypeOneShot, &updatePWM_callback);
165
                    pwmStatus = PWM_LOW;
166
                    gpio_set_out(PWM_PIN);
167
                    gpio_clr_pin(PWM_PIN);
1113 linlun 168
                } else
169
                {  
170
                    rxMsg->Data[1] = (pwmValue>>8)&0xff;
171
                    rxMsg->Data[2] = (pwmValue)&0xff;
172
                    StdCan_Set_direction(rxMsg->Header, DIRECTIONFLAG_FROM_OWNER);
173
                    rxMsg->Length = 3;
174
                    while (StdCan_Put(rxMsg) != StdCan_Ret_OK);
175
                }
176
            }
177
        break;
178
        case CAN_MODULE_CMD_SLOWPWM_CONFIG:
179
            if (rxMsg->Length == 5)
180
            {
181
                eeprom_write_word_crc(EEDATA16.PwmPeriod, (rxMsg->Data[0]<<8) + rxMsg->Data[1] , WITHOUT_CRC);
182
                eeprom_write_word_crc(EEDATA16.defaultPwmValue, (rxMsg->Data[2]<<8) + rxMsg->Data[3] , WITHOUT_CRC);
183
                eeprom_write_byte_crc(EEDATA.defaultStates, rxMsg->Data[2] , WITH_CRC);
184
                pwmDefaultValue = eeprom_read_word(EEDATA16.defaultPwmValue);
185
                pwmPeriod = eeprom_read_word(EEDATA16.PwmPeriod);
186
                pwmDefaultState = (eeprom_read_byte(EEDATA.defaultStates)>>6) & 0x03;
187
                pwmDefaultStartState = ((eeprom_read_byte(EEDATA.defaultStates)>>5) & 0x01);
188
            } else
189
            {
190
                rxMsg->Data[0] = (eeprom_read_word(EEDATA16.PwmPeriod)>>8)&0xff;
191
                rxMsg->Data[1] = (eeprom_read_word(EEDATA16.PwmPeriod))&0xff;
192
                rxMsg->Data[2] = (eeprom_read_word(EEDATA16.defaultPwmValue)>>8)&0xff;
193
                rxMsg->Data[3] = (eeprom_read_word(EEDATA16.defaultPwmValue))&0xff;
194
                rxMsg->Data[4] = eeprom_read_byte(EEDATA.defaultStates);
195
                StdCan_Set_direction(rxMsg->Header, DIRECTIONFLAG_FROM_OWNER);
196
                rxMsg->Length = 5;
197
                while (StdCan_Put(rxMsg) != StdCan_Ret_OK);
198
            }
199
        break;
1119 linlun 200
 
201
        case CAN_MODULE_CMD_GLOBAL_REPORT_INTERVAL:
202
        if (rxMsg->Length > 0)
203
        {
204
            act_SlowPWM_ReportInterval = rxMsg->Data[0];
205
            eeprom_write_byte_crc(EEDATA.ReportInterval, act_SlowPWM_ReportInterval , WITH_CRC);
206
            Timer_SetTimeout(act_SlowPWM_SEND_TIMER, act_SlowPWM_ReportInterval*1000 , TimerTypeFreeRunning, 0);
1113 linlun 207
        }
1119 linlun 208
 
209
        StdCan_Msg_t txMsg;
210
 
211
        StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_ACT);
212
        StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_FROM_OWNER);
213
        txMsg.Header.ModuleType = CAN_MODULE_TYPE_ACT_SLOWPWM;
214
        txMsg.Header.ModuleId = act_SlowPWM_ID;
215
        txMsg.Header.Command = CAN_MODULE_CMD_GLOBAL_REPORT_INTERVAL;
216
        txMsg.Length = 1;
217
 
218
        txMsg.Data[0] = act_SlowPWM_ReportInterval;
219
        StdCan_Put(&txMsg);
220
        break;
221
        }
1113 linlun 222
    }
223
 
224
}
225
 
226
void act_SlowPWM_List(uint8_t ModuleSequenceNumber)
227
{
228
    StdCan_Msg_t txMsg;
229
 
230
    StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_ACT); ///TODO: Change this to the actual class type
231
    StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_FROM_OWNER);
232
    txMsg.Header.ModuleType = CAN_MODULE_TYPE_ACT_SLOWPWM; ///TODO: Change this to the actual module type
233
    txMsg.Header.ModuleId = act_SlowPWM_ID;
234
    txMsg.Header.Command = CAN_MODULE_CMD_GLOBAL_LIST;
235
    txMsg.Length = 6;
236
 
1910 arune 237
    uint32_t HwId=BIOS_GetHwId();
238
    txMsg.Data[0] = HwId&0xff;
239
    txMsg.Data[1] = (HwId>>8)&0xff;
240
    txMsg.Data[2] = (HwId>>16)&0xff;
241
    txMsg.Data[3] = (HwId>>24)&0xff;
1113 linlun 242
 
243
    txMsg.Data[4] = NUMBER_OF_MODULES;
244
    txMsg.Data[5] = ModuleSequenceNumber;
245
 
246
    while (StdCan_Put(&txMsg) != StdCan_Ret_OK);
247
}