Subversion Repositories HomeAutomation

Rev

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