/* * dispatch.c : Network CAMAC library for PCI / pipeline CAMAC controller * Copyright 2003 (C) 2003 Yoshiji Yasu . * * version: 0.1 25-JUN-2003, born * 0.2 11-AUG-2003, beta release * 0.3 03-OCT-2003, add cam_getint routine * 0.4 07-JAN-2004, bug fix for cam_wait_lam and cam_wait_trig * 0.5 31-OCT-2006, bug fix for cam_wait_lam */ #include "ccnet.h" #include "pcc.h" static int cc_fd; static int status; int dispatch( int *rcvbuf, int rcvlen, int *sndbuf, int *sndlen ) { int length = rcvbuf[0]; int command = rcvbuf[1]; sndbuf[1] = rcvbuf[1]; /* copy command */ #ifdef DEBUG printf("dispatch: length = %d : command = %d\n", length, command); #endif switch (command ) { case CC_OPEN: cc_fd = cam_open(); if( cc_fd < 0 ) status = -1; else status = 0; *sndlen = sndbuf[0] = HEADER_SIZE; #ifdef DEBUG printf("cam_open: done\n"); #endif break; case CC_CLOSE: cam_close(cc_fd); status = -5; *sndlen = sndbuf[0] = HEADER_SIZE; #ifdef DEBUG printf("cam_close: done\n"); #endif break; case CC_DUMP: status = cam_dump_pccreg(cc_fd, (struct pccreg *)&rcvbuf[2]); if( status ) status = -1; memcpy((char *)&sndbuf[2], (const void *)&rcvbuf[2], sizeof(struct pccreg) ); status = 0; *sndlen = sndbuf[0] = HEADER_SIZE + sizeof(struct pccreg); break; case CC_RESET: status = cam_reset( cc_fd ); if( status ) status = -1; *sndlen = sndbuf[0] = HEADER_SIZE; break; case CC_CLRFIFO: status = cam_clear_fifo( cc_fd ); if( status ) status = -1; *sndlen = sndbuf[0] = HEADER_SIZE; break; case CC_PUT: status = cam_put( cc_fd, rcvbuf[2], rcvbuf[3] ); if( status ) status = -1; *sndlen = sndbuf[0] = HEADER_SIZE; break; case CC_GET: status = cam_get( cc_fd, &sndbuf[2], &sndbuf[3] ); if( status ) status = -1; *sndlen = sndbuf[0] = HEADER_SIZE+sizeof(int)*2; break; case CC_GETINT: status = cam_getint( cc_fd, &sndbuf[2], &sndbuf[3] ); if( status ) status = -1; *sndlen = sndbuf[0] = HEADER_SIZE+sizeof(int)*2; break; case CC_EXEC_PIO: // printf("CC_EXEC_PIO is called\n"); sndbuf[2] = MAX_FRAME_LENGTH; status = cam_exec_pio( cc_fd, &rcvbuf[2], &sndbuf[2] ); if( status ) status = -1; *sndlen = sndbuf[0] = HEADER_SIZE+8+sndbuf[3]*8; break; case CC_EXEC_DMA: // printf("CC_EXEC_DMA is called\n"); sndbuf[2] = MAX_FRAME_LENGTH; status = cam_exec_dma( cc_fd, &rcvbuf[2], &sndbuf[2] ); if( status ) status = -1; *sndlen = sndbuf[0] = HEADER_SIZE+8+sndbuf[3]*8; break; case CC_EXEC_SEQ: sndbuf[2] = MAX_FRAME_LENGTH; status = cam_exec_dma_seq( cc_fd, &rcvbuf[2], &sndbuf[2] ); if( status ) status = -1; *sndlen = sndbuf[0] = HEADER_SIZE+8+sndbuf[3]*8; break; case CC_EXEC: sndbuf[2] = MAX_FRAME_LENGTH; status = cam_exec( cc_fd, &rcvbuf[2], &sndbuf[2] ); if( status ) status = -1; *sndlen = sndbuf[0] = HEADER_SIZE+8+sndbuf[3]*8; break; case CC_ENABLE_LAM: status = cam_enable_lam( cc_fd, rcvbuf[2]); if (status) status -1; *sndlen = sndbuf[0] = HEADER_SIZE; break; case CC_LAM: status = cam_wait_lam( cc_fd, &sndbuf[2], rcvbuf[2]); if(status) sndbuf[2] = 0; // this means timeout. status = 0; *sndlen = sndbuf[0] = HEADER_SIZE+sizeof(int); break; case CC_DISABLE_LAM: status = cam_disable_lam( cc_fd ); if (status) status -1; *sndlen = sndbuf[0] = HEADER_SIZE; break; case CC_ENABLE_TRIG: status = cam_enable_trig( cc_fd ); if (status) status -1; *sndlen = sndbuf[0] = HEADER_SIZE; break; case CC_TRIG: status = cam_wait_trig( cc_fd, &sndbuf[2], rcvbuf[2]); if( status ) sndbuf[2] = 0; // this means timeout. status = 0; *sndlen = sndbuf[0] = HEADER_SIZE+sizeof(int); break; case CC_DISABLE_TRIG: status = cam_disable_trig( cc_fd ); if (status) status -1; *sndlen = sndbuf[0] = HEADER_SIZE; #ifdef DEBUG printf("cam_disable_trig: done\n"); #endif break; default: printf("dispatch:no function\n"); } return status; }