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 | } |