File: irman.c

package info (click to toggle)
libirman 0.5.2-5
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, forky, sid, trixie
  • size: 1,656 kB
  • sloc: sh: 4,099; ansic: 1,541; makefile: 82
file content (145 lines) | stat: -rw-r--r-- 3,312 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/****************************************************************************
** hw_irman.c **********************************************************
****************************************************************************
*
* routines for Irman
*
* Copyright (C) 1999 Christoph Bartelmus <lirc@bartelmus.de>
*
*/

#ifdef HAVE_CONFIG_H
# include <config.h>
#endif

#ifndef LIRC_IRTTY
#define LIRC_IRTTY "/dev/ttyS0"
#endif

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <limits.h>
#include <signal.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <irman.h>

#include "lirc_driver.h"
#include "lirc/serial.h"

static const logchannel_t logchannel = LOG_DRIVER;

unsigned char* codestring;
struct timeval start, end, last;
lirc_t gap;
ir_code code;

#define CODE_LENGTH 64

//Forwards:
static int irman_decode(struct ir_remote* remote, struct decode_ctx_t* ctx);
static int irman_init(void);
static int irman_deinit(void);
static char* irman_rec(struct ir_remote* remotes);


const struct driver hw_irman = {
	.name		= "irman",
	.device		= LIRC_IRTTY,
	.features	= LIRC_CAN_REC_LIRCCODE,
	.send_mode	= 0,
	.rec_mode	= LIRC_MODE_LIRCCODE,
	.code_length	= CODE_LENGTH,
	.init_func	= irman_init,
	.deinit_func	= irman_deinit,
	.open_func	= default_open,
	.close_func	= default_close,
	.send_func	= NULL,
	.rec_func	= irman_rec,
	.decode_func	= irman_decode,
	.drvctl_func	= NULL,
	.readdata	= NULL,
	.api_version	= 3,
	.driver_version = "0.9.3",
	.info		= "See file://" PLUGINDOCS "/irman.html",
	.device_hint    = "/dev/tty[0-9]*",
};

const struct driver* hardwares[] = { &hw_irman, (const struct driver*)NULL };


int irman_decode(struct ir_remote* remote, struct decode_ctx_t* ctx)
{
	if (!map_code(remote, ctx, 0, 0, CODE_LENGTH, code, 0, 0))
		return 0;

	map_gap(remote, ctx, &start, &last, 0);

	return 1;
}

int irman_init(void)
{
	if (!tty_create_lock(drv.device)) {
		logprintf(LIRC_ERROR, "could not create lock files");
		return 0;
	}
	drv.fd = ir_init((char*)drv.device);
	if (drv.fd < 0) {
		logprintf(LIRC_ERROR, "could not open %s", drv.device);
		logperror(LIRC_ERROR, "irman_init()");
		tty_delete_lock();
		return 0;
	}
	return 1;
}

int irman_deinit(void)
{
	ir_finish();
	sleep(1);               /* give hardware enough time to reset */
	close(drv.fd);
	tty_delete_lock();
	return 1;
}

char* irman_rec(struct ir_remote* remotes)
{
	static char* text = NULL;
	int i;

	last = end;
	gettimeofday(&start, NULL);
	codestring = ir_get_code();
	gettimeofday(&end, NULL);
	if (codestring == NULL) {
		if (errno == IR_EDUPCODE) {
			log_debug("received \"%s\" (dup)", text ? text : "(null - bug)");
		} else if (errno == IR_EDISABLED) {
			log_debug("irman not initialised (this is a bug)");
		} else {
			log_debug("error reading code: \"%s\"", ir_strerror(errno));
		}
		if (errno == IR_EDUPCODE)
			return decode_all(remotes);
		return NULL;
	}

	text = ir_code_to_text(codestring);
	log_debug("received \"%s\"", text);

	/* this is only historical but it's necessary for
	 * compatibility to older versions and it's handy to
	 * recognize Irman config files */
	code = 0xffff;

	for (i = 0; i < IR_CODE_LEN; i++) {
		code = code << 8;
		code = code | (ir_code)(unsigned char)codestring[i];
	}

	return decode_all(remotes);
}