int32_t set_signal(int fd, MonoSerialSignal signal, boolean value) { #ifdef TOMIC_DEVICE_V1 if (signal == Dtr) { if (!value) return serial_command("pullup"); else return serial_command("pulldown"); } #endif int signals, expected, activated; expected = get_signal_code(signal); if (ioctl(fd, TIOCMGET, &signals) == -1) return -1; activated = (signals & expected) != 0; if (activated == value) /* Already set */ return 1; if (value) signals |= expected; else signals &= ~expected; if (ioctl(fd, TIOCMSET, &signals) == -1) return -1; return 1; }
int controller_set(struct serialsosurce *ss, int id, int status) { struct serialcommand sc; switch(status) { case 0: getWriteCommandFrame(sc.buf, &sc.sz, id, 1, "0000"); break; case 1: getWriteCommandFrame(sc.buf, &sc.sz, id, 1, "0001"); break; default: fprintf(stderr, "device status number error\n"); return -1; } int fd[2]; pipe(fd); sc.cxt = (void *)fd[1]; sc.cb = _cb_async; serial_command(ss, &sc); char buf[255]; int sz; int ret; /*select return value*/ struct timeval tv; fd_set readset; FD_ZERO(&readset); FD_SET(fd[0],&readset); tv.tv_sec = 2; tv.tv_usec = 0; if((ret = select((fd[0]+1),&readset,NULL,NULL,&tv)) < 0){ printf("select error\n"); return -1; }else if(ret == 0){ printf("filedes not ready\n"); return -1; } sz = read(fd[0], buf, 255); int i; for (i = 0; i < sz; i++) { printf("%02x ", buf[i]); } printf("\n"); close(fd[0]); close(fd[1]); if (buf[0] == 0x06) { return 0; } else { return -1; } }
int controller_get(struct serialsosurce *ss, int id, int *status) { struct serialcommand sc; getReadCommandFrame(sc.buf, &sc.sz, id, 1); int fd[2]; pipe(fd); sc.cxt = (void *)fd[1]; sc.cb = _cb_async; serial_command(ss, &sc); char buf[255]; int sz; int ret; /*select return*/ struct timeval tv; fd_set readset; tv.tv_sec = 2; tv.tv_usec = 0; FD_ZERO(&readset); FD_SET(fd[0],&readset);/*let fd[0] seted in readset*/ if((ret = select(( fd[0]+1),&readset,NULL,NULL,&tv))< 0){ printf("select error\n"); return -1; }else if(ret == 0){ printf("filedes are not ready for read within 5s\n"); return -1; } sz = read(fd[0], buf, 255); int i; for (i = 0; i < sz; i++) { printf("%02x ", buf[i]); } printf("\n"); close(fd[0]); close(fd[1]); // printf("buf[2] = %x\n", buf[2]); if (buf[2] == 0x31) { *status = 1; } else if (buf[2] == 0x30) { *status = 0; } else { return -1; } return 0; }
int sensor_get(struct serialsosurce *ss, int id, int *data) { struct serialcommand sc; getReadCommandFrame(sc.buf, &sc.sz, id, 1); int fd[2]; pipe(fd); sc.cxt = (void *)fd[1]; sc.cb = _cb_async; serial_command(ss, &sc); char buf[255]; int sz; int ret; /*select return value*/ struct timeval tv; fd_set readset; FD_ZERO(&readset); FD_SET(fd[0],&readset); tv.tv_sec = 2; tv.tv_usec = 0; if((ret = select((fd[0]+1),&readset,NULL,NULL,&tv)) < 0){ printf("select error\n"); return -1; }else if(ret == 0){ printf("filedes not ready\n"); return -1; } sz = read(fd[0], buf, 255); // int i; // for (i = 0; i < sz; i++) { // printf("%02x ", buf[i]); // } // // printf("\n"); close(fd[0]); close(fd[1]); printf("buf:%c\n",buf[1]); int x; buf4_to_integer(&buf[1], &x); *data = x; return 0; }