Subversion Repositories HomeAutomation

Rev

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

Rev Author Line No. Line
893 arune 1
 
896 arune 2
#include "act_dimmer230.h"
1109 linlun 3
#include "act_dimmer230_eeprom.h"
893 arune 4
 
1265 pengi 5
#ifdef CHN_LOADED
6
#include "../chn_ChnMaster/chn_ChnMaster.h"
7
#endif
897 arune 8
 
1265 pengi 9
#ifdef CHN_LOADED
10
void act_dimmer230_chn_update( uint16_t channel_id, uint16_t value );
11
#endif
12
 
1075 arune 13
int8_t fadeSpeed = 0;
14
uint8_t fadeSpeedFrac = 0;
15
uint8_t fadeTarget = 0;
16
uint8_t fadeSpeedCnt = 0;
1109 linlun 17
 
18
uint8_t demoEndValue = 0;
19
uint8_t demoHighValue = 0;
20
uint8_t demoState = ACT_DIMMMER230_DEMO_STATE_NOT_RUNNING;
21
 
22
/*  This bool is set to make process routine send the NetInfo packet */
23
uint8_t sendNetInfo = 0;
24
 
25
/*  netConnected stores the connection status, if connected to the net or not */
26
uint8_t netConnected = CAN_MODULE_ENUM_DIMMER230_NETINFO_CONNECTION_DISCONNECTED;
27
 
28
/*  frequency stores the evaluated frequency, 50 or 60 Hz
29
    don't calculate net frequency since the internal oscillator is not to be trusted, instead check if 50Hz or 60Hz system
30
    should be used for switching powerStepTable depending on frequency */
1611 linlun 31
uint8_t frequency = CAN_MODULE_ENUM_DIMMER230_NETINFO_FREQUENCY_ERROR_UNKNOWN;
1109 linlun 32
/*  zero cross sync (time between pos flank of xc-detection and real zero cross) */
896 arune 33
uint16_t xcTimeDiff=0;
1109 linlun 34
 
35
/*  dimmerValue is the current output
36
    value of 0 is zero output, value of 255 is max output (ACT_DIMMMER230_MIN_DIM, ACT_DIMMMER230_MAX_DIM)
1081 arune 37
    stored in eeprom, and restored at startup */
1075 arune 38
uint8_t dimmerValue = ACT_DIMMMER230_MIN_DIM;
1611 linlun 39
 
1109 linlun 40
uint8_t state = ACT_DIMMMER230_STATE_IDLE;
41
 
1081 arune 42
/*  powerStepTable is used for stepping the output for constant increase/decrease in power, this should be a quater of a sin^2-wave (since the second quater can be calculated) */
896 arune 43
const uint16_t powerStepTable[] PROGMEM = {845, 1068, 1225, 1352, 1459, 1553, 1638, 1716, 1788, 1855, 1917, 1976, 2032, 2086, 2138, 2188, 2236, 2282, 2327, 2370, 2412, 2453, 2493, 2532, 2570, 2607, 2643, 2679, 2714, 2748, 2782, 2815, 2848, 2880, 2911, 2942, 2972, 3002, 3032, 3061, 3090, 3119, 3147, 3175, 3203, 3230, 3257, 3284, 3311, 3337, 3363, 3389, 3415, 3440, 3465, 3490, 3515, 3539, 3563, 3587, 3611, 3635, 3659, 3682, 3705, 3728, 3751, 3774, 3797, 3820, 3843, 3865, 3887, 3909, 3931, 3953, 3975, 3997, 4019, 4041, 4062, 4083, 4104, 4125, 4146, 4167, 4188, 4209, 4230, 4251, 4272, 4292, 4313, 4333, 4354, 4374, 4395, 4415, 4435, 4455, 4476, 4496, 4516, 4536, 4556, 4576, 4596, 4615, 4635, 4655, 4675, 4694, 4714, 4734, 4754, 4773, 4793, 4813, 4832, 4852, 4872, 4891, 4911, 4931, 4951, 4970, 4990};
44
 
45
#if act_dimmer230_SYNC>0
46
uint8_t zeroCrossCnt = 0;
47
#endif
1109 linlun 48
 
49
 
50
/*  Set the variable to "disconnected" if no zerocross have arrived for a while */
51
void Net_Connection_callback(uint8_t timer)
52
{
53
    netConnected = CAN_MODULE_ENUM_DIMMER230_NETINFO_CONNECTION_DISCONNECTED;
54
}
55
 
56
/*  This function will send the dimmer-status-packet containing connection status and frequency */
57
void Send_Status_callback(uint8_t timer)
58
{
59
    sendNetInfo = 1;
60
}
61
 
1081 arune 62
/*  When the timer reaches its compare value the triac should be trigged */
896 arune 63
ISR (TIMER1_COMPA_vect)
64
{
1083 arune 65
    gpio_set_pin(act_dimmer230_CHAN1_IO);
901 arune 66
    uint8_t dummycnt = 40;
896 arune 67
    while (dummycnt > 0)
68
    {
69
        dummycnt++;
70
        asm("nop");
901 arune 71
        asm("nop");
896 arune 72
    }
1083 arune 73
    gpio_clr_pin(act_dimmer230_CHAN1_IO);
896 arune 74
 
75
    TIMSK1=0;                           //disable timer interrupt
76
    state = ACT_DIMMMER230_STATE_IDLE;
77
}
1109 linlun 78
 
1265 pengi 79
#ifdef CHN_LOADED
80
void act_dimmer230_chn_update( uint16_t channel_id, uint16_t value ) {
81
    fadeTarget = dimmerValue = value>>8;
82
}
83
#endif
84
 
1109 linlun 85
/*  Interrupted at a pin change on zero-cross pin
86
    The zero-cross pin will go high just before the real zero-cross and
87
    low just after the real zero-cross. The time difference is measured
1081 arune 88
    and adjusted for. */
1136 arune 89
void act_dimmer230_pcint_callback(uint8_t id, uint8_t status) //ISR (act_dimmer230_ZC_PCINT_vect) 
1109 linlun 90
{
91
    /* only execute if zerocross pin is low (after real zerocross).
92
    Calculate the diff from real zero-cross.
1081 arune 93
    */
1137 arune 94
    if (!status)
1109 linlun 95
    {
96
        xcTimeDiff = TCNT1;
97
        xcTimeDiff = xcTimeDiff >> 1; //divide by two
98
        if (xcTimeDiff > 600) {
99
            xcTimeDiff = 600;
100
        }
101
    }  
1081 arune 102
    /* only execute if zerocross pin is high (before real zerocross) */
1083 arune 103
    else
1109 linlun 104
    {
105
        /* Reset the timer for checking net connection. If no zero-cross has come in 500ms then consider us disconnected */
106
        Timer_SetTimeout(act_dimmer230_NET_CONNECT_TIMEOUT, 500, TimerTypeOneShot, &Net_Connection_callback);
107
        /* Currently we are connected */
108
        netConnected = CAN_MODULE_ENUM_DIMMER230_NETINFO_CONNECTION_CONNECTED;
109
 
110
        /* Check frequency by measure the time since last zero-cross */
111
        uint16_t periodTime = TCNT1;
112
        if (periodTime > ACT_DIMMMER230_50HZ_PERIOD_TIME-ACT_DIMMMER230_50HZ_PERIOD_TIME/10 && periodTime < ACT_DIMMMER230_50HZ_PERIOD_TIME+ACT_DIMMMER230_50HZ_PERIOD_TIME/10)
113
        {
114
            frequency = CAN_MODULE_ENUM_DIMMER230_NETINFO_FREQUENCY_50HZ;
115
        }
116
        else if (periodTime > ACT_DIMMMER230_60HZ_PERIOD_TIME-ACT_DIMMMER230_60HZ_PERIOD_TIME/10 && periodTime < ACT_DIMMMER230_60HZ_PERIOD_TIME+ACT_DIMMMER230_60HZ_PERIOD_TIME/10)
117
        {
118
            frequency = CAN_MODULE_ENUM_DIMMER230_NETINFO_FREQUENCY_60HZ;
119
        }
120
        else
121
        {
122
            frequency = CAN_MODULE_ENUM_DIMMER230_NETINFO_FREQUENCY_ERROR_UNKNOWN;
123
        }
124
 
125
        /* Check demo states */
126
        if (dimmerValue == fadeTarget) {
1075 arune 127
            switch (demoState)
128
            {
1109 linlun 129
            case ACT_DIMMMER230_DEMO_STATE_NOT_RUNNING:
130
            break;
131
            case ACT_DIMMMER230_DEMO_STATE_DECREASE:
132
                demoState = ACT_DIMMMER230_DEMO_STATE_INCREASE;
133
                fadeTarget = demoHighValue;
134
                fadeSpeed = -fadeSpeed;
135
            break;
136
            case ACT_DIMMMER230_DEMO_STATE_INCREASE:
137
                demoState = ACT_DIMMMER230_DEMO_STATE_GOBACK;
138
                fadeTarget = demoEndValue;
139
                fadeSpeed = -fadeSpeed;
140
            break;
141
            case ACT_DIMMMER230_DEMO_STATE_GOBACK:
142
                demoState = ACT_DIMMMER230_DEMO_STATE_NOT_RUNNING;
143
            break;
144
            }
145
        }
146
 
1081 arune 147
        /* Calculate new time to triac triggering */
148
        uint16_t newTimerVal = xcTimeDiff;      /* add the zerocross timediff */
896 arune 149
 
1075 arune 150
        if (dimmerValue > 0 && dimmerValue <= 127)
896 arune 151
        {
1075 arune 152
            newTimerVal += ACT_DIMMMER230_50HZ_PERIOD_TIME - pgm_read_word(&powerStepTable[dimmerValue-1]);
896 arune 153
        }
1075 arune 154
        else if (dimmerValue < 255)
896 arune 155
        {
1075 arune 156
            newTimerVal += pgm_read_word(&powerStepTable[254-dimmerValue]);
896 arune 157
        }
1075 arune 158
        else if (dimmerValue == 255)
896 arune 159
        {
1081 arune 160
            newTimerVal += 100; /* almost max, to make sure we don't fire before zerocross */
1611 linlun 161
            gpio_set_pin(act_dimmer230_CHAN1_IO);
894 arune 162
        }
895 arune 163
 
1075 arune 164
        if (newTimerVal > ACT_DIMMMER230_50HZ_PERIOD_TIME)
895 arune 165
        {
1075 arune 166
            newTimerVal -= ACT_DIMMMER230_50HZ_PERIOD_TIME;
895 arune 167
        }
893 arune 168
 
1081 arune 169
        TCNT1 = 0;              /* reset timer1 count register */
1611 linlun 170
        if (dimmerValue > 0 && dimmerValue != 255 )     /* dont trigger the triac if dimmerValue is 0 */
896 arune 171
        {
172
            OCR1A = newTimerVal;
173
 
1081 arune 174
            /* enable timer and timer interrupt */
175
            TIFR1=(1<<OCF1A);       /* clear interrupt flag before enabling interrupt */
896 arune 176
            TIMSK1|=(1<<OCIE1A);
177
 
178
            state = ACT_DIMMMER230_STATE_TIMER_ON;
179
        }
1109 linlun 180
 
1081 arune 181
        /* Change the dimmerValue according to the current fading */
1075 arune 182
        fadeSpeedCnt++;
183
        if (fadeSpeedCnt == fadeSpeedFrac && dimmerValue != fadeTarget)
899 arune 184
        {
1075 arune 185
            fadeSpeedCnt = 0;
186
            uint8_t tempDimVal = dimmerValue;
187
            dimmerValue += fadeSpeed;
188
            if ((fadeSpeed > 0 && (dimmerValue < tempDimVal || dimmerValue >= fadeTarget)) ||
189
                (fadeSpeed < 0 && (dimmerValue > tempDimVal || dimmerValue <= fadeTarget)))
899 arune 190
            {
1075 arune 191
                dimmerValue = fadeTarget;
1109 linlun 192
            }
193
 
194
            /* if targetvalue was reached then send the netinfo packet */
195
            if (dimmerValue == fadeTarget)
196
            {
197
                sendNetInfo = 1;
198
            }
199
            /* 5 seconds after we have stopped fading we should store the current dimmerValue to eeprom */
200
            Timer_SetTimeout(act_dimmer230_STORE_VALUE_TIMEOUT, 5000, TimerTypeOneShot, 0);
899 arune 201
        }
1109 linlun 202
 
203
#if act_dimmer230_SYNC>0
1081 arune 204
        /* Currently disabled, must add this packet to data.xml */
896 arune 205
        zeroCrossCnt++;
206
        if (zeroCrossCnt >= act_dimmer230_SYNC)
207
        {
208
            zeroCrossCnt = 0;
899 arune 209
            //TODO: send sync-message on can
1081 arune 210
#if 0
211
            StdCan_Msg_t txMsg;
896 arune 212
            txMsg.Length = 6;
213
            txMsg.Data[0] = (newTimerVal>>8)&0xff;
214
            txMsg.Data[1] = newTimerVal&0xff;
1075 arune 215
            txMsg.Data[2] = frequency;  //(periodTime>>8)&0xff;
896 arune 216
            //txMsg.Data[3] = periodTime&0xff;
217
            txMsg.Data[4] = (xcTimeDiff>>8)&0xff;
218
            txMsg.Data[5] = xcTimeDiff&0xff;
1109 linlun 219
            StdCan_Put(&txMsg);
1081 arune 220
#endif
896 arune 221
        }
222
#endif      
223
    }
1081 arune 224
}
1109 linlun 225
 
1976 arune 226
#if act_dimmer230_USEEEPROM==1
1081 arune 227
struct eeprom_act_dimmer230 EEMEM eeprom_act_dimmer230 =
228
{
229
    {
1109 linlun 230
        /* Define initialization values on the EEPROM variables here,
231
        this will generate a *.eep file that can be used to store this values to the node,
232
        can in future be done with a EEPROM module and the make-scrips.
1081 arune 233
        Write the values in the exact same order as the struct is defined in the *.h file. */
234
        0x00    /* eeDimmerValue */
235
    },
236
 
237
};
238
#endif
1109 linlun 239
 
240
/*  Init function of dimmer-module, will init hardware such as timer and gpio and load
1081 arune 241
    saved eeprom value */
893 arune 242
void act_dimmer230_Init(void)
1109 linlun 243
{
1976 arune 244
#if act_dimmer230_USEEEPROM==1
1081 arune 245
    if (EEDATA_OK)
246
    {
247
      /* Use stored data to set initial values for the module */
248
      dimmerValue = eeprom_read_byte(EEDATA.eeDimmerValue);
249
    } else
250
    {   /* The CRC of the EEPROM is not correct, store default values and update CRC */
251
      eeprom_write_byte_crc(EEDATA.eeDimmerValue, 0x00, WITHOUT_CRC);
252
      EEDATA_UPDATE_CRC;
253
    }
1265 pengi 254
#endif
1109 linlun 255
 
256
    /* set dimmer port to output 0 */
257
    gpio_clr_pin(act_dimmer230_CHAN1_IO);
258
    gpio_set_out(act_dimmer230_CHAN1_IO);
259
    /* set zero cross detection port to input, no pullup */
260
    gpio_set_in(act_dimmer230_ZC_IO);
261
    gpio_clr_pullup(act_dimmer230_ZC_IO);
896 arune 262
 
1081 arune 263
    TIMSK1=0;                           /* disable timer interrupt */
896 arune 264
    TCCR1A=0;
1109 linlun 265
 
1081 arune 266
    TCCR1B=(1<<CS11);                   /* enable timer, set to prescaler 8, must be changed if cpu freq is changed */
896 arune 267
 
1265 pengi 268
#ifdef CHN_LOADED
269
    chn_ChnMaster_RegisterListener( act_dimmer230_CHN_CHANNEL, act_dimmer230_chn_update );
270
#endif
271
 
1081 arune 272
    /* setup interrupt on zerocross, pcint */
1125 linlun 273
    //act_dimmer230_ZC_PCMSK=(1<<(act_dimmer230_ZC_PCINT_BIT));
274
    //PCIFR=(1<<act_dimmer230_ZC_PCIF); /* clear any pending interrupt before enabling interrupts */
275
    //PCICR=(1<<act_dimmer230_ZC_PCIE); /* enable interrupt for PCINT */
276
    Pcint_SetCallbackPin(act_dimmer230_PCINT, act_dimmer230_ZC_IO, &act_dimmer230_pcint_callback);
277
 
1109 linlun 278
    /* Setup timeout for sending the net status packet */
279
    Timer_SetTimeout(act_dimmer230_SEND_STATUS_TIMEOUT, act_dimmer230_SEND_STATUS_INTERVAL*1000, TimerTypeFreeRunning, &Send_Status_callback);
893 arune 280
}
1109 linlun 281
 
282
 
1081 arune 283
/*  Process funtion of dimmer-module, currently everything is done interrupted */
893 arune 284
void act_dimmer230_Process(void)
1109 linlun 285
{
1096 arune 286
    /* Send netinfo packet (if dimmervalue has changed, and periodically) */
1109 linlun 287
    if (sendNetInfo)
288
    {
289
        sendNetInfo = 0;
1093 arune 290
        StdCan_Msg_t txMsg;
291
        StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_ACT);
292
        StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_FROM_OWNER);
293
        txMsg.Header.ModuleType = CAN_MODULE_TYPE_ACT_DIMMER230;
294
        txMsg.Header.ModuleId = act_dimmer230_ID;
295
        txMsg.Header.Command = CAN_MODULE_CMD_DIMMER230_NETINFO;
1613 linlun 296
        txMsg.Length = 3;
1093 arune 297
        txMsg.Data[0] = ((netConnected&0x1)<<7 | (frequency&0x3)<<5);
298
        txMsg.Data[1] = dimmerValue;
1613 linlun 299
        txMsg.Data[2] = 0;  //Channel
1109 linlun 300
        StdCan_Put(&txMsg);
301
    }
302
 
303
    /* If dimmervalue was changed over 5 seconds ago then store the new dimmervalue */
304
    if (Timer_Expired(act_dimmer230_STORE_VALUE_TIMEOUT))
305
    {
306
        eeprom_write_byte_crc(EEDATA.eeDimmerValue, dimmerValue, WITH_CRC);
307
    }
893 arune 308
}
1109 linlun 309
 
310
 
1081 arune 311
/*  Handle incoming message function of dimmer-module */
893 arune 312
void act_dimmer230_HandleMessage(StdCan_Msg_t *rxMsg)
313
{
950 runge 314
    if (    StdCan_Ret_class(rxMsg->Header) == CAN_MODULE_CLASS_ACT &&
315
        StdCan_Ret_direction(rxMsg->Header) == DIRECTIONFLAG_TO_OWNER &&
316
        rxMsg->Header.ModuleType == CAN_MODULE_TYPE_ACT_DIMMER230 &&
893 arune 317
        rxMsg->Header.ModuleId == act_dimmer230_ID)
318
    {
319
        switch (rxMsg->Header.Command)
320
        {
1081 arune 321
        case CAN_MODULE_CMD_DIMMER230_DEMO:     /* Demo(channel, speed, steps) */
1265 pengi 322
            if (rxMsg->Length == 3) {
1075 arune 323
                uint8_t channel = rxMsg->Data[0];
324
                uint8_t speed = rxMsg->Data[1];
325
                uint8_t steps = rxMsg->Data[2];
1265 pengi 326
 
327
                fadeSpeedCnt = 0;
1255 arune 328
                fadeSpeed = 0;
1075 arune 329
                if (speed == 0) {
1081 arune 330
                    /* do nothing */
1075 arune 331
                } else {
1109 linlun 332
                    uint8_t diffToMin = dimmerValue - ACT_DIMMMER230_MIN_DIM;
333
                    uint8_t diffToMax = ACT_DIMMMER230_MAX_DIM - dimmerValue;
899 arune 334
 
1109 linlun 335
                    demoEndValue = dimmerValue;
336
                    if (diffToMin >= steps && diffToMax >= steps)
337
                    {
338
                        /* not close to min or max */
339
                        fadeTarget = dimmerValue - steps;
340
                        demoHighValue = dimmerValue + steps;
341
                    }
342
                    else if (diffToMin >= steps)
343
                    {
344
                        /* close to max */
1257 arune 345
                        fadeTarget = dimmerValue - steps - steps + diffToMax;
1109 linlun 346
                        demoHighValue = ACT_DIMMMER230_MAX_DIM;
347
                    }
348
                    else if (diffToMax >= steps)
349
                    {
350
                        /* close to min */
1265 pengi 351
                        fadeTarget = ACT_DIMMMER230_MIN_DIM;
1257 arune 352
                        demoHighValue = dimmerValue + steps + steps - diffToMin;
1109 linlun 353
                    }
354
                    demoState = ACT_DIMMMER230_DEMO_STATE_DECREASE;
355
 
1257 arune 356
                    if ((speed&0x80) == 0x80) {
357
                        fadeSpeed = (speed&0x7f)+1;
358
                        fadeSpeedFrac = 1;
359
                    } else {
360
                        fadeSpeed = 1;
361
                        fadeSpeedFrac = 0x80-(speed&0x7f);
1075 arune 362
                    }
1257 arune 363
                    if (fadeTarget <= dimmerValue) {
364
                        fadeSpeed = -fadeSpeed;
365
                    }
1075 arune 366
                }
899 arune 367
            }
893 arune 368
        break;
899 arune 369
 
1109 linlun 370
        case CAN_MODULE_CMD_DIMMER230_START_FADE:   /* StartFade(channel, speed, direction) */
899 arune 371
            if (rxMsg->Length == 3) {
1075 arune 372
                demoState = ACT_DIMMMER230_DEMO_STATE_NOT_RUNNING;
899 arune 373
                uint8_t channel = rxMsg->Data[0];
374
                uint8_t speed = rxMsg->Data[1];
375
                uint8_t direction = rxMsg->Data[2];
950 runge 376
 
1075 arune 377
                fadeSpeedCnt = 0;
378
                fadeSpeed = 0;
899 arune 379
                uint8_t endValue = 0;
1091 arune 380
                if (direction == CAN_MODULE_ENUM_DIMMER230_START_FADE_DIRECTION_INCREASE) {
899 arune 381
                    endValue = ACT_DIMMMER230_MAX_DIM;
1091 arune 382
                } else if (direction == CAN_MODULE_ENUM_DIMMER230_START_FADE_DIRECTION_DECREASE) {
899 arune 383
                    endValue = ACT_DIMMMER230_MIN_DIM;
384
                }
385
 
386
                if (speed == 0) {
1109 linlun 387
                    dimmerValue = endValue; /* set dimmer value immediately */
1093 arune 388
                    sendNetInfo = 1;        /* send netinfo with the current dimmervalue*/
899 arune 389
                } else {
1075 arune 390
                    fadeTarget = endValue;
391
                    if (fadeTarget != dimmerValue) {
1091 arune 392
                        if ((speed&0x80) == 0x80) {
393
                            fadeSpeed = (speed&0x7f)+1;
1075 arune 394
                            fadeSpeedFrac = 1;
899 arune 395
                        } else {
1075 arune 396
                            fadeSpeed = 1;
1091 arune 397
                            fadeSpeedFrac = 0x80-(speed&0x7f);
899 arune 398
                        }
1075 arune 399
                        if (fadeTarget < dimmerValue) {
400
                            fadeSpeed = -fadeSpeed;
899 arune 401
                        }
402
                    }
403
                }
404
            }
405
        break;
406
 
1081 arune 407
        case CAN_MODULE_CMD_DIMMER230_STOP_FADE:    /* StopFade(channel) */
899 arune 408
            if (rxMsg->Length == 1) {
1075 arune 409
                demoState = ACT_DIMMMER230_DEMO_STATE_NOT_RUNNING;
1109 linlun 410
                fadeSpeed = 0;
1093 arune 411
                sendNetInfo = 1;        /* send netinfo with the current dimmervalue*/
899 arune 412
            }
413
        break;
414
 
1081 arune 415
        case CAN_MODULE_CMD_DIMMER230_ABS_FADE: /* AbsFade(channel, speed, endValue) */
899 arune 416
            if (rxMsg->Length == 3) {
1075 arune 417
                demoState = ACT_DIMMMER230_DEMO_STATE_NOT_RUNNING;
899 arune 418
                uint8_t channel = rxMsg->Data[0];
419
                uint8_t speed = rxMsg->Data[1];
420
                uint8_t endValue = rxMsg->Data[2];
950 runge 421
 
1075 arune 422
                fadeSpeedCnt = 0;
423
                fadeSpeed = 0;
899 arune 424
                if (speed == 0) {
1109 linlun 425
                    dimmerValue = endValue; /* set dimmer value immediately */
1093 arune 426
                    sendNetInfo = 1;        /* send netinfo with the current dimmervalue*/
899 arune 427
                } else {
1075 arune 428
                    fadeTarget = endValue;
429
                    if (fadeTarget != dimmerValue) {
1091 arune 430
                        if ((speed&0x80) == 0x80) {
431
                            fadeSpeed = (speed&0x7f)+1;
1075 arune 432
                            fadeSpeedFrac = 1;
899 arune 433
                        } else {
1075 arune 434
                            fadeSpeed = 1;
1091 arune 435
                            fadeSpeedFrac = 0x80-(speed&0x7f);
899 arune 436
                        }
1075 arune 437
                        if (fadeTarget < dimmerValue) {
438
                            fadeSpeed = -fadeSpeed;
899 arune 439
                        }
440
                    }
441
                }
442
            }
443
        break;
444
 
1081 arune 445
        case CAN_MODULE_CMD_DIMMER230_REL_FADE: /* RelFade(channel, speed, direction, steps) */
899 arune 446
            if (rxMsg->Length == 4) {
1075 arune 447
                demoState = ACT_DIMMMER230_DEMO_STATE_NOT_RUNNING;
899 arune 448
                uint8_t channel = rxMsg->Data[0];
449
                uint8_t speed = rxMsg->Data[1];
450
                uint8_t direction = rxMsg->Data[2];
451
                uint8_t steps = rxMsg->Data[3];
452
 
1075 arune 453
                fadeSpeedCnt = 0;
454
                fadeSpeed = 0;
455
                uint8_t tempDimVal = dimmerValue;
456
                uint8_t tempDimVal2 = dimmerValue;
1091 arune 457
                if (direction == CAN_MODULE_ENUM_DIMMER230_REL_FADE_DIRECTION_INCREASE) {                   /* if increase */
1081 arune 458
                    tempDimVal2 += steps;               /* calculate new value */
459
                    if (tempDimVal2 < tempDimVal) {     /* make overflow test */
899 arune 460
                        tempDimVal2 = ACT_DIMMMER230_MAX_DIM;
461
                    }
1091 arune 462
                } else if (direction == CAN_MODULE_ENUM_DIMMER230_REL_FADE_DIRECTION_DECREASE) {            /* if decrease */
899 arune 463
                    tempDimVal2 -= steps;
464
                    if (tempDimVal2 > tempDimVal) {
465
                        tempDimVal2 = ACT_DIMMMER230_MIN_DIM;
466
                    }
467
                }
468
                if (speed == 0) {
1109 linlun 469
                    dimmerValue = tempDimVal2;      /* set dimmer value immediately */
1093 arune 470
                    sendNetInfo = 1;                /* send netinfo with the current dimmervalue*/
899 arune 471
                } else {
1081 arune 472
                    fadeTarget = tempDimVal2;       /* set the fade target */
899 arune 473
 
1075 arune 474
                    if (fadeTarget != dimmerValue) {
1091 arune 475
                        if ((speed&0x80) == 0x80) {
476
                            fadeSpeed = (speed&0x7f)+1;
1075 arune 477
                            fadeSpeedFrac = 1;
899 arune 478
                        } else {
1075 arune 479
                            fadeSpeed = 1;
1091 arune 480
                            fadeSpeedFrac = 0x80-(speed&0x7f);
899 arune 481
                        }
1075 arune 482
                        if (fadeTarget < dimmerValue) {
483
                            fadeSpeed = -fadeSpeed;
899 arune 484
                        }
485
                    }
486
                }
487
            }
1265 pengi 488
        break;
1255 arune 489
        }
893 arune 490
    }
491
}
1109 linlun 492
 
1081 arune 493
/* List function of dimmer-module */
893 arune 494
void act_dimmer230_List(uint8_t ModuleSequenceNumber)
495
{
496
    StdCan_Msg_t txMsg;
497
 
950 runge 498
    StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_ACT);
499
    StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_FROM_OWNER);
500
    txMsg.Header.ModuleType = CAN_MODULE_TYPE_ACT_DIMMER230;
893 arune 501
    txMsg.Header.ModuleId = act_dimmer230_ID;
950 runge 502
    txMsg.Header.Command = CAN_MODULE_CMD_GLOBAL_LIST;
893 arune 503
    txMsg.Length = 6;
504
 
1910 arune 505
    uint32_t HwId=BIOS_GetHwId();
506
    txMsg.Data[0] = HwId&0xff;
507
    txMsg.Data[1] = (HwId>>8)&0xff;
508
    txMsg.Data[2] = (HwId>>16)&0xff;
509
    txMsg.Data[3] = (HwId>>24)&0xff;
893 arune 510
 
511
    txMsg.Data[4] = NUMBER_OF_MODULES;
512
    txMsg.Data[5] = ModuleSequenceNumber;
513
 
967 runge 514
    while (StdCan_Put(&txMsg) != StdCan_Ret_OK);
893 arune 515
}
1265 pengi 516