Added lirc.
[irreco.git] / lirc-0.8.4a / daemons / hw_creative.c
blob50f6cf25670d2e61bb8f9f7cfee043c30abf4c24
1 /* $Id: hw_creative.c,v 5.10 2007/07/29 18:20:07 lirc Exp $ */
3 /****************************************************************************
4 ** hw_creative.c ***********************************************************
5 ****************************************************************************
7 * routines for Creative receiver
8 *
9 * Copyright (C) 1999 Christoph Bartelmus <lirc@bartelmus.de>
13 #ifdef HAVE_CONFIG_H
14 # include <config.h>
15 #endif
17 #include <stdio.h>
18 #include <stdlib.h>
19 #include <fcntl.h>
20 #include <unistd.h>
21 #include <limits.h>
22 #include <signal.h>
23 #include <sys/stat.h>
24 #include <sys/types.h>
25 #include <sys/ioctl.h>
27 #include "hardware.h"
28 #include "serial.h"
29 #include "ir_remote.h"
30 #include "lircd.h"
31 #include "hw_creative.h"
33 #define NUMBYTES 6
34 #define TIMEOUT 20000
36 extern struct ir_remote *repeat_remote,*last_remote;
38 unsigned char b[NUMBYTES];
39 struct timeval start,end,last;
40 lirc_t gap,signal_length;
41 ir_code pre,code;
43 struct hardware hw_creative=
45 LIRC_DRIVER_DEVICE, /* default device */
46 -1, /* fd */
47 LIRC_CAN_REC_LIRCCODE, /* features */
48 0, /* send_mode */
49 LIRC_MODE_LIRCCODE, /* rec_mode */
50 32, /* code_length */
51 creative_init, /* init_func */
52 NULL, /* config_func */
53 creative_deinit, /* deinit_func */
54 NULL, /* send_func */
55 creative_rec, /* rec_func */
56 creative_decode, /* decode_func */
57 NULL, /* ioctl_func */
58 NULL, /* readdata */
59 "creative"
62 int creative_decode(struct ir_remote *remote,
63 ir_code *prep,ir_code *codep,ir_code *postp,
64 int *repeat_flagp,
65 lirc_t *min_remaining_gapp,
66 lirc_t *max_remaining_gapp)
68 if(!map_code(remote,prep,codep,postp,
69 16,pre,16,code,0,0))
71 return(0);
74 map_gap(remote, &start, &last, signal_length, repeat_flagp,
75 min_remaining_gapp, max_remaining_gapp);
77 return(1);
80 int creative_init(void)
82 signal_length=108000;
84 if(!tty_create_lock(hw.device))
86 logprintf(LOG_ERR,"could not create lock files");
87 return(0);
89 if((hw.fd=open(hw.device,O_RDWR|O_NONBLOCK|O_NOCTTY))<0)
91 logprintf(LOG_ERR,"could not open %s",hw.device);
92 logperror(LOG_ERR,"creative_init()");
93 tty_delete_lock();
94 return(0);
96 if(!tty_reset(hw.fd))
98 logprintf(LOG_ERR,"could not reset tty");
99 creative_deinit();
100 return(0);
102 if(!tty_setbaud(hw.fd,2400))
104 logprintf(LOG_ERR,"could not set baud rate");
105 creative_deinit();
106 return(0);
108 return(1);
111 int creative_deinit(void)
113 close(hw.fd);
114 tty_delete_lock();
115 return(1);
118 char *creative_rec(struct ir_remote *remotes)
120 char *m;
121 int i;
123 b[0]=0x4d;
124 b[1]=0x05;
125 b[4]=0xac;
126 b[5]=0x21;
128 last=end;
129 gettimeofday(&start,NULL);
130 for(i=0;i<NUMBYTES;i++)
132 if(i>0)
134 if(!waitfordata(TIMEOUT))
136 logprintf(LOG_ERR,"timeout reading byte %d",i);
137 return(NULL);
140 if(read(hw.fd,&b[i],1)!=1)
142 logprintf(LOG_ERR,"reading of byte %d failed",i);
143 logperror(LOG_ERR,NULL);
144 return(NULL);
146 if(b[0]!=0x4d ||
147 b[1]!=0x05 /* || b[4]!=0xac || b[5]!=0x21 */)
149 logprintf(LOG_ERR,"bad envelope");
150 return(NULL);
152 if(i==5)
154 if(b[2]!=((~b[3])&0xff))
156 logprintf(LOG_ERR,"bad checksum");
157 return(NULL);
160 LOGPRINTF(1,"byte %d: %02x",i,b[i]);
162 gettimeofday(&end,NULL);
164 /* pre=0x8435; */
165 pre=reverse((((ir_code) b[4])<<8) | ((ir_code) b[5]),16);
166 code = reverse((((ir_code) b[2]) << 8) | ((ir_code) b[3]), 16);
168 m=decode_all(remotes);
169 return(m);