summaryrefslogtreecommitdiff
path: root/irdev.c
diff options
context:
space:
mode:
authorjacomi1999-01-25 18:35:13 +0000
committerjacomi1999-01-25 18:35:13 +0000
commitca51f6abf6debc1b6718f59129886fea04ee12b0 (patch)
treeb074cbd71c73bfa0d39a28f73e19cd8d28a653f6 /irdev.c
parentf63e7d593f9a1ca8152ec8180ac052e75c892a60 (diff)
downloadirbox-ca51f6abf6debc1b6718f59129886fea04ee12b0.zip
irbox-ca51f6abf6debc1b6718f59129886fea04ee12b0.tar.gz
irbox-ca51f6abf6debc1b6718f59129886fea04ee12b0.tar.bz2
irbox-ca51f6abf6debc1b6718f59129886fea04ee12b0.tar.xz
new directory structure and data
Diffstat (limited to 'irdev.c')
-rw-r--r--irdev.c290
1 files changed, 0 insertions, 290 deletions
diff --git a/irdev.c b/irdev.c
deleted file mode 100644
index 88f5a2c..0000000
--- a/irdev.c
+++ /dev/null
@@ -1,290 +0,0 @@
-/*
- *
- * IRBOX, an Ivy driver for infra-red remote controls
- *
- * Copyright 1998-1999
- * Centre d'Etudes de la Navigation Aerienne
- *
- * Device driver
- *
- * Authors: Francois-Regis Colin <fcolin@cenatoulouse.dgac.fr>
- * Yann Malichecq
- * Stephane Chatty <chatty@cenatoulouse.dgac.fr>
- *
- *
- * $Id$
- *
- * Please refer to file version.h for the
- * copyright notice regarding this software
- */
-
-#include <stdio.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <sys/errno.h>
-#include <sys/param.h>
-#include <termio.h>
-#include <sys/ioctl.h>
-
-#include "irdev.h"
-
-
-#define CHECKEDWRITE(fd , buff , len ) \
- if (write( fd, buff, len) != len) { perror("IR write"); return -1; }
-
-#define NBITS 8
-#define SET(n, p) ((p)[(n)/NBITS] |= ((unsigned)1 << ((n) % NBITS)))
-#define CLR(n, p) ((p)[(n)/NBITS] &= ~((unsigned)1 << ((n) % NBITS)))
-#define ISSET(n, p) ((p)[(n)/NBITS] & ((unsigned)1 << ((n) % NBITS)))
-
-struct ir_state {
- int fd;
- IrEvtCallback callback;
- IrFailCallback fail_callback;
- IrTimerSetter set_timeout;
- IrTimerCanceller cancel_timeout;
-
- /* state machine stuff */
- char state;
- unsigned char value[6];
-
- void *checkinit_id;
-
- /* misc. std. driver stuff */
- unsigned char initialized;/* true if data structures are set */
- /* and init sequence has been sent to */
- /* device */
- unsigned char ready; /* true if we've received confirmation */
- /* of the init sequence from the device */
- unsigned char errorCount;/* count of bad messages for recovery */
-};
-
-
-static int IrInitDevice (IrState*);
-
-
-int
-IrInit (IrState *ir, IrEvtCallback cb, IrFailCallback f, IrTimerSetter st, IrTimerCanceller ct)
-{
- ir->callback = cb;
- ir->fail_callback = f;
- ir->set_timeout = st;
- ir->cancel_timeout = ct;
- return IrInitDevice (ir);
-}
-
-
-
-static void
-IrCheckInit (void * id, IrState *ir, int delta)
-{
- if ((!ir->ready) && (ir->checkinit_id)) {
- if (ir->errorCount++<5) {
- IrInitDevice (ir);
- return;
- } else {
- /* pas de reponse, on abandonne */
- if (ir->fail_callback)
- (*ir->fail_callback)(ir);
- }
- }
- ir->checkinit_id= 0;
- return;
-}
-
-
-#define SPEED B9600
-
-/* ARGSUSED */
-static int
-IrInitDevice (IrState *ir)
-{
- unsigned char dcmd[2];
- struct termios terms;
-
- /*initialisation du port serie */
- if (tcgetattr (ir->fd, &terms) == -1) {
- perror ( "Cant get device configuration for IR box");
- return 0;
- }
-
- /* change the modes */
- cfmakeraw (&terms);
- terms.c_lflag = 0;
-
- if (cfsetospeed (&terms, SPEED) < 0 ) {
- perror ("Can't set ouput speed for IR box");
- return 0;
- }
-
- if (cfsetispeed (&terms, SPEED) < 0 ) {
- perror ("Can't set input speed for IR box");
- return 0;
- }
-
- if (tcsetattr (ir->fd, TCSANOW, &terms) < 0)
- {
- perror ("Can't change device configuration for IR box");
- return 0;
- }
-
- /* discard all unread or unwritten data */
- tcflush (ir->fd, TCIOFLUSH );
-
-#ifdef DEBUG
- fprintf (stderr, "IR box initialization in progress.....\n");
-#endif
- dcmd[0] = 'I';
- dcmd[1] = 'R';
- CHECKEDWRITE(ir->fd, dcmd, sizeof(dcmd));
-
- ir->initialized= 1;
- if (ir->set_timeout)
- ir->checkinit_id = (*ir->set_timeout)(IrCheckInit, 1000, ir);
- return 1;
-}
-
-
-
-
-static void
-IrSetup (IrState *ir)
-{
- ir->ready=1;
- if (ir->cancel_timeout)
- (*ir->cancel_timeout)(ir->checkinit_id);
-
- ir->errorCount= 0;
- return;
-}
-
-
-static void
-IrDecodeInit (IrState *ir, char ch)
-{
- /* on doit attendre les caracteres "OK" */
- switch (ir->state) {
- case 0:
- if ( ch == 'O' )
- ir->state++;
- break;
- case 1:
- if ( ch == 'K' ) {
- ir->state = 0;
-#ifdef DEBUG
- fprintf (stderr,"IR box initialized OK.\n");
-#endif
- IrSetup (ir);
- ir->errorCount = 0;
- } else {
- fprintf (stderr, "unexpected char %d from IR box\n", ch);
- if (ir->errorCount++ > 5) {
- /* try to reinitialize */
- fprintf (stderr,"Reinitializing IR box\n");
-
- IrInitDevice (ir);
- }
- }
- break;
- default:
- fprintf (stderr,"Impossible state %d in ir_intr.\n", ir->state);
- ir->state = 0;
- break;
- }
-}
-
-
-static void
-IrDecodeFrame (IrState *ir, char ch)
-{
- ir->value[(int)(ir->state++)] = ch;
-
- /* fin de trame de 6 caracteres */
- if (ir->state == 6) {
-#ifdef DEBUG
- fprintf (stdout, "%.3d %.3d %.3d %.3d %.3d %.3d\n", ir->value[0], ir->value[1],ir->value[2],ir->value[3],ir->value[4],ir->value[5]);
-#endif
- if (ir->callback)
- (*ir->callback)(ir, ir->value );
- ir->state = 0;
- }
-}
-
-void
-IrIntr (IrState *ir)
-{
- unsigned char buf[128];
- unsigned char *str;
- int len;
- register unsigned char ch;
-#ifdef DEBUG_RECEIVE
- int i;
-#endif
- if ((len = read(ir->fd, buf, sizeof(buf))) < 0)
- return;
-#ifdef DEBUG_RECEIVE
- fprintf (stderr, "received %d bytes from device \n",len);
- for ( i = 0; i < len ; i ++ )
- fprintf(stderr, "0x%02x ",buf[i]);
- fprintf(stderr, "\n");
-#endif
- str = buf;
- while (len > 0) {
- ch = *str++;
- if (!ir->ready) /* on doit attendre les caracteres OK */
- IrDecodeInit (ir,ch);
- else /* on doit attendre la fin de la trame ( 6 car ) */
- IrDecodeFrame (ir, ch);
- len--;
- }
- return;
-}
-
-/* ARGSUSED */
-IrState*
-IrOpen (const char *name )
-{
- register IrState *ir;
-
- if ( !(ir = (IrState *)malloc(sizeof *ir)))
- return NULL;
- /* Set defaults -- totally arbitrary, my choice */
- memset( ir, 0, sizeof *ir ) ;
-
- if ((ir->fd = open(name, O_RDWR/*|O_NONBLOCK*/)) < 0) {
- fprintf(stderr, "Couldn't open %s\n", name);
- free( ir );
- return NULL;
-
- }
-
-
- ir->initialized = 1;
- ir->errorCount = 0;
- ir->state = 0;
-
-
- return ir;
-}
-
-/* ARGSUSED */
-void
-IrClose (IrState *ir)
-{
- if (ir->checkinit_id) {
- if (ir->cancel_timeout )
- (*ir->cancel_timeout)( ir->checkinit_id );
- ir->checkinit_id= 0;
- }
- free (ir);
-}
-
-int
-IrGetFd (IrState *ir)
-{
- return ir->fd;
-}