IRPyro messaging application
Communications program between IRPyro and IRPyro evaluation tool
message_interpreter.c
Go to the documentation of this file.
1 /**
2 ******************************************************************************
3 * @file message_interpreter.c
4 * @author _KEMET, Ltd
5 * @date March 2018
6 * @version Release 1.0.6
7 * @copyright (c) 2018 _KEMET, Ltd
8 * @brief Decoded commands from the GUI are prepared for application to the sensor
9 *
10 * @verbatim
11  ===============================================================================
12  ##### Description #####
13  ===============================================================================
14  [..]
15  given a valid instruction code message_interpreter()
16  - passes the code of the acted command
17  - sets the next state of eevt: apply parameters or contact_GUI
18  - SET case: fills IRPyro_device_cmd and IRPyro_device_arg with the passed values
19  - GET case: flags message_to_GUI to recover the proper values.
20  [..]
21  @endverbatim
22  ******************************************************************************
23  @attention <h2><center>&copy; COPYRIGHT 2018 _KEMET, Ltd</center></h2>
24  @verbatim
25  Copyright (c) 2018, _KEMET, Ltd
26  All rights reserved.
27 
28  THIS SOFTWARE IS PROVIDED BY _KEMET, Ltd ''AS IS'' AND ANY
29  EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
30  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
31  DISCLAIMED. IN NO EVENT SHALL _KEMET, Ltd BE LIABLE FOR ANY
32  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
33  (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
34  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
35  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
36  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
37  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38  @endverbatim
39  ******************************************************************************
40  */
41 /* Includes ------------------------------------------------------------------*/
42 #ifndef MESSAGE_TO_SENSOR
43 #include "message_interpreter.h"
44 #endif
45 /** @defgroup message_interpreter Message Interpreter
46  * @ingroup message_interface
47  * @brief Given a byte string response from the firmware, selects the adequate frame for the GUI.
48  * @verbatim
49  *
50  * @endverbatim
51  * @note
52  * @{
53  */
54 uint8_t message_to_sensor_payload[7] = {0};
56 static void report_error(void);
57 extern EXTernal_callback pointer_to_read_function;
58 extern EXTernal_callback pointer_to_wakeup_function;
59 
60 /**
61  * @brief decodes the AFE register of the IRPyro into this_device
62  */
63 static void bytes_to_AFE(uint8_t *AFE_bytes, AFE_reg_type *AFE_register)
64 {
65  AFE_register->S7_S0 = AFE_bytes[0]; // 0b11111111
66  AFE_register->LP = (AFE_bytes[1]& 0X80) >> 7; // 0b10000000
67  AFE_register->HP = (AFE_bytes[1]& 0X40) >> 6; // 0b01000000
68  AFE_register->C_LP = (AFE_bytes[1]& 0X30) >> 4; // 0b00110000
69  AFE_register->CLK_OUT = (AFE_bytes[1]& 0X08) >> 3; // 0b00001000
70  AFE_register->SYNC = (AFE_bytes[1]& 0X04) >> 2; // 0b00000100
71  AFE_register->TEMP = (AFE_bytes[1]& 0X02) >> 1; // 0b00000010
72  AFE_register->INT = (AFE_bytes[1]& 0X01) >> 0; // 0b00000001
73 }
74 /**
75  * @brief decodes the CCP register of the IRPyro into this_device
76  */
77 static void bytes_to_CCP(uint8_t CCP_byte, CCP_reg_type *CCP_register)
78 {
79  CCP_register->Feedback_transconductance = (CCP_byte & 0XC0 )>> 6 ; // 0b11000000
80  CCP_register->High_pass_filter_setting = (CCP_byte & 0X30 )>> 4 ; // 0b00110000
81  CCP_register->Feedback_cap = (CCP_byte & 0X0E )>> 1 ; // 0b00001110
82  CCP_register->status_bit = (CCP_byte & 0X01 )>> 0 ; // 0b00000001
83 }
84 /**
85  * @brief decodes the WUP register of the IRPyro into this_device
86  */
87 static void bytes_to_WUP(uint8_t *WUP_bytes, WUP_reg_type *WUP_register)
88 {
89  WUP_register->UHT = WUP_bytes[0];
90  WUP_register->ULT = WUP_bytes[1];
91  WUP_register->LHT = WUP_bytes[2];
92  WUP_register->LLT = WUP_bytes[3];
93  WUP_register->WT_Threshold = WUP_bytes[4];
94  WUP_register->ST =(WUP_bytes[5] & 0X40) >> 6; // 0b01000000
95  WUP_register->DP0_DP2 =(WUP_bytes[5] & 0X38) >> 3; // 0b00111000
96  WUP_register->CH0_CH2 =(WUP_bytes[5] & 0X07) >> 0; // 0b00000111
97 }
98 /**
99  * @brief configures the null test
100  */
101 static void null_test_command(void)
102 {
104 }
105 /**
106  * @brief configures firmware version string
107  */
108 static void firmware_version_send(void)
109 {
111 }
112 /**
113  * @brief Returns the result to the operation to the GUI
114  */
115 static void asic_version_read(void)
116 {
118 }
119 /**
120  * @brief Returns the result to the operation to the GUI
121  */
122 static void intpr_AFE_read(void)
123 {
125 }
126 /**
127  * @brief commits the AFE values to the structure in memory
128  */
129 static void intpr_AFE_write(void)
130 {
131 #define AFE_SIZE (2)
132  uint8_t afe_bytes[AFE_SIZE];
133  uint8_t sensor_selected;
134  uint8_t payload_index = 0;
135  uint8_t num_sensors_to_process;
136 
137  process_parms_load(&sensor_selected, &num_sensors_to_process);
138  do
139  {
140  afe_bytes[0] = IRPyro_device[sensor_selected].AFE_register.S7_S0;
141  afe_bytes[1] = message_to_sensor_payload[payload_index];
142  if (message_to_sensor_payload[payload_index] & 0x01)
143  IRPyro_device[sensor_selected].read_mode = 0;
144  else
145  IRPyro_device[sensor_selected].read_mode = 1;
146  bytes_to_AFE(afe_bytes, &IRPyro_device[sensor_selected].AFE_register);
147  ++ sensor_selected;
148  ++ payload_index;
149  --num_sensors_to_process;
150  }
151  while(num_sensors_to_process);
152  IRPyro_device_cmd.cmd = register_set;
154 }
155 /**
156  * @brief Collects values stored in the channels configured on channel configuration
157  */
158 static void intpr_CCP_read(void)
159 {
161 }
162 /**
163  * @brief Writes CCP values to channels configured on channel configuration
164  * the CCP values are given as single registers by the GUI. they need to be
165  * converted to API form and written to the registers in memory. The values in
166  * memory are committed to the actual sensor using the ioctl command
167  */
168 static void intpr_CCP_write(void)
169 {
170  uint8_t channel_count = 0;
171  uint8_t channel_ok = channel_processing(&channel_count);
172  if (channel_ok)
173  {
174  uint8_t payload_idx = 0;
175  do
176  {
177  CCP_reg_type CCP_value = {0};
178 
179  bytes_to_CCP(message_to_sensor_payload[payload_idx], &CCP_value);
180  IRPyro_device[channel_id_to_sensor()].CCP_register[channel_id_to_channel()] = CCP_value;
181  channel_id_next();
182 
183  ++ payload_idx;
184  -- channel_count;
185  }
186  while (channel_count);
187  IRPyro_device_cmd.cmd = register_set;
189  }
190  else
191  {
192  report_error();
193  }
194 }
195 /**
196  * @brief Returns the result to the operation to the GUI
197  */
198 static void intpr_WUP_read(void)
199 {
201 }
202 /**
203  * @brief Loads the WUP values to be applied to the sensor
204  */
205 static void intpr_WUP_write(void)
206 {
208  IRPyro_device_cmd.cmd = register_set;
210 }
211 /**
212  * @brief Returns the result to the operation to the GUI
213  */
214 static void streaming_start(void)
215 {
217  isStreaming = 1;
218 }
219 /**
220  * @brief Null operation for the state machine
221  */
222 static void fndummy(void)
223 {
225 }
226 /**
227  * @brief Configures the wake up function and sends the sleep command
228  */
229 static void goto_sleep(void)
230 {
231  IRPyro_device_cmd.cmd = power_sleep;
232  mode_sleeping = 1;
233  isStreaming = 0;
234  EXTernal_Callback_Setup(pointer_to_wakeup_function);
236 }
237 /**
238  * @brief Wakes up the sensor and disables the call back function
239  */
240 static void wake_up(void)
241 {
242  IRPyro_device_cmd.cmd = power_wakeup;
243  mode_sleeping = 0;
244  isStreaming = 1;
245  EXTernal_Callback_Setup(NULL);
247 }
248 /**
249  * @brief Returns the result to the operation to the GUI
250  */
251 static void reset_soft(void)
252 {
254 }
255 /**
256  * @brief Returns the result to the operation to the GUI
257  */
258 static void reset_hard(void)
259 {
261 }
262 /**
263  * @brief Returns the result to the operation to the GUI
264  */
265 static void reset_hardware(void)
266 {
268 }
269 /**
270  * @brief Returns the result to the operation to the GUI
271  */
272 static void sampling_rate_read(void)
273 {
275 }
276 
277 /**
278  * @brief Configures the sample rate in memory and prepares message to sensor
279  */
280 static void sampling_rate_write(void)
281 {
282  IRPyro_device_cmd.cmd = register_set;
283  IRPyro_device[0].AFE_register.S7_S0 = message_to_sensor_payload[0];
284  IRPyro_device[1].AFE_register.S7_S0 = message_to_sensor_payload[0];
285  IRPyro_device[2].AFE_register.S7_S0 = message_to_sensor_payload[0];
286  IRPyro_device[3].AFE_register.S7_S0 = message_to_sensor_payload[0];
288 }
289 
290 /**
291  * @brief Returns the result to the operation to the GUI
292  */
293 static void logical_channels_read(void)
294 {
296 }
297 
298 /**
299  * @brief Updates with values received from the GUI
300  */
301 static void logical_channels_write(void)
302 {
303  for (uint8_t index=0; index< NUMBER_OF_SCOPES_IN_THE_GUI; ++index)
304  {
306  }
308 }
309 /**
310  * @brief Updates with the values received from the GUI
311  */
312 static void set_emitter_timings(void)
313 {
314  IRPyro_device_cmd.cmd = register_get;
318 }
319 /**
320  * @brief Updates with values received from the GUI
321  */
322 static void set_emitter_state(void)
323 {
326 }
327 /**
328  * @brief Returns the result to the operation to the GUI
329  */
330 static void get_failure_flags(void)
331 {
333 }
334 /**
335  * @brief Returns the result to the operation to the GUI
336  */
337 static void board_type_read(void)
338 {
340 }
341 /**
342  * @brief Returns the result to the operation to the GUI
343  */
344 static void unit_id_read(void)
345 {
347 }
348 /**
349  * @brief Returns the result to the operation to the GUI
350  */
351 static void unit_id_write(void)
352 {
353  IRPyro_device_cmd.cmd = register_get;
357 }
358 /**
359  * @brief Returns the result to the operation to the GUI
360  */
361 static void second_unit_id_read(void)
362 {
364 }
365 /**
366  * @brief Returns the result to the operation to the GUI
367  */
368 static void get_darkpixel_state(void)
369 {
371 }
372 /**
373  * @brief Returns the result to the operation to the GUI
374  */
375 static void set_darkpixel_state(void)
376 {
377  if (DarkPixelState)
378  DarkPixelState = 0;
379  else
380  DarkPixelState = 1;
382 }
383 /**
384  * @brief Changes the streaming flag and reports to the GUI
385  */
386 static void streaming_stop(void)
387 {
388  isStreaming = 0;
390 }
391 /**
392  * @brief Changes the error flag and reports to the GUI
393  */
394 static void report_error(void)
395 {
396  error_flag = 1;
398 }
399 /**
400  * @brief Enables status report to the GUI
401  */
402 static void status_start(void)
403 {
404  isStatus = 1;
406 }
407 /**
408  * @brief Disables status report to the GUI
409  */
410 static void status_stop(void)
411 {
412  isStatus = 0;
414 }
415 
416 /**
417  * @brief Recovers the next message from the GUI to the sensor
418  * If the message is valid, is passed to the corresponding function.
419  * the function then sets flags or loads parameters.
420  *
421 */
422 execute_next_state_type message_interpreter(uint8_t *cmd_code, uint8_t *destination)
423 {
424 #define CMD_ARRAY_SIZE (35)
425  uint8_t cmd_tab_idx;
426  static void (* const pf[CMD_ARRAY_SIZE])(void) =
427  {
428  // CODE CHECK
429  null_test_command, // 0 - 0x00 0xFF
430  firmware_version_send, // 1 - 0x01 0xFE
431  asic_version_read, // 2 - 0x02 0xFD
432  intpr_CCP_read, // 3 - 0x03 0xFC
433  intpr_CCP_write, // 4 - 0x04 0xFB
434  intpr_AFE_read, // 5 - 0x05 0xFA
435  intpr_AFE_write, // 6 - 0x06 0xF9
436  intpr_WUP_read, // 7 - 0x07 0xF8
437  intpr_WUP_write, // 8 - 0x08 0xF7
438  streaming_start, // 9 - 0x09 0xF6
439  fndummy, // 10 - 0x0A 0xF5 USB_ENG_Read (DEPRECATED )
440  fndummy, // 11 - 0x0B 0xF4 USB_ENG_Write (DEPRECATED )
441  status_start, // 12 - 0x0C 0xF3
442  status_stop, // 13 - 0x0D 0xF2
443  goto_sleep, // 14 - 0x0E 0xF1
444  wake_up, // 15 - 0x0F 0xF0
445  reset_soft, // 16 - 0x10 0xEF
446  reset_hard, // 17 - 0x11 0xEE
447  reset_hardware, // 18 - 0x12 0xED
448  sampling_rate_read, // 19 - 0x13 0xEC
449  sampling_rate_write, // 20 - 0x14 0xEB
450  logical_channels_read, // 21 - 0x15 0xEA
451  logical_channels_write, // 22 - 0x16 0xE9
452  set_emitter_timings, // 23 - 0x17 0xE8
453  set_emitter_state, // 24 - 0x18 0xE7
454  get_failure_flags, // 25 - 0x19 0xE6
455  board_type_read, // 26 - 0x1A 0xE5
456  unit_id_read, // 27 - 0x1B 0xE4
457  unit_id_write, // 28 - 0x1C 0xE3
458  second_unit_id_read, // 29 - 0x1D 0xE2
459  get_darkpixel_state, // 30 - 0x1E 0xE1
460  set_darkpixel_state, // 31 - 0x1F 0xE0
461  streaming_stop, // 32 - 0x20 0xDF -- Received as code 0x77
462  report_error, // 33 - 0x21 0xDE
463  fndummy // 34 - 0x22 0xDD
464  };
465  decode_result_type unpack_result = message_unpack_decode();
466  if (unpack_result == no_data)
467  {
468  *cmd_code = 0x22; // dummy function: no action
470  }
471  if (unpack_result == decode_fail)
472  {
473  (*pf[0x21])(); // call report error
474  *cmd_code = 0x21;
475  }
476  if (unpack_result == decode_success)
477  {
478  message_unpack_result(&cmd_tab_idx, destination, message_to_sensor_payload);
479  sensor_destination = *destination;
480  if (cmd_tab_idx < CMD_ARRAY_SIZE)
481  {
482  (*pf[cmd_tab_idx])();
483  }
484  *cmd_code = cmd_tab_idx;
485  }
486  return next_step;
487 }
488 /** end of message_interpreter
489  * @}
490  */
491 /* ********** Copyright (c) 2018 _KEMET, Ltd. **********END OF FILE************/
message_to_sensor_payload
uint8_t message_to_sensor_payload[7]
Definition: message_interpreter.c:54
get_darkpixel_state
static void get_darkpixel_state(void)
Returns the result to the operation to the GUI.
Definition: message_interpreter.c:368
goto_sleep
static void goto_sleep(void)
Configures the wake up function and sends the sleep command.
Definition: message_interpreter.c:229
execute_apply_parameters
@ execute_apply_parameters
Definition: message_interpreter.h:60
second_unit_id_read
static void second_unit_id_read(void)
Returns the result to the operation to the GUI.
Definition: message_interpreter.c:361
set_emitter_timings
static void set_emitter_timings(void)
Updates with the values received from the GUI.
Definition: message_interpreter.c:312
channel_processing
uint8_t channel_processing(uint8_t *channel_count)
prepares for channel_id requests
Definition: message_interface_common.c:178
message_unpack_result
void message_unpack_result(uint8_t *cmd_code_result, uint8_t *sensor_destination, uint8_t *cmd_payload)
gives access to the command code and the corresponding payload (if any)
Definition: message_unpack.c:336
bytes_to_AFE
static void bytes_to_AFE(uint8_t *AFE_bytes, AFE_reg_type *AFE_register)
decodes the AFE register of the IRPyro into this_device
Definition: message_interpreter.c:63
pointer_to_wakeup_function
EXTernal_callback pointer_to_wakeup_function
Definition: main.c:87
error_flag
uint8_t error_flag
Definition: main.c:73
message_unpack_decode
decode_result_type message_unpack_decode(void)
FSM to decode a received command If the command is valid, the command code and the payload (if any) a...
Definition: message_unpack.c:365
intpr_WUP_write
static void intpr_WUP_write(void)
Loads the WUP values to be applied to the sensor.
Definition: message_interpreter.c:205
reset_hardware
static void reset_hardware(void)
Returns the result to the operation to the GUI.
Definition: message_interpreter.c:265
ChannelConfiguration
uint8_t ChannelConfiguration[NUMBER_OF_SCOPES_IN_THE_GUI]
Definition: main.c:79
channel_id_to_channel
uint8_t channel_id_to_channel(void)
maps the GUI scope channel_id to physical channel on the sensor
Definition: message_interface_common.c:202
set_darkpixel_state
static void set_darkpixel_state(void)
Returns the result to the operation to the GUI.
Definition: message_interpreter.c:375
sensor_destination
uint8_t sensor_destination
Definition: main.c:297
decode_fail
@ decode_fail
Definition: message_unpack.h:39
channel_id_to_sensor
uint8_t channel_id_to_sensor(void)
maps the GUI scope channel_id to physical sensor
Definition: message_interface_common.c:194
logical_channels_read
static void logical_channels_read(void)
Returns the result to the operation to the GUI.
Definition: message_interpreter.c:293
status_start
static void status_start(void)
Enables status report to the GUI.
Definition: message_interpreter.c:402
board_type_read
static void board_type_read(void)
Returns the result to the operation to the GUI.
Definition: message_interpreter.c:337
channel_configuration_map::index
uint8_t index
Definition: message_interface_common.c:161
EmitterStatus
uint8_t EmitterStatus
Definition: main.c:65
reset_hard
static void reset_hard(void)
Returns the result to the operation to the GUI.
Definition: message_interpreter.c:258
message_interpreter.h
GUI flag and data structure directed to the sensor.
EmitterOFFTime
uint16_t EmitterOFFTime
Definition: main.c:67
bytes_to_WUP
static void bytes_to_WUP(uint8_t *WUP_bytes, WUP_reg_type *WUP_register)
decodes the WUP register of the IRPyro into this_device
Definition: message_interpreter.c:87
status_stop
static void status_stop(void)
Disables status report to the GUI.
Definition: message_interpreter.c:410
UnitID
uint8_t UnitID[2]
Definition: main.c:55
CMD_ARRAY_SIZE
#define CMD_ARRAY_SIZE
mode_sleeping
uint8_t mode_sleeping
Definition: main.c:53
logical_channels_write
static void logical_channels_write(void)
Updates with values received from the GUI.
Definition: message_interpreter.c:301
intpr_AFE_write
static void intpr_AFE_write(void)
commits the AFE values to the structure in memory
Definition: message_interpreter.c:129
channel_id_next
void channel_id_next(void)
increments the channel index
Definition: message_interface_common.c:210
sensor_selected
uint8_t sensor_selected
Definition: message_generator.c:52
fndummy
static void fndummy(void)
Null operation for the state machine.
Definition: message_interpreter.c:222
message_interpreter
execute_next_state_type message_interpreter(uint8_t *cmd_code, uint8_t *destination)
Recovers the next message from the GUI to the sensor If the message is valid, is passed to the corres...
Definition: message_interpreter.c:422
execute_contact_gui
@ execute_contact_gui
Definition: message_interpreter.h:61
streaming_start
static void streaming_start(void)
Returns the result to the operation to the GUI.
Definition: message_interpreter.c:214
streaming_stop
static void streaming_stop(void)
Changes the streaming flag and reports to the GUI.
Definition: message_interpreter.c:386
wake_up
static void wake_up(void)
Wakes up the sensor and disables the call back function.
Definition: message_interpreter.c:240
NUMBER_OF_SCOPES_IN_THE_GUI
#define NUMBER_OF_SCOPES_IN_THE_GUI
Definition: externals.h:30
intpr_CCP_write
static void intpr_CCP_write(void)
Writes CCP values to channels configured on channel configuration the CCP values are given as single ...
Definition: message_interpreter.c:168
IRPyro_device_cmd
IRPyro_cmd_type IRPyro_device_cmd
Definition: main.c:77
EmitterONTime
uint16_t EmitterONTime
Definition: main.c:66
pointer_to_read_function
EXTernal_callback pointer_to_read_function
Definition: main.c:86
isStreaming
uint8_t isStreaming
Definition: main.c:70
next_step
execute_next_state_type next_step
Definition: message_interpreter.c:55
firmware_version_send
static void firmware_version_send(void)
configures firmware version string
Definition: message_interpreter.c:108
get_failure_flags
static void get_failure_flags(void)
Returns the result to the operation to the GUI.
Definition: message_interpreter.c:330
null_test_command
static void null_test_command(void)
configures the null test
Definition: message_interpreter.c:101
process_parms_load
void process_parms_load(uint8_t *idx, uint8_t *num_sensors_to_process)
configures for loop for single or multiple sensor operations
Definition: message_interface_common.c:139
intpr_CCP_read
static void intpr_CCP_read(void)
Collects values stored in the channels configured on channel configuration.
Definition: message_interpreter.c:158
set_emitter_state
static void set_emitter_state(void)
Updates with values received from the GUI.
Definition: message_interpreter.c:322
asic_version_read
static void asic_version_read(void)
Returns the result to the operation to the GUI.
Definition: message_interpreter.c:115
reset_soft
static void reset_soft(void)
Returns the result to the operation to the GUI.
Definition: message_interpreter.c:251
sampling_rate_read
static void sampling_rate_read(void)
Returns the result to the operation to the GUI.
Definition: message_interpreter.c:272
AFE_SIZE
#define AFE_SIZE
isStatus
uint8_t isStatus
Definition: main.c:71
intpr_WUP_read
static void intpr_WUP_read(void)
Returns the result to the operation to the GUI.
Definition: message_interpreter.c:198
DarkPixelState
uint8_t DarkPixelState
Definition: main.c:57
no_data
@ no_data
Definition: message_unpack.h:41
bytes_to_CCP
static void bytes_to_CCP(uint8_t CCP_byte, CCP_reg_type *CCP_register)
decodes the CCP register of the IRPyro into this_device
Definition: message_interpreter.c:77
unit_id_write
static void unit_id_write(void)
Returns the result to the operation to the GUI.
Definition: message_interpreter.c:351
execute_next_state_type
execute_next_state_type
Definition: message_interpreter.h:59
report_error
static void report_error(void)
Changes the error flag and reports to the GUI.
Definition: message_interpreter.c:394
intpr_AFE_read
static void intpr_AFE_read(void)
Returns the result to the operation to the GUI.
Definition: message_interpreter.c:122
decode_result_type
decode_result_type
Definition: message_unpack.h:38
decode_success
@ decode_success
Definition: message_unpack.h:40
sampling_rate_write
static void sampling_rate_write(void)
Configures the sample rate in memory and prepares message to sensor.
Definition: message_interpreter.c:280
IRPyro_device
IRPyro_devices IRPyro_device
Definition: main.c:76
unit_id_read
static void unit_id_read(void)
Returns the result to the operation to the GUI.
Definition: message_interpreter.c:344