LIRC libraries
LinuxInfraredRemoteControl
release.c
Go to the documentation of this file.
1 
2 /****************************************************************************
3  ** release.c ***************************************************************
4  ****************************************************************************
5  *
6  * Copyright (C) 2007 Christoph Bartelmus (lirc@bartelmus.de)
7  *
8  */
9 
18 #ifdef HAVE_CONFIG_H
19 # include <config.h>
20 #endif
21 
22 #include <stdlib.h>
23 #include <stdio.h>
24 #include <sys/time.h>
25 
26 #include "include/media/lirc.h"
27 #include "lirc/release.h"
28 #include "lirc/receive.h"
29 #include "lirc/lirc_log.h"
30 
31 static struct timeval release_time;
32 static struct ir_remote *release_remote;
33 static struct ir_ncode *release_ncode;
34 static ir_code release_code;
35 static int release_reps;
36 static lirc_t release_gap;
37 
38 static struct ir_remote *release_remote2;
39 static struct ir_ncode *release_ncode2;
40 static ir_code release_code2;
41 static const char *release_suffix = LIRC_RELEASE_SUFFIX;
42 static char message[PACKET_SIZE + 1];
43 
44 void register_input(void)
45 {
46  struct timeval gap;
47 
48  if (release_remote == NULL)
49  return;
50 
51  timerclear(&gap);
52  gap.tv_usec = release_gap;
53 
54  gettimeofday(&release_time, NULL);
55  timeradd(&release_time, &gap, &release_time);
56 }
57 
58 void register_button_press(struct ir_remote *remote, struct ir_ncode *ncode, ir_code code, int reps)
59 {
60  if (reps == 0 && release_remote != NULL) {
61  release_remote2 = release_remote;
62  release_ncode2 = release_ncode;
63  release_code2 = release_code;
64  }
65 
66  release_remote = remote;
67  release_ncode = ncode;
68  release_code = code;
69  release_reps = reps;
70  release_gap = upper_limit(remote, remote->max_total_signal_length - remote->min_gap_length) + receive_timeout(upper_limit(remote, remote->min_gap_length)) + 10000; /* some additional safety margin */
71 
72  LOGPRINTF(1, "release_gap: %lu", release_gap);
73 
74  register_input();
75 }
76 
77 void get_release_data(const char **remote_name, const char **button_name, int *reps)
78 {
79  if (release_remote != NULL) {
80  *remote_name = release_remote->name;
81  *button_name = release_ncode->name;
82  *reps = release_reps;
83  } else {
84  *remote_name = *button_name = "(NULL)";
85  *reps = 0;
86  }
87 }
88 
89 void set_release_suffix(const char *s)
90 {
91  release_suffix = s;
92 }
93 
94 void get_release_time(struct timeval *tv)
95 {
96  *tv = release_time;
97 }
98 
99 const char *check_release_event(const char **remote_name, const char **button_name)
100 {
101  int len = 0;
102 
103  if (release_remote2 != NULL) {
104  *remote_name = release_remote2->name;
105  *button_name = release_ncode2->name;
106  len =
107  write_message(message, PACKET_SIZE + 1, release_remote2->name, release_ncode2->name, release_suffix,
108  release_code2, 0);
109  release_remote2 = NULL;
110  release_ncode2 = NULL;
111  release_code2 = 0;
112 
113  if (len >= PACKET_SIZE + 1) {
114  logprintf(LIRC_ERROR, "message buffer overflow");
115  return (NULL);
116  }
117 
118  LOGPRINTF(3, "check");
119  return message;
120  }
121  return NULL;
122 }
123 
124 const char *trigger_release_event(const char **remote_name, const char **button_name)
125 {
126  int len = 0;
127 
128  if (release_remote != NULL) {
129  release_remote->release_detected = 1;
130  *remote_name = release_remote->name;
131  *button_name = release_ncode->name;
132  len =
133  write_message(message, PACKET_SIZE + 1, release_remote->name, release_ncode->name, release_suffix,
134  release_code, 0);
135  timerclear(&release_time);
136  release_remote = NULL;
137  release_ncode = NULL;
138  release_code = 0;
139 
140  if (len >= PACKET_SIZE + 1) {
141  logprintf(LIRC_ERROR, "message buffer overflow");
142  return (NULL);
143  }
144  LOGPRINTF(3, "trigger");
145  return message;
146  }
147  return NULL;
148 }
149 
150 const char *release_map_remotes(struct ir_remote *old, struct ir_remote *new, const char **remote_name,
151  const char **button_name)
152 {
153  struct ir_remote *remote;
154  struct ir_ncode *ncode;
155 
156  if (release_remote2 != NULL) {
157  /* should not happen */
158  logprintf(LIRC_ERROR, "release_remote2 still in use");
159  release_remote2 = NULL;
160  }
161  if (release_remote && is_in_remotes(old, release_remote)) {
162  if ((remote = get_ir_remote(new, release_remote->name))
163  && (ncode = get_code_by_name(remote, release_ncode->name))) {
164  release_remote = remote;
165  release_ncode = ncode;
166  } else {
167  return trigger_release_event(remote_name, button_name);
168  }
169  }
170  return NULL;
171 }
lirc_t max_total_signal_length
const char * name
struct ir_ncode * get_code_by_name(const struct ir_remote *remote, const char *name)
Definition: ir_remote.c:331
struct ir_remote * get_ir_remote(const struct ir_remote *remotes, const char *name)
Definition: ir_remote.c:185
__u64 ir_code
lirc_t min_gap_length
#define PACKET_SIZE
Definition: lirc_config.h:100
char * name
int write_message(char *buffer, size_t size, const char *remote_name, const char *button_name, const char *button_suffix, ir_code code, int reps)
Definition: ir_remote.c:601
const struct ir_remote * is_in_remotes(const struct ir_remote *remotes, const struct ir_remote *remote)
Definition: ir_remote.c:167
#define LIRC_RELEASE_SUFFIX
Definition: lirc_config.h:79
#define LOGPRINTF(level, fmt, args...)
Definition: lirc_log.h:76
int release_detected