Subversion Repositories HomeAutomation

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | SVN | RSS feed

  1.  
  2. #include "sns_rotaryHex.h"
  3. uint8_t rotaryEncoder_Position = 0;
  4. uint8_t rotaryEncoder_Position_old = 0;
  5. uint8_t rotaryEncoder_Position_sent = 0;
  6. uint8_t rotaryEncoder_Button_Position = 0;
  7. uint8_t rotaryEncoder_Button_Position_old = 0;
  8.  
  9. uint8_t FlagBlockTransmission = 0;
  10. uint8_t FlagNewMove = 0;
  11.  
  12. void BlockTransmission_callback(uint8_t timer)
  13. {
  14.     FlagBlockTransmission = 0;
  15. }
  16.  
  17. void sns_rotaryHex_pcint_callback(uint8_t id, uint8_t status)
  18. {
  19.     uint8_t rot_data = 0;
  20.    
  21.     //Take care of button push
  22.     //TODO Implement some sort of debounce here
  23.     if (gpio_get_state(sns_rotaryHex_BTN) != rotaryEncoder_Button_Position){ //The buttonstate has changed!
  24.         rotaryEncoder_Button_Position = gpio_get_state(sns_rotaryHex_BTN);
  25.     }
  26.     //Take care of rotary encoder movement
  27.    
  28.     //get position
  29.     rot_data =  (0x01 & gpio_get_state(sns_rotaryHex_DATA0)) +          ((0x01 & gpio_get_state(sns_rotaryHex_DATA1))<< 1) +            ((0x01 & gpio_get_state(sns_rotaryHex_DATA2))<< 2) +            ((0x01 & gpio_get_state(sns_rotaryHex_DATA3))<< 3);
  30.    
  31.     if (rot_data != rotaryEncoder_Position) {
  32.         //rotaryEncoder_Position = rot_data;
  33.         FlagNewMove = 1;
  34.     }
  35.    
  36.     //some simple debounce function
  37.     if (FlagBlockTransmission != 1) {
  38.         FlagBlockTransmission=1;
  39.         Timer_SetTimeout(sns_rotaryHex_TIMER, 100, TimerTypeOneShot, &BlockTransmission_callback);
  40.     }
  41. }
  42.  
  43. void sns_rotaryHex_Init(void)
  44. {
  45.     ///TODO: Initialize hardware etc here
  46.    
  47.     /*
  48.      * Initialize rotaryencoder
  49.      */
  50.    
  51.     gpio_set_in(sns_rotaryHex_DATA0);   // Set to input
  52.     gpio_set_in(sns_rotaryHex_DATA1);   // Set to input
  53.     gpio_set_in(sns_rotaryHex_DATA2);   // Set to input
  54.     gpio_set_in(sns_rotaryHex_DATA3);   // Set to input
  55.     gpio_set_in(sns_rotaryHex_BTN);     // Set to input
  56.    
  57.     // Enable IO-pin interrupt
  58.     Pcint_SetCallbackPin(sns_rotaryHex_PCINT_CH0, sns_rotaryHex_DATA0, &sns_rotaryHex_pcint_callback);
  59.     Pcint_SetCallbackPin(sns_rotaryHex_PCINT_CH1, sns_rotaryHex_DATA1, &sns_rotaryHex_pcint_callback);
  60.     Pcint_SetCallbackPin(sns_rotaryHex_PCINT_CH2, sns_rotaryHex_DATA2, &sns_rotaryHex_pcint_callback);
  61.     Pcint_SetCallbackPin(sns_rotaryHex_PCINT_CH3, sns_rotaryHex_DATA3, &sns_rotaryHex_pcint_callback);
  62.     Pcint_SetCallbackPin(sns_rotaryHex_PCINT_CH4, sns_rotaryHex_BTN, &sns_rotaryHex_pcint_callback);
  63.     // to use PCINt lib, call this function: (the callback function look as a timer callback function)
  64.     // Pcint_SetCallbackPin(sns_rotaryHex_PCINT, EXP_C , &sns_rotaryHex_pcint_callback);
  65.     FlagNewMove = 0;
  66.  
  67. }
  68.  
  69. void sns_rotaryHex_Process(void)
  70. {
  71.     if (FlagNewMove && !FlagBlockTransmission)
  72.     {
  73.         FlagNewMove = 0;
  74.        
  75.         rotaryEncoder_Position =    (0x01 & gpio_get_state(sns_rotaryHex_DATA0)) +
  76.             ((0x01 & gpio_get_state(sns_rotaryHex_DATA1))<< 1) +
  77.             ((0x01 & gpio_get_state(sns_rotaryHex_DATA2))<< 2) +
  78.             ((0x01 & gpio_get_state(sns_rotaryHex_DATA3))<< 3);
  79.         if (rotaryEncoder_Position != rotaryEncoder_Position_old) {
  80.           uint8_t rot_data = 0;
  81.           FlagBlockTransmission=1;
  82.           Timer_SetTimeout(sns_rotaryHex_TIMER, sns_rotaryHex_SEND_DELAY, TimerTypeOneShot, &BlockTransmission_callback);
  83.           StdCan_Msg_t txMsg;
  84.           StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_SNS);
  85.           StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_FROM_OWNER);
  86.           txMsg.Header.ModuleType = CAN_MODULE_TYPE_SNS_ROTARYHEX;
  87.           txMsg.Header.ModuleId = sns_rotaryHex_ID;
  88.           txMsg.Header.Command = CAN_MODULE_CMD_PHYSICAL_ROTARY_SWITCH;
  89.           txMsg.Length = 4;
  90.           txMsg.Data[0] = 0x01;
  91.           int8_t temp_int = 0;
  92.           temp_int = rotaryEncoder_Position - rotaryEncoder_Position_old;
  93.           if (temp_int < 0) { //minskar
  94.             if (temp_int < -7) { //minska för mkt, ökar...
  95.               temp_int = rotaryEncoder_Position_old - rotaryEncoder_Position;
  96.              
  97.               txMsg.Data[1] = CAN_MODULE_ENUM_PHYSICAL_ROTARY_SWITCH_DIRECTION_CLOCKWISE;   //Clockwice
  98.             } else { //minskar
  99.             txMsg.Data[1] = CAN_MODULE_ENUM_PHYSICAL_ROTARY_SWITCH_DIRECTION_COUNTERCLOCKWISE;  //Counter Clockwice
  100.             }
  101.           } else { //ökar
  102.               if (temp_int > 7) { //ökar för mkt, minskar...
  103.             temp_int = rotaryEncoder_Position_old - rotaryEncoder_Position;
  104.             txMsg.Data[1] = CAN_MODULE_ENUM_PHYSICAL_ROTARY_SWITCH_DIRECTION_COUNTERCLOCKWISE;  //Counter Clockwice
  105.               } else {  //ökar
  106.             txMsg.Data[1] = CAN_MODULE_ENUM_PHYSICAL_ROTARY_SWITCH_DIRECTION_CLOCKWISE; //Clockwice
  107.               }
  108.           }
  109.             if (temp_int >= 8) {
  110.               temp_int = 1;
  111.             }
  112. if (temp_int <= -8) {
  113.               temp_int = -1;
  114.             }
  115.             rotaryEncoder_Position_sent += temp_int;
  116.           if (txMsg.Data[1] == CAN_MODULE_ENUM_PHYSICAL_ROTARY_SWITCH_DIRECTION_COUNTERCLOCKWISE) {
  117.             temp_int *= -1;
  118.           }
  119.          
  120.           txMsg.Data[2] = temp_int;
  121.           txMsg.Data[3] = rotaryEncoder_Position;
  122.           while (StdCan_Put(&txMsg) != StdCan_Ret_OK);
  123.           rotaryEncoder_Position_old = rotaryEncoder_Position;
  124.         }
  125.     }
  126.    
  127.    
  128.     if (rotaryEncoder_Button_Position != rotaryEncoder_Button_Position_old)
  129.     {
  130.         rotaryEncoder_Button_Position_old = rotaryEncoder_Button_Position;
  131.         StdCan_Msg_t txMsg;
  132.         StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_SNS);
  133.         StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_FROM_OWNER);
  134.         txMsg.Header.ModuleType = CAN_MODULE_TYPE_SNS_ROTARYHEX;
  135.         txMsg.Header.ModuleId = sns_rotaryHex_ID;
  136.         txMsg.Header.Command = CAN_MODULE_CMD_PHYSICAL_BUTTON;
  137.         txMsg.Length = 2;
  138.         txMsg.Data[0] = 0x01;
  139. #if sns_rotaryHex_BTN_INVERT_OUTPUT==1
  140.         if (rotaryEncoder_Button_Position_old)
  141.             txMsg.Data[1] = CAN_MODULE_ENUM_PHYSICAL_BUTTON_STATUS_RELEASED;
  142.         else
  143.             txMsg.Data[1] = CAN_MODULE_ENUM_PHYSICAL_BUTTON_STATUS_PRESSED;
  144.         while (StdCan_Put(&txMsg) != StdCan_Ret_OK);
  145. #else
  146.         if (rotaryEncoder_Button_Position_old)
  147.             txMsg.Data[1] = CAN_MODULE_ENUM_PHYSICAL_BUTTON_STATUS_PRESSED;
  148.         else
  149.             txMsg.Data[1] = CAN_MODULE_ENUM_PHYSICAL_BUTTON_STATUS_RELEASED;
  150.         while (StdCan_Put(&txMsg) != StdCan_Ret_OK);
  151. #endif
  152.     }
  153. }
  154.  
  155. void sns_rotaryHex_HandleMessage(StdCan_Msg_t *rxMsg)
  156. {
  157.    
  158. }
  159.  
  160. void sns_rotaryHex_List(uint8_t ModuleSequenceNumber)
  161. {
  162. StdCan_Msg_t txMsg;
  163.  
  164.     StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_SNS); ///TODO: Change this to the actual class type
  165.     StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_FROM_OWNER);
  166.     txMsg.Header.ModuleType = CAN_MODULE_TYPE_SNS_ROTARYHEX; ///TODO: Change this to the actual module type
  167.     txMsg.Header.ModuleId = sns_rotaryHex_ID;
  168.     txMsg.Header.Command = CAN_MODULE_CMD_GLOBAL_LIST;
  169.     txMsg.Length = 6;
  170.  
  171.     txMsg.Data[0] = NODE_HW_ID_BYTE0;
  172.     txMsg.Data[1] = NODE_HW_ID_BYTE1;
  173.     txMsg.Data[2] = NODE_HW_ID_BYTE2;
  174.     txMsg.Data[3] = NODE_HW_ID_BYTE3;
  175.  
  176.     txMsg.Data[4] = NUMBER_OF_MODULES;
  177.     txMsg.Data[5] = ModuleSequenceNumber;
  178.  
  179.     while (StdCan_Put(&txMsg) != StdCan_Ret_OK);
  180. }
  181.