From: Brian G. <ge...@us...> - 2007-04-24 15:20:21
|
Update of /cvsroot/playerstage/code/player/server/drivers/mixed/irobot/roomba In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv27174/server/drivers/mixed/irobot/roomba Modified Files: Tag: release-2-0-patches roomba_comms.c roomba_comms.h Log Message: merged driver changes from HEAD Index: roomba_comms.h =================================================================== RCS file: /cvsroot/playerstage/code/player/server/drivers/mixed/irobot/roomba/roomba_comms.h,v retrieving revision 1.5 retrieving revision 1.5.2.1 diff -C2 -d -r1.5 -r1.5.2.1 *** roomba_comms.h 3 Mar 2006 02:53:08 -0000 1.5 --- roomba_comms.h 24 Apr 2007 22:20:20 -0000 1.5.2.1 *************** *** 134,137 **** --- 134,146 ---- int roomba_clean(roomba_comm_t* r); + int roomba_set_song(roomba_comm_t* r, unsigned char songNumber, + unsigned char songLength, unsigned char *notes, + unsigned char *noteLengths); + int roomba_play_song(roomba_comm_t *r, unsigned char songNumber); + + int roomba_vacuum(roomba_comm_t *r, int state); + int roomba_set_leds(roomba_comm_t *r, uint8_t dirt_detect, uint8_t max, + uint8_t clean, uint8_t spot, uint8_t status, + uint8_t power_color, uint8_t power_intensity ); #ifdef __cplusplus Index: roomba_comms.c =================================================================== RCS file: /cvsroot/playerstage/code/player/server/drivers/mixed/irobot/roomba/roomba_comms.c,v retrieving revision 1.9 retrieving revision 1.9.2.1 diff -C2 -d -r1.9 -r1.9.2.1 *** roomba_comms.c 5 Apr 2006 23:33:54 -0000 1.9 --- roomba_comms.c 24 Apr 2007 22:20:20 -0000 1.9.2.1 *************** *** 79,83 **** // Open it. non-blocking at first, in case there's no roomba if((r->fd = open(r->serial_port, ! O_RDWR | O_SYNC | O_NONBLOCK, S_IRUSR | S_IWUSR )) < 0 ) { perror("roomba_open():open():"); --- 79,83 ---- // Open it. non-blocking at first, in case there's no roomba if((r->fd = open(r->serial_port, ! O_RDWR | O_NONBLOCK, S_IRUSR | S_IWUSR )) < 0 ) { perror("roomba_open():open():"); *************** *** 304,308 **** while(totalnumread < sizeof(databuf)) { ! if((retval = poll(ufd,1,timeout)) < 0) { if(errno == EINTR) --- 304,310 ---- while(totalnumread < sizeof(databuf)) { ! retval = poll(ufd,1,timeout); ! ! if(retval < 0) { if(errno == EINTR) *************** *** 315,319 **** --- 317,324 ---- } else if(retval == 0) + { + printf("roomba_get_sensors: poll timeout\n"); return(-1); + } else { *************** *** 326,331 **** { totalnumread += numread; ! /* ! printf("read %d bytes; buffer so far:\n", numread); for(i=0;i<totalnumread;i++) printf("%x ", databuf[i]); --- 331,335 ---- { totalnumread += numread; ! /*printf("read %d bytes; buffer so far:\n", numread); for(i=0;i<totalnumread;i++) printf("%x ", databuf[i]); *************** *** 376,380 **** r->overcurrent_mainbrush = (flag >> 2) & 0x01; r->overcurrent_driveright = (flag >> 3) & 0x01; ! r->overcurrent_driveleft = (flag >> 3) & 0x01; r->dirtdetector_left = buf[idx++]; --- 380,384 ---- r->overcurrent_mainbrush = (flag >> 2) & 0x01; r->overcurrent_driveright = (flag >> 3) & 0x01; ! r->overcurrent_driveleft = (flag >> 4) & 0x01; r->dirtdetector_left = buf[idx++]; *************** *** 469,470 **** --- 473,553 ---- } + + int roomba_set_song(roomba_comm_t* r, unsigned char songNumber, unsigned char songLength, unsigned char *notes, unsigned char *noteLengths) + { + int size = 2*songLength+3; + unsigned char cmdbuf[size]; + unsigned char i; + + cmdbuf[0] = ROOMBA_OPCODE_SONG; + cmdbuf[1] = songNumber; + cmdbuf[2] = songLength; + + for (i=0; i < songLength; i++) + { + cmdbuf[3+(2*i)] = notes[i]; + cmdbuf[3+(2*i)+1] = noteLengths[i]; + } + + if(write(r->fd, cmdbuf, size) < 0) + { + perror("roomba_set_song():write():"); + return(-1); + } + else + return(0); + } + + int + roomba_play_song(roomba_comm_t *r, unsigned char songNumber) + { + unsigned char cmdbuf[2]; + + cmdbuf[0] = ROOMBA_OPCODE_PLAY; + cmdbuf[1] = songNumber; + + if(write(r->fd, cmdbuf, 2) < 0) + { + perror("roomba_set_song():write():"); + return(-1); + } + else + return(0); + } + + int + roomba_vacuum(roomba_comm_t *r, int state) + { + unsigned char cmdbuf[2]; + + cmdbuf[0] = ROOMBA_OPCODE_MOTORS; + cmdbuf[1] = state; + + if (write(r->fd, cmdbuf, 2) < 0) + { + perror("roomba_vacuum():write():"); + return -1; + } + + return 0; + } + + int + roomba_set_leds(roomba_comm_t *r, uint8_t dirt_detect, uint8_t max, uint8_t clean, uint8_t spot, uint8_t status, uint8_t power_color, uint8_t power_intensity ) + { + unsigned char cmdbuf[5]; + cmdbuf[0] = ROOMBA_OPCODE_LEDS; + cmdbuf[1] = dirt_detect | max<<1 | clean<<2 | spot<<3 | status<<4; + cmdbuf[2] = power_color; + cmdbuf[3] = power_intensity; + + printf("Set LEDS[%d][%d][%d]\n",cmdbuf[1], cmdbuf[2], cmdbuf[3]); + if (write(r->fd, cmdbuf, 4) < 0) + { + perror("roomba_set_leds():write():"); + return -1; + } + + return 0; + } + |