Subversion Repositories HomeAutomation

Rev

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

  1.  
  2. #include "sns_irTransmit.h"
  3.  
  4. uint8_t sns_irTransmit_state = sns_irTransmit_STATE_IDLE;
  5. uint8_t sns_irTransmit_repeatCount = 0;
  6. uint8_t sns_irTransmit_stop = 0;
  7. Ir_Protocol_Data_t sns_irTransmit_proto;
  8. uint16_t sns_irTransmit_txbuffer[MAX_NR_TIMES];
  9. uint8_t sns_irTransmit_length = 0;
  10.  
  11. void sns_irTransmit_Init(void)
  12. {
  13.     IrTransceiver_Init();
  14.     sns_irTransmit_proto.timeout = 0;
  15.     sns_irTransmit_proto.data = 0;
  16.     sns_irTransmit_proto.repeats = 0;
  17.     sns_irTransmit_proto.protocol = 0;
  18.     sns_irTransmit_proto.framecnt = 0;
  19. }
  20.  
  21. void sns_irTransmit_Process(void)
  22. {
  23.     if (sns_irTransmit_state == sns_irTransmit_STATE_IDLE)
  24.     {
  25.     }
  26.     else if (sns_irTransmit_state == sns_irTransmit_STATE_START_TRANSMIT)
  27.     {
  28.         if (expandProtocol(sns_irTransmit_txbuffer, &sns_irTransmit_length, &sns_irTransmit_proto) == IR_OK)
  29.         {
  30.             if (IrTransceiver_Transmit(sns_irTransmit_txbuffer, sns_irTransmit_length, sns_irTransmit_proto.modfreq) == IR_OK)
  31.             {
  32.                 sns_irTransmit_state = sns_irTransmit_STATE_TRANSMITTING;
  33.             }
  34.             else
  35.             {
  36.                 sns_irTransmit_state = sns_irTransmit_STATE_IDLE;
  37.             }
  38.         }
  39.         else
  40.         {
  41.             sns_irTransmit_state = sns_irTransmit_STATE_IDLE;
  42.         }
  43.     }
  44.     else if (sns_irTransmit_state == sns_irTransmit_STATE_TRANSMITTING){
  45.         //polla om den är klar, om klar gå till sns_irTransmit_STATE_START_PAUSE
  46.         if (IrTransceiver_Transmit_Poll() != IR_NOT_FINISHED)
  47.         {
  48.             sns_irTransmit_state = sns_irTransmit_STATE_START_PAUSE;
  49.         }
  50.     }
  51.     else if (sns_irTransmit_state == sns_irTransmit_STATE_START_PAUSE)
  52.     {
  53.         if (sns_irTransmit_repeatCount < sns_irTransmit_proto.repeats)
  54.         {
  55.             sns_irTransmit_repeatCount++;
  56.         }
  57.        
  58.         Timer_SetTimeout(sns_irTransmit_REPEAT_TIMER, sns_irTransmit_proto.timeout, TimerTypeOneShot, 0);
  59.        
  60.         if (sns_irTransmit_proto.framecnt != 255)
  61.         {
  62.             sns_irTransmit_proto.framecnt++;
  63.         }
  64.        
  65.         sns_irTransmit_state = sns_irTransmit_STATE_PAUSING;
  66.     }
  67.     else if (sns_irTransmit_state == sns_irTransmit_STATE_PAUSING)
  68.     {
  69.         //när timeout har gått (timebase) så gå till sns_irTransmit_STATE_START_TRANSMIT
  70.         if (Timer_Expired(sns_irTransmit_REPEAT_TIMER))
  71.         {
  72.             sns_irTransmit_state = sns_irTransmit_STATE_START_TRANSMIT;
  73.         }
  74.        
  75.         if (sns_irTransmit_stop == 1 && sns_irTransmit_repeatCount >= sns_irTransmit_proto.repeats)
  76.         {
  77.             sns_irTransmit_state = sns_irTransmit_STATE_STOP;
  78.         }
  79.     }
  80.     else if (sns_irTransmit_state == sns_irTransmit_STATE_STOP)
  81.     {
  82.         sns_irTransmit_stop = 0;
  83.         sns_irTransmit_proto.timeout = 0;
  84.         sns_irTransmit_proto.framecnt = 0;
  85.         sns_irTransmit_repeatCount = 0;
  86.         sns_irTransmit_state = sns_irTransmit_STATE_IDLE;
  87.     }
  88. }
  89.  
  90. void sns_irTransmit_HandleMessage(StdCan_Msg_t *rxMsg)
  91. {
  92.     if (    StdCan_Ret_class(rxMsg->Header) == CAN_MODULE_CLASS_SNS &&
  93.         StdCan_Ret_direction(rxMsg->Header) == DIRECTIONFLAG_TO_OWNER &&
  94.         rxMsg->Header.ModuleType == CAN_MODULE_TYPE_SNS_IRTRANSMIT &&
  95.         rxMsg->Header.ModuleId == sns_irTransmit_ID)
  96.     {
  97.         switch (rxMsg->Header.Command)
  98.         {
  99.         case CAN_MODULE_CMD_PHYSICAL_IR:
  100.        
  101.         if (sns_irTransmit_state == sns_irTransmit_STATE_IDLE && rxMsg->Data[0] == CAN_MODULE_ENUM_PHYSICAL_IR_STATUS_PRESSED)
  102.         {
  103.             sns_irTransmit_proto.protocol = rxMsg->Data[1];
  104.  
  105.             sns_irTransmit_proto.data = rxMsg->Data[2];
  106.             sns_irTransmit_proto.data = sns_irTransmit_proto.data<<8;
  107.             sns_irTransmit_proto.data |= rxMsg->Data[3];
  108.             sns_irTransmit_proto.data = sns_irTransmit_proto.data<<8;
  109.             sns_irTransmit_proto.data |= rxMsg->Data[4];
  110.             sns_irTransmit_proto.data = sns_irTransmit_proto.data<<8;
  111.             sns_irTransmit_proto.data |= rxMsg->Data[5];
  112.  
  113.             sns_irTransmit_state = sns_irTransmit_STATE_START_TRANSMIT;
  114.         }
  115.         else if (sns_irTransmit_state != sns_irTransmit_STATE_IDLE && rxMsg->Data[0] == CAN_MODULE_ENUM_PHYSICAL_IR_STATUS_RELEASED)
  116.         {
  117.             sns_irTransmit_stop = 1;
  118.         }
  119.         break;
  120.         }
  121.     }
  122. }
  123.  
  124. void sns_irTransmit_List(uint8_t ModuleSequenceNumber)
  125. {
  126.     StdCan_Msg_t txMsg;
  127.    
  128.     StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_SNS);
  129.     StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_FROM_OWNER);
  130.     txMsg.Header.ModuleType = CAN_MODULE_TYPE_SNS_IRTRANSMIT;
  131.     txMsg.Header.ModuleId = sns_irTransmit_ID;
  132.     txMsg.Header.Command = CAN_MODULE_CMD_GLOBAL_LIST;
  133.     txMsg.Length = 6;
  134.  
  135.     txMsg.Data[0] = NODE_HW_ID_BYTE0;
  136.     txMsg.Data[1] = NODE_HW_ID_BYTE1;
  137.     txMsg.Data[2] = NODE_HW_ID_BYTE2;
  138.     txMsg.Data[3] = NODE_HW_ID_BYTE3;
  139.    
  140.     txMsg.Data[4] = NUMBER_OF_MODULES;
  141.     txMsg.Data[5] = ModuleSequenceNumber;
  142.    
  143.     while (StdCan_Put(&txMsg) != StdCan_Ret_OK);
  144. }
  145.