lirc.c
上传用户:ledjyj
上传日期:2014-08-27
资源大小:2639k
文件大小:5k
源码类别:

驱动编程

开发平台:

Unix_Linux

  1. /*
  2.  *  This program is free software; you can redistribute it and/or modify
  3.  *  it under the terms of the GNU General Public License as published by
  4.  *  the Free Software Foundation; either version 2 of the License, or
  5.  *  (at your option) any later version.
  6.  *
  7.  *  This program is distributed in the hope that it will be useful,
  8.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  9.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  10.  *  GNU Library General Public License for more details.
  11.  *
  12.  *  You should have received a copy of the GNU General Public License
  13.  *  along with this program; if not, write to the Free Software
  14.  *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  15.  */
  16. #include "config.h"
  17. #ifdef HAVE_LIRC
  18. #include <string.h>
  19. #include <fcntl.h>
  20. #include <gnome.h>
  21. #ifdef HAVE_LIRC
  22. #include <lirc/lirc_client.h>
  23. #endif
  24. #include "bacon-volume.h"
  25. #include "lirc.h"
  26. #include "gui.h"
  27. static int fd = -1;
  28. static struct lirc_config *config = NULL;
  29. static void execute_lirc_command (char *cmd)
  30. {
  31. printf("lirc command: %sn", cmd);
  32. int vol = (int)(bacon_volume_button_get_value(BACON_VOLUME_BUTTON(mute_button)) + 0.5f);
  33. if (strcasecmp (cmd, "tune up") == 0) 
  34. {
  35. scfw_button_clicked_cb(NULL, NULL);
  36. }
  37. else if (strcasecmp (cmd, "tune down") == 0) 
  38. {
  39. scbw_button_clicked_cb(NULL, NULL);
  40. }
  41. else if (strcasecmp (cmd, "volume up") == 0) 
  42. {
  43. bacon_volume_button_set_value(BACON_VOLUME_BUTTON(mute_button), vol > 95 ? 100 : vol + 5);
  44. /*gtk_adjustment_set_value(volume, (volume->value > 95) ? 100 : volume->value+5);*/
  45. }
  46. else if (strcasecmp (cmd, "volume down") == 0) 
  47. {
  48. bacon_volume_button_set_value(BACON_VOLUME_BUTTON(mute_button), vol < 5 ? 0 : vol - 5);
  49. /*gtk_adjustment_set_value(volume,(volume->value < 5) ? 0 : volume->value-5);*/
  50. }
  51. else if (strcasecmp (cmd, "mute") == 0)
  52. {
  53. toggle_volume();
  54. }
  55. else if (strcasecmp (cmd, "tv") == 0)
  56. {
  57. exit_gnome_radio();
  58. gnome_execute_shell(NULL, "xawtv"); 
  59. }
  60. else if (strcasecmp (cmd, "quit") == 0)
  61. {
  62. exit_gnome_radio();
  63. }
  64. else if (strcasecmp (cmd, "preset up") == 0)
  65. {
  66. change_preset(TRUE);
  67. }
  68. else if (strcasecmp (cmd, "preset down") == 0)
  69. {
  70. change_preset(FALSE);
  71. }
  72. else if (strncasecmp (cmd, "preset ", 7) == 0) 
  73. {
  74. int tmp = 0, ret;
  75. ret = sscanf(cmd, "preset %i", &tmp);
  76. if (ret && (tmp < g_list_length(settings.presets)))
  77. {
  78. preset *ps;
  79. ps = g_list_nth_data(settings.presets, tmp);
  80. gtk_adjustment_set_value(adj, ps->freq*STEPS);
  81. mom_ps = tmp;
  82. preset_combo_set_item(mom_ps);
  83. }
  84. }
  85. else
  86. {
  87.      printf ("unrecognized lirccmd: %sn", cmd);
  88. }
  89. }
  90. static char* map_code_to_default(char *code)
  91. {
  92. char event[21];
  93. unsigned int dummy, repeat = 0;
  94. int key = 0;
  95. if (sscanf(code,"%x %x %20s", &dummy, &repeat, event) != 3)
  96. {
  97. printf("lirc: oops, parse error: %s", code);
  98. return NULL;
  99. }
  100. if (!strcasecmp("VOL+", event))
  101. return (char*)strdup("volume up");
  102. else if (!strcasecmp("VOL-", event))
  103. return (char*)strdup("volume down");
  104. else if (!repeat && !strcasecmp("CH+", event))
  105. return (char*)strdup("tune up");
  106. else if (!repeat && !strcasecmp("CH-", event))
  107. return (char*)strdup("tune down");
  108. else if (!repeat && !strcasecmp("MUTE", event))
  109. return (char*)strdup("mute");
  110. else if (!repeat && !strcasecmp("MINIMIZE", event))
  111. return (char*)strdup("quit");
  112. if (sscanf(event, "%d", &key) == 1)
  113. {
  114. char *ret;
  115. if (repeat || (key < 0) || (key > 9))
  116. return NULL;
  117. ret = malloc(strlen("preset xx"));
  118. sprintf(ret, "preset %1.1d", key);
  119. return ret;
  120. }
  121. return NULL;
  122. }
  123. int my_lirc_init(void)
  124. {
  125. /*printf("Trying to bring up lircn");*/
  126. if ((fd = lirc_init ("gnomeradio", 0)) <=0) 
  127. {
  128. perror("lirc_init");
  129. return 0;
  130. }
  131.   
  132. if (lirc_readconfig (NULL, &config, NULL) != 0) 
  133. {
  134. perror("lirc_readconfig");
  135.      config = NULL;
  136. /*lirc_deinit ();
  137.      fd = -1;
  138.      return 0;*/
  139. printf("The lirc configfile (~/.lircrc) could not be opened.n"
  140. "Using default config.n");
  141. }
  142.   
  143. fcntl (fd, F_SETFL, O_NONBLOCK);
  144. fcntl (fd, F_SETFD, FD_CLOEXEC);
  145.   
  146. return 1;
  147. }
  148. void my_lirc_deinit(void)
  149. {
  150. if (fd <= 0)
  151. return;
  152. /*printf("Shutting down lircn");*/
  153. /*gdk_input_remove (input_tag);*/
  154. lirc_freeconfig(config);
  155. lirc_deinit ();
  156. }
  157. static gboolean lirc_has_data_cb(GIOChannel *source, GIOCondition condition, gpointer data)
  158. {
  159. char *code, *cmd;
  160. int ret = -1;
  161.   
  162. while (lirc_nextcode (&code) == 0 && code != NULL) 
  163. {
  164. ret = 0;
  165. if (config)
  166. {
  167. while (lirc_code2char (config, code, &cmd) == 0 && cmd != NULL) 
  168. {
  169. execute_lirc_command(cmd);
  170. }
  171. }
  172. else
  173. {
  174. cmd = map_code_to_default(code);
  175. if (cmd)
  176. {
  177. execute_lirc_command(cmd);
  178. free(cmd);
  179. }
  180. }
  181. free (code);
  182. }
  183. /* on LIRC error, shutdown added input*/
  184. if (ret == -1) 
  185. {
  186. printf("An lirc error occuredn");
  187. /*gdk_input_remove (input_tag);*/
  188. lirc_freeconfig (config);
  189. config = NULL;
  190. lirc_deinit ();
  191. return FALSE;
  192. }
  193. return TRUE;
  194. }
  195. void start_lirc(void)
  196. {
  197. GIOChannel *ioc;
  198. if (fd<0)
  199. return;
  200. ioc = g_io_channel_unix_new(fd);
  201. g_io_add_watch(ioc, G_IO_IN, lirc_has_data_cb, NULL);
  202. }
  203. #endif