Subversion Repositories HomeAutomation

Rev

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

Rev Author Line No. Line
827 migan 1
 
2
#include "act_hd44780.h"
3
 
4
uint8_t Command = 0;
1427 linlun 5
#if act_hd44780_USE_AUTO_BL == 1
6
uint8_t autoMode = CAN_MODULE_ENUM_HD44789_LCD_BACKLIGHT_AUTOLIGHT_ON;
7
#endif
827 migan 8
void act_hd44780_Init(void)
9
{
10
    ///FIXME: What is this, this needs to be more clear by far....
11
 
998 arune 12
    // Contrast (brightness on an oled display)
928 linlun 13
    TCCR0A |= (1<<COM0B1)|(1<<WGM01)|(1<<WGM00);
14
    TCCR0B |= (1<<CS00);
996 arune 15
    OCR0B = act_hd44780_INITIAL_CONTRAST;
1155 linlun 16
    DDRD |= (1<<PD5);
928 linlun 17
 
1356 arune 18
#if (act_hd44780_TYPE==0)
827 migan 19
    // Backlight
1155 linlun 20
    TCCR0A |= (1<<COM0A1)|(1<<WGM01)|(1<<WGM00);
21
    TCCR0B |= (1<<CS00);
22
    OCR0A = act_hd44780_INITIAL_BACKLIGHT;
23
    DDRD |= (1<<PD6);
1356 arune 24
#endif
827 migan 25
 
26
    lcd_init(LCD_DISP_ON);
27
    lcd_clrscr();
836 migan 28
    lcd_puts("HomeAutomation\n");
839 migan 29
    lcd_puts("HD44780-module\n");
827 migan 30
}
31
 
32
void act_hd44780_Process(void)
33
{
1721 linlun 34
#if act_hd44780_USE_AUTO_BL == 1
35
  if (autoMode == CAN_MODULE_ENUM_HD44789_LCD_BACKLIGHT_AUTOLIGHT_ON) {
36
    #if (act_hd44780_TYPE==0)
37
      if ( OCR0A == 0) {
38
    #else
39
      if ( OCR0B == 0) {
40
    #endif
41
 
42
      } else {
43
      uint16_t Voltage = (0x3ff & ADC_Get(act_hd44780_LIGHTSENSOR_AD));
44
    #if (act_hd44780_TYPE==0)
45
    OCR0A = Voltage/4;
46
    if (OCR0A == 0) {
47
      OCR0A = 1;
48
    }
49
    #else
50
    OCR0B = Voltage/4;
51
    if (OCR0B == 0) {
52
      OCR0B = 1;
53
    }
54
    #endif
55
      }
56
  }
1427 linlun 57
#endif
58
 
1721 linlun 59
 
1427 linlun 60
#if (act_hd44780_TYPE==0)
1721 linlun 61
    if (OCR0A==0 && (TCCR0A & ((1<<COM0A1)|(1<<WGM01)|(1<<WGM00))) == ((1<<COM0A1)|(1<<WGM01)|(1<<WGM00)))
62
    {
63
        TCCR0A &= ~((1<<COM0A1)|(1<<WGM01)|(1<<WGM00));
64
    }
65
    if (OCR0A!=0 && (TCCR0A & ((1<<COM0A1)|(1<<WGM01)|(1<<WGM00))) != ((1<<COM0A1)|(1<<WGM01)|(1<<WGM00)))
66
    {
67
        TCCR0A |= (1<<COM0A1)|(1<<WGM01)|(1<<WGM00);
68
    }
1427 linlun 69
#endif
1721 linlun 70
 
71
 
72
 
73
 
74
 
827 migan 75
}
76
 
77
void act_hd44780_HandleMessage(StdCan_Msg_t *rxMsg)
78
{
79
    StdCan_Msg_t txMsg;
80
    uint8_t n = 0;
81
 
948 runge 82
    if (    StdCan_Ret_class(rxMsg->Header) == CAN_MODULE_CLASS_ACT &&
83
        StdCan_Ret_direction(rxMsg->Header) == DIRECTIONFLAG_TO_OWNER &&
84
        rxMsg->Header.ModuleType == CAN_MODULE_TYPE_ACT_HD44789 &&
827 migan 85
        rxMsg->Header.ModuleId == act_hd44780_ID)
86
    {
87
        switch (rxMsg->Header.Command)
88
        {
950 runge 89
        case CAN_MODULE_CMD_HD44789_LCD_CLEAR:
827 migan 90
        lcd_clrscr();
91
        break;
92
 
950 runge 93
        case CAN_MODULE_CMD_HD44789_LCD_CURSOR:
827 migan 94
        lcd_gotoxy(rxMsg->Data[0], rxMsg->Data[1]);
95
        break;
96
 
950 runge 97
        case CAN_MODULE_CMD_HD44789_LCD_TEXTAT:
944 runge 98
        lcd_gotoxy(rxMsg->Data[0], rxMsg->Data[1]);
99
        for (n = 2; n < rxMsg->Length; n++)
100
        {
101
            lcd_putc((char)rxMsg->Data[n]);
102
        }
103
        break;
1155 linlun 104
/*
105
        case CAN_MODULE_CMD_HD44789_LCD_CLEARROW:
106
        lcd_gotoxy(0, rxMsg->Data[0]);
107
        for (n = 0; n < act_hd44780_WIDTH; n++)
108
        {
109
            lcd_putc(' ');
110
        }
111
        break;
112
*/
950 runge 113
        case CAN_MODULE_CMD_HD44789_LCD_TEXT:
944 runge 114
        for (n = 0; n < rxMsg->Length; n++)
827 migan 115
        {
116
            lcd_putc((char)rxMsg->Data[n]);
117
        }
118
        break;
119
 
950 runge 120
        case CAN_MODULE_CMD_HD44789_LCD_SIZE:
948 runge 121
        StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_ACT);
122
        StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_FROM_OWNER);
123
        txMsg.Header.ModuleType = CAN_MODULE_TYPE_ACT_HD44789;
827 migan 124
        txMsg.Header.ModuleId = act_hd44780_ID;
951 runge 125
        txMsg.Header.Command = CAN_MODULE_CMD_HD44789_LCD_SIZE;
827 migan 126
        txMsg.Length = 2;
928 linlun 127
 
827 migan 128
        txMsg.Data[0] = act_hd44780_WIDTH;
129
        txMsg.Data[1] = act_hd44780_HEIGHT;
928 linlun 130
 
1155 linlun 131
        while (StdCan_Put(&txMsg) != StdCan_Ret_OK);
827 migan 132
        break;
133
 
950 runge 134
        case CAN_MODULE_CMD_HD44789_LCD_BACKLIGHT:
1155 linlun 135
        if (rxMsg->Length > 0) {
998 arune 136
#if (act_hd44780_TYPE==0)
1155 linlun 137
            OCR0A = rxMsg->Data[0];
138
#else
139
            OCR0B = rxMsg->Data[0];
140
#endif
1427 linlun 141
#if act_hd44780_USE_AUTO_BL == 1
142
            if (rxMsg->Length == 2) {
143
                autoMode = rxMsg->Data[0];
144
            }
145
#endif
998 arune 146
        }
827 migan 147
 
148
        StdCan_Msg_t txMsg;
928 linlun 149
 
948 runge 150
        StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_ACT);
151
        StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_FROM_OWNER);
152
        txMsg.Header.ModuleType = CAN_MODULE_TYPE_ACT_HD44789;
827 migan 153
        txMsg.Header.ModuleId = act_hd44780_ID;
951 runge 154
        txMsg.Header.Command = CAN_MODULE_CMD_HD44789_LCD_BACKLIGHT;
2135 linlun 155
        txMsg.Length = 2;
928 linlun 156
 
998 arune 157
#if (act_hd44780_TYPE==0)
1155 linlun 158
            txMsg.Data[0] = OCR0A;
159
#else
160
            txMsg.Data[0] = OCR0B;
161
#endif
1427 linlun 162
#if act_hd44780_USE_AUTO_BL == 1
163
        txMsg.Data[1] = autoMode;
2135 linlun 164
#else
165
        txMsg.Data[1] = 0;
1427 linlun 166
#endif
1155 linlun 167
        while (StdCan_Put(&txMsg) != StdCan_Ret_OK);
827 migan 168
        break;
169
        }
170
    }
171
}
172
 
173
void act_hd44780_List(uint8_t ModuleSequenceNumber)
174
{
175
    StdCan_Msg_t txMsg;
928 linlun 176
 
948 runge 177
    StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_ACT);
178
    StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_FROM_OWNER);
179
    txMsg.Header.ModuleType = CAN_MODULE_TYPE_ACT_HD44789;
827 migan 180
    txMsg.Header.ModuleId = act_hd44780_ID;
948 runge 181
    txMsg.Header.Command = CAN_MODULE_CMD_GLOBAL_LIST;
827 migan 182
    txMsg.Length = 6;
183
 
1910 arune 184
    uint32_t HwId=BIOS_GetHwId();
185
    txMsg.Data[0] = HwId&0xff;
186
    txMsg.Data[1] = (HwId>>8)&0xff;
187
    txMsg.Data[2] = (HwId>>16)&0xff;
188
    txMsg.Data[3] = (HwId>>24)&0xff;
928 linlun 189
 
827 migan 190
    txMsg.Data[4] = NUMBER_OF_MODULES;
191
    txMsg.Data[5] = ModuleSequenceNumber;
928 linlun 192
 
967 runge 193
    while (StdCan_Put(&txMsg) != StdCan_Ret_OK);
827 migan 194
}