Subversion Repositories HomeAutomation

Rev

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

  1. /**
  2.  * @defgroup infrared IR Protocols Driver Library
  3.  * @code #include <drivers/ir/protocols.h> @endcode
  4.  *
  5.  * @brief  
  6.  *
  7.  *
  8.  * @author  Andreas Fritiofson, Anders Runeson
  9.  * @date    2007
  10.  */
  11.  
  12. /**@{*/
  13.  
  14.  
  15. #ifndef IR_PROTOCOLS_H_
  16. #define IR_PROTOCOLS_H_
  17. #include <stdio.h>
  18. #include <config.h>
  19.  
  20. /* Protocol data structure */
  21. typedef struct {
  22.     uint8_t protocol;
  23.     uint32_t data;
  24.     uint16_t timeout;
  25.     uint8_t repeats;
  26.     uint8_t modfreq;
  27.     uint8_t framecnt;
  28. } Ir_Protocol_Data_t;
  29.  
  30. /* Which protocols to use. These should perhaps be configuration options
  31.  * (config.inc). Only applies to receiver right now */
  32. #define IR_PROTOCOLS_USE_SIRC       1
  33. #define IR_PROTOCOLS_USE_RC5        1
  34. #define IR_PROTOCOLS_USE_SHARP      1
  35. #define IR_PROTOCOLS_USE_NEC        1
  36. #define IR_PROTOCOLS_USE_SAMSUNG    1
  37. #define IR_PROTOCOLS_USE_MARANTZ    1
  38. #define IR_PROTOCOLS_USE_PANASONIC  1
  39. #define IR_PROTOCOLS_USE_SKY        1
  40.  
  41. /* All these functions take a buffer with pulse times and tries to parse it
  42.  * to a Ir_Protocol_Data_t structure. They return IR_OK on success
  43.  * and IR_NOT_CORRECT_DATA if there was no match. */
  44. #if (IR_PROTOCOLS_USE_SIRC)
  45. int8_t parseSIRC(const uint16_t *buf, uint8_t len, Ir_Protocol_Data_t *proto);
  46. #endif
  47. #if (IR_PROTOCOLS_USE_RC5)
  48. int8_t parseRC5(const uint16_t *buf, uint8_t len, Ir_Protocol_Data_t *proto);
  49. #endif
  50. #if (IR_PROTOCOLS_USE_SHARP)
  51. int8_t parseSharp(const uint16_t *buf, uint8_t len, Ir_Protocol_Data_t *proto);
  52. #endif
  53. #if (IR_PROTOCOLS_USE_NEC)
  54. int8_t parseNEC(const uint16_t *buf, uint8_t len, Ir_Protocol_Data_t *proto);
  55. #endif
  56. #if (IR_PROTOCOLS_USE_SAMSUNG)
  57. int8_t parseSamsung(const uint16_t *buf, uint8_t len, Ir_Protocol_Data_t *proto);
  58. #endif
  59. #if (IR_PROTOCOLS_USE_MARANTZ)
  60. int8_t parseMarantz(const uint16_t *buf, uint8_t len, Ir_Protocol_Data_t *proto);
  61. #endif
  62. #if (IR_PROTOCOLS_USE_PANASONIC)
  63. int8_t parsePanasonic(const uint16_t *buf, uint8_t len, Ir_Protocol_Data_t *proto);
  64. #endif
  65. #if (IR_PROTOCOLS_USE_SKY)
  66. int8_t parseSky(const uint16_t *buf, uint8_t len, Ir_Protocol_Data_t *proto);
  67. #endif
  68. /* Try to parse all above protocols until a match is found. */
  69. int8_t parseProtocol(const uint16_t *buf, uint8_t len, Ir_Protocol_Data_t *proto);
  70. /* The Hash protocol always succeeds and creates a one-way signature of the
  71.  * pulse times buffer that is supposed to be unique and constant for a specific
  72.  * IR event. It may be used to send a valid event even if the protocol hasn't
  73.  * been implemented or decoded yet. */
  74. int8_t parseHash(const uint16_t *buf, uint8_t len, Ir_Protocol_Data_t *proto);
  75.  
  76. /* These functions expand a Ir_Protocol_Data_t structure into a raw buffer with
  77.  * pulse lengths. They return IR_OK on success and IR_NOT_CORRECT_DATA if the
  78.  * Ir_Protocol_Data_t structure is for another protocol or contains invalid
  79.  * data. */
  80. int8_t expandSIRC(uint16_t *buf, uint8_t *len, Ir_Protocol_Data_t *proto);
  81. int8_t expandRC5(uint16_t *buf, uint8_t *len, Ir_Protocol_Data_t *proto);
  82. int8_t expandSharp(uint16_t *buf, uint8_t *len, Ir_Protocol_Data_t *proto);
  83. int8_t expandNEC(uint16_t *buf, uint8_t *len, Ir_Protocol_Data_t *proto);
  84. int8_t expandSamsung(uint16_t *buf, uint8_t *len, Ir_Protocol_Data_t *proto);
  85. int8_t expandMarantz(uint16_t *buf, uint8_t *len, Ir_Protocol_Data_t *proto);
  86. int8_t expandPanasonic(uint16_t *buf, uint8_t *len, Ir_Protocol_Data_t *proto);
  87. int8_t expandSky(uint16_t *buf, uint8_t *len, Ir_Protocol_Data_t *proto);
  88. /* Pass the Ir_Protocol_Data_t automatically to the correct function. */
  89. int8_t expandProtocol(uint16_t *buf, uint8_t *len, Ir_Protocol_Data_t *proto);
  90.  
  91.  
  92. #define IR_OK               1
  93. #define IR_NO_PROTOCOL      2
  94. #define IR_TIME_OVFL        3
  95. #define IR_NO_DATA          4
  96. #define IR_NOT_CORRECT_DATA 5
  97. #define IR_TO_MUCH_DATA     6
  98. #define IR_NOT_FINISHED     7
  99.  
  100. #define IR_BUTTON_DOWN      0x0
  101. #define IR_BUTTON_UP        0xf
  102.  
  103. // defined for the module, uses same definitions for pressed and released as other buttons
  104. #define IR_BUTTON_RELEASED  0x0
  105. #define IR_BUTTON_PRESSED   0x1
  106.  
  107.  
  108. #define CYCLES_PER_US       (F_CPU/1000000)
  109. #define TIMER_PRESC         8
  110.  
  111. #define IR_MIN_PULSE_WIDTH  5                                   //us
  112. #define IR_MAX_PULSE_WIDTH  12000                               //us
  113.  
  114. /* RC5 Implementation
  115.  * Receiver: DONE
  116.  * Transmitter: DONE
  117.  */
  118. #define IR_PROTO_RC5        0
  119. #define IR_RC5_HALF_BIT     889*CYCLES_PER_US/TIMER_PRESC       //us
  120. #define IR_RC5_BIT          889*2*CYCLES_PER_US/TIMER_PRESC     //us
  121. #define IR_RC5_TIMEOUT      105                                 //ms    (time between ir frames)
  122. #define IR_RC5_REPS         1                                   //      (minimum number of times to repeat code)
  123. #define IR_RC5_F_MOD        36                                  //kHz   (modulation frequency)
  124. #define IR_RC5_TOL_DIV      4
  125.  
  126. /* RC6 Implementation
  127.  * Receiver:
  128.  * Transmitter:
  129.  */
  130. #define IR_PROTO_RC6        1
  131. #define IR_RC6_ST_BIT       1*CYCLES_PER_US/TIMER_PRESC         //us
  132. #define IR_RC6_TIMEOUT      1                                   //ms    (time between ir frames)
  133. #define IR_RC6_REPS         1                                   //      (minimum number of times to repeat code)
  134. #define IR_RC6_F_MOD        36                                  //kHz   (modulation frequency)
  135. #define IR_RC6_TOL_DIV      4
  136.  
  137. /* RCMM Implementation
  138.  * Receiver:
  139.  * Transmitter:
  140.  */
  141. #define IR_PROTO_RCMM       2
  142. #define IR_RCMM_ST_BIT      256*CYCLES_PER_US/TIMER_PRESC       //us
  143. #define IR_RCMM_TIMEOUT     158                                 //ms    (time between ir frames)
  144. #define IR_RCMM_REPS        1                                   //      (minimum number of times to repeat code)
  145. #define IR_RCMM_F_MOD       36                                  //kHz   (modulation frequency)
  146. #define IR_RCMM_TOL_DIV     4
  147.  
  148. /* SIRC Implementation
  149.  * Receiver: DONE
  150.  * Transmitter:
  151.  */
  152. #define IR_PROTO_SIRC       3
  153. #define IR_SIRC_ST_BIT      2400*CYCLES_PER_US/TIMER_PRESC      //us
  154. #define IR_SIRC_LOW         600*CYCLES_PER_US/TIMER_PRESC       //us
  155. #define IR_SIRC_HIGH_ONE    1200*CYCLES_PER_US/TIMER_PRESC      //us
  156. #define IR_SIRC_HIGH_ZERO   600*CYCLES_PER_US/TIMER_PRESC       //us
  157. #define IR_SIRC_TIMEOUT     40                                  //ms    (time between ir frames)
  158. #define IR_SIRC_REPS        1                                   //      (minimum number of times to repeat code)
  159. #define IR_SIRC_F_MOD       40                                  //kHz   (modulation frequency)
  160. #define IR_SIRC_TOL_DIV     4
  161.  
  162. /* Sharp Implementation
  163.  * Receiver: DONE
  164.  * Transmitter:
  165.  */
  166. #define IR_PROTO_SHARP      4
  167. #define IR_SHARP_HIGH       280*CYCLES_PER_US/TIMER_PRESC       //us
  168. #define IR_SHARP_LOW_ONE    1850*CYCLES_PER_US/TIMER_PRESC      //us
  169. #define IR_SHARP_LOW_ZERO   780*CYCLES_PER_US/TIMER_PRESC       //us
  170. #define IR_SHARP_TIMEOUT    55                                  //ms    (time between ir frames)
  171. #define IR_SHARP_REPS       2                                   //      (minimum number of times to repeat code)
  172. #define IR_SHARP_F_MOD      38                                  //kHz   (modulation frequency)
  173. #define IR_SHARP_TOL_DIV    4
  174.  
  175. /* NEC Implementation
  176.  * Receiver: DONE
  177.  * Transmitter: DONE
  178.  */
  179. #define IR_PROTO_NEC        5
  180. #define IR_NEC_ST_BIT       9000*CYCLES_PER_US/TIMER_PRESC      //us
  181. #define IR_NEC_ST_PAUSE     4500*CYCLES_PER_US/TIMER_PRESC      //us
  182. #define IR_NEC_LOW_ONE      1690*CYCLES_PER_US/TIMER_PRESC      //us
  183. #define IR_NEC_LOW_ZERO     560*CYCLES_PER_US/TIMER_PRESC       //us
  184. #define IR_NEC_HIGH         560*CYCLES_PER_US/TIMER_PRESC       //us
  185. #define IR_NEC_TIMEOUT      110                                 //ms    (time between ir frames)
  186. #define IR_NEC_ST_TIMEOUT   65                                  //ms    (time between first ir frames and second)
  187. #define IR_NEC_REPS         1                                   //      (minimum number of times to repeat code)
  188. #define IR_NEC_F_MOD        38                                  //kHz   (modulation frequency)
  189. #define IR_NEC_TOL_DIV      4
  190.  
  191. /* Samsung Implementation
  192.  * Receiver: DONE
  193.  * Transmitter: DONE
  194.  */
  195. #define IR_PROTO_SAMS       6
  196. #define IR_SAMS_ST_BIT      4500*CYCLES_PER_US/TIMER_PRESC      //us
  197. #define IR_SAMS_ST_PAUSE    4500*CYCLES_PER_US/TIMER_PRESC      //us
  198. #define IR_SAMS_LOW_ONE     1720*CYCLES_PER_US/TIMER_PRESC      //us
  199. #define IR_SAMS_LOW_ZERO    650*CYCLES_PER_US/TIMER_PRESC       //us
  200. #define IR_SAMS_HIGH        500*CYCLES_PER_US/TIMER_PRESC       //us
  201. #define IR_SAMS_TIMEOUT     50                                  //ms    (time between ir frames)
  202. #define IR_SAMS_REPS        1                                   //      (minimum number of times to repeat code)
  203. #define IR_SAMS_F_MOD       38                                  //kHz   (modulation frequency)
  204. #define IR_SAMS_TOL_DIV     4
  205.  
  206. /* Marantz Implementation
  207.  * Receiver: DONE (has not been tested with odd adressbits)
  208.  * Transmitter:
  209.  */
  210. #define IR_PROTO_MARANTZ        7
  211. #define IR_MARANTZ_HALF_BIT     889*CYCLES_PER_US/TIMER_PRESC       //us
  212. #define IR_MARANTZ_BIT          889*2*CYCLES_PER_US/TIMER_PRESC     //us
  213. #define IR_MARANTZ_TIMEOUT      105                                 //ms    (time between ir frames)
  214. #define IR_MARANTZ_REPS         1                                   //      (minimum number of times to repeat code)
  215. #define IR_MARANTZ_F_MOD        36                                  //kHz   (modulation frequency)
  216. #define IR_MARANTZ_TOL_DIV      4
  217.  
  218. /* Panasonic Implementation
  219.  * Receiver: DONE
  220.  * Transmitter: DONE
  221.  */
  222. #define IR_PROTO_PANASONIC  8
  223. #define IR_PANA_ST_BIT      3570*CYCLES_PER_US/TIMER_PRESC      //us
  224. #define IR_PANA_ST_PAUSE    1630*CYCLES_PER_US/TIMER_PRESC      //us
  225. #define IR_PANA_LOW_ONE     1240*CYCLES_PER_US/TIMER_PRESC      //us
  226. #define IR_PANA_LOW_ZERO    400*CYCLES_PER_US/TIMER_PRESC       //us
  227. #define IR_PANA_HIGH        495*CYCLES_PER_US/TIMER_PRESC       //us
  228. #define IR_PANA_TIMEOUT     80                                  //ms    (time between ir frames)
  229. #define IR_PANA_REPS        1                                   //      (minimum number of times to repeat code)
  230. #define IR_PANA_F_MOD       38                                  //kHz   (modulation frequency)
  231. #define IR_PANA_TOL_DIV     4
  232.  
  233. /* Sky Implementation
  234.  * Receiver: DONE
  235.  * Transmitter:
  236.  */
  237. #define IR_PROTO_SKY        9
  238. #define IR_SKY_ST_BIT       2800*CYCLES_PER_US/TIMER_PRESC      //us
  239. #define IR_SKY_SHORT        460*CYCLES_PER_US/TIMER_PRESC       //us
  240. #define IR_SKY_LONG         920*CYCLES_PER_US/TIMER_PRESC       //us
  241. #define IR_SKY_TIMEOUT      150                                 //ms    (time between ir frames)
  242. #define IR_SKY_REPS         1                                   //      (minimum number of times to repeat code)
  243. #define IR_SKY_F_MOD        38                                  //kHz   (modulation frequency)
  244. #define IR_SKY_TOL_DIV      4
  245.  
  246.  
  247.  
  248. #define IR_PROTO_HASH       0xfe
  249. #define IR_PROTO_UNKNOWN    0xff                                //
  250.  
  251.  
  252.  
  253. /**@}*/
  254. #endif /*IR_PROTOCOLS_H_*/
  255.