Subversion Repositories HomeAutomation

Rev

Rev 1972 | 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.             sns_irTransmit_state = sns_irTransmit_STATE_START_PAUSE;
  51.         }
  52.     }
  53.     else if (sns_irTransmit_state == sns_irTransmit_STATE_START_PAUSE)
  54.     {
  55.         if (sns_irTransmit_repeatCount < sns_irTransmit_proto.repeats)
  56.         {
  57.             sns_irTransmit_repeatCount++;
  58.         }
  59.        
  60.         Timer_SetTimeout(sns_irTransmit_REPEAT_TIMER, sns_irTransmit_proto.timeout, TimerTypeOneShot, 0);
  61.        
  62.         if (sns_irTransmit_proto.framecnt != 255)
  63.         {
  64.             sns_irTransmit_proto.framecnt++;
  65.         }
  66.        
  67.         sns_irTransmit_state = sns_irTransmit_STATE_PAUSING;
  68.     }
  69.     else if (sns_irTransmit_state == sns_irTransmit_STATE_PAUSING)
  70.     {
  71.         //när timeout har gått (timebase) så gå till sns_irTransmit_STATE_START_TRANSMIT
  72.         if (Timer_Expired(sns_irTransmit_REPEAT_TIMER))
  73.         {
  74.             sns_irTransmit_state = sns_irTransmit_STATE_START_TRANSMIT;
  75.         }
  76.        
  77.         if ((sns_irTransmit_stop == 1 || sns_irTransmit_burst_mode) && sns_irTransmit_repeatCount >= sns_irTransmit_proto.repeats)
  78.         {
  79.             sns_irTransmit_state = sns_irTransmit_STATE_STOP;
  80.         }
  81.     }
  82.     else if (sns_irTransmit_state == sns_irTransmit_STATE_STOP)
  83.     {
  84.         sns_irTransmit_burst_mode = 0;
  85.         sns_irTransmit_stop = 0;
  86.         sns_irTransmit_proto.timeout = 0;
  87.         sns_irTransmit_proto.framecnt = 0;
  88.         sns_irTransmit_repeatCount = 0;
  89.         sns_irTransmit_state = sns_irTransmit_STATE_IDLE;
  90.     }
  91. }
  92.  
  93. void sns_irTransmit_HandleMessage(StdCan_Msg_t *rxMsg)
  94. {
  95.     if (    StdCan_Ret_class(rxMsg->Header) == CAN_MODULE_CLASS_SNS &&
  96.         StdCan_Ret_direction(rxMsg->Header) == DIRECTIONFLAG_TO_OWNER &&
  97.         rxMsg->Header.ModuleType == CAN_MODULE_TYPE_SNS_IRTRANSMIT &&
  98.         rxMsg->Header.ModuleId == sns_irTransmit_ID)
  99.     {
  100.         switch (rxMsg->Header.Command)
  101.         {
  102.         case CAN_MODULE_CMD_PHYSICAL_IR:
  103.        
  104.         if (    sns_irTransmit_state == sns_irTransmit_STATE_IDLE &&
  105.             (rxMsg->Data[0] == CAN_MODULE_ENUM_PHYSICAL_IR_STATUS_PRESSED ||
  106.             rxMsg->Data[0] == CAN_MODULE_ENUM_PHYSICAL_IR_STATUS_BURST))
  107.         {
  108.             sns_irTransmit_burst_mode = (uint8_t)(rxMsg->Data[0] == CAN_MODULE_ENUM_PHYSICAL_IR_STATUS_BURST);
  109.            
  110.             sns_irTransmit_proto.protocol = rxMsg->Data[1];
  111.  
  112.             sns_irTransmit_proto.data = rxMsg->Data[2];
  113.             sns_irTransmit_proto.data = sns_irTransmit_proto.data<<8;
  114.             sns_irTransmit_proto.data |= rxMsg->Data[3];
  115.             sns_irTransmit_proto.data = sns_irTransmit_proto.data<<8;
  116.             sns_irTransmit_proto.data |= rxMsg->Data[4];
  117.             sns_irTransmit_proto.data = sns_irTransmit_proto.data<<8;
  118.             sns_irTransmit_proto.data |= rxMsg->Data[5];
  119.             sns_irTransmit_proto.data = sns_irTransmit_proto.data<<8;
  120.             sns_irTransmit_proto.data |= rxMsg->Data[6];
  121.             sns_irTransmit_proto.data = sns_irTransmit_proto.data<<8;
  122.             sns_irTransmit_proto.data |= rxMsg->Data[7];
  123.  
  124.             sns_irTransmit_state = sns_irTransmit_STATE_START_TRANSMIT;
  125.         }
  126.         else if (sns_irTransmit_state != sns_irTransmit_STATE_IDLE && rxMsg->Data[0] == CAN_MODULE_ENUM_PHYSICAL_IR_STATUS_RELEASED)
  127.         {
  128.             sns_irTransmit_stop = 1;
  129.         }
  130.         break;
  131.         }
  132.     }
  133. }
  134.  
  135. void sns_irTransmit_List(uint8_t ModuleSequenceNumber)
  136. {
  137.     StdCan_Msg_t txMsg;
  138.    
  139.     StdCan_Set_class(txMsg.Header, CAN_MODULE_CLASS_SNS);
  140.     StdCan_Set_direction(txMsg.Header, DIRECTIONFLAG_FROM_OWNER);
  141.     txMsg.Header.ModuleType = CAN_MODULE_TYPE_SNS_IRTRANSMIT;
  142.     txMsg.Header.ModuleId = sns_irTransmit_ID;
  143.     txMsg.Header.Command = CAN_MODULE_CMD_GLOBAL_LIST;
  144.     txMsg.Length = 6;
  145.  
  146.     uint32_t HwId=BIOS_GetHwId();
  147.     txMsg.Data[0] = HwId&0xff;
  148.     txMsg.Data[1] = (HwId>>8)&0xff;
  149.     txMsg.Data[2] = (HwId>>16)&0xff;
  150.     txMsg.Data[3] = (HwId>>24)&0xff;
  151.    
  152.     txMsg.Data[4] = NUMBER_OF_MODULES;
  153.     txMsg.Data[5] = ModuleSequenceNumber;
  154.    
  155.     while (StdCan_Put(&txMsg) != StdCan_Ret_OK);
  156. }
  157.