Subversion Repositories HomeAutomation

Rev

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

  1.  
  2. #include "act_hd44780.h"
  3.  
  4. uint8_t Command = 0;
  5. #if act_hd44780_USE_AUTO_BL == 1
  6. uint8_t autoMode = CAN_MODULE_ENUM_HD44789_LCD_BACKLIGHT_AUTOLIGHT_ON;
  7. #endif
  8. void act_hd44780_Init(void)
  9. {
  10.     ///FIXME: What is this, this needs to be more clear by far....
  11.  
  12.     // Contrast (brightness on an oled display)
  13.     TCCR0A |= (1<<COM0B1)|(1<<WGM01)|(1<<WGM00);
  14.     TCCR0B |= (1<<CS00);
  15.     OCR0B = act_hd44780_INITIAL_CONTRAST;
  16.     DDRD |= (1<<PD5);
  17.  
  18. #if (act_hd44780_TYPE==0)
  19.     // Backlight
  20.     TCCR0A |= (1<<COM0A1)|(1<<WGM01)|(1<<WGM00);
  21.     TCCR0B |= (1<<CS00);
  22.     OCR0A = act_hd44780_INITIAL_BACKLIGHT;
  23.     DDRD |= (1<<PD6);
  24. #endif
  25.  
  26.     lcd_init(LCD_DISP_ON);
  27.     lcd_clrscr();
  28.     lcd_puts("HomeAutomation\n");
  29.     lcd_puts("HD44780-module\n");
  30. }
  31.  
  32. void act_hd44780_Process(void)
  33. {
  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.   }
  57. #endif
  58.  
  59.  
  60. #if (act_hd44780_TYPE==0)
  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.     }
  69. #endif
  70.        
  71.        
  72.  
  73.        
  74.        
  75. }
  76.  
  77. void act_hd44780_HandleMessage(StdCan_Msg_t *rxMsg)
  78. {
  79.     StdCan_Msg_t txMsg;
  80.     uint8_t n = 0;
  81.  
  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 &&
  85.         rxMsg->Header.ModuleId == act_hd44780_ID)
  86.     {
  87.         switch (rxMsg->Header.Command)
  88.         {
  89.         case CAN_MODULE_CMD_HD44789_LCD_CLEAR:
  90.         lcd_clrscr();
  91.         break;
  92.  
  93.         case CAN_MODULE_CMD_HD44789_LCD_CURSOR:
  94.         lcd_gotoxy(rxMsg->Data[0], rxMsg->Data[1]);
  95.         break;
  96.  
  97.         case CAN_MODULE_CMD_HD44789_LCD_TEXTAT:
  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;
  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. */
  113.         case CAN_MODULE_CMD_HD44789_LCD_TEXT:
  114.         for (n = 0; n < rxMsg->Length; n++)
  115.         {
  116.             lcd_putc((char)rxMsg->Data[n]);
  117.         }
  118.         break;
  119.  
  120.         case CAN_MODULE_CMD_HD44789_LCD_SIZE:
  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;
  124.         txMsg.Header.ModuleId = act_hd44780_ID;
  125.         txMsg.Header.Command = CAN_MODULE_CMD_HD44789_LCD_SIZE;
  126.         txMsg.Length = 2;
  127.  
  128.         txMsg.Data[0] = act_hd44780_WIDTH;
  129.         txMsg.Data[1] = act_hd44780_HEIGHT;
  130.  
  131.         while (StdCan_Put(&txMsg) != StdCan_Ret_OK);
  132.         break;
  133.  
  134.         case CAN_MODULE_CMD_HD44789_LCD_BACKLIGHT:
  135.         if (rxMsg->Length > 0) {
  136. #if (act_hd44780_TYPE==0)
  137.             OCR0A = rxMsg->Data[0];
  138. #else
  139.             OCR0B = rxMsg->Data[0];
  140. #endif
  141. #if act_hd44780_USE_AUTO_BL == 1
  142.             if (rxMsg->Length == 2) {
  143.                 autoMode = rxMsg->Data[0];
  144.             }
  145. #endif
  146.         }
  147.  
  148.         StdCan_Msg_t txMsg;
  149.  
  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;
  153.         txMsg.Header.ModuleId = act_hd44780_ID;
  154.         txMsg.Header.Command = CAN_MODULE_CMD_HD44789_LCD_BACKLIGHT;
  155.         txMsg.Length = 2;
  156.  
  157. #if (act_hd44780_TYPE==0)
  158.             txMsg.Data[0] = OCR0A;
  159. #else
  160.             txMsg.Data[0] = OCR0B;
  161. #endif
  162. #if act_hd44780_USE_AUTO_BL == 1
  163.         txMsg.Data[1] = autoMode;
  164. #else
  165.         txMsg.Data[1] = 0;
  166. #endif
  167.         while (StdCan_Put(&txMsg) != StdCan_Ret_OK);
  168.         break;
  169.         }
  170.     }
  171. }
  172.  
  173. void act_hd44780_List(uint8_t ModuleSequenceNumber)
  174. {
  175.     StdCan_Msg_t txMsg;
  176.  
  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;
  180.     txMsg.Header.ModuleId = act_hd44780_ID;
  181.     txMsg.Header.Command = CAN_MODULE_CMD_GLOBAL_LIST;
  182.     txMsg.Length = 6;
  183.  
  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;
  189.  
  190.     txMsg.Data[4] = NUMBER_OF_MODULES;
  191.     txMsg.Data[5] = ModuleSequenceNumber;
  192.  
  193.     while (StdCan_Put(&txMsg) != StdCan_Ret_OK);
  194. }
  195.