static int firestep_writeCore(const char *buf, size_t bufsize) { char message[WRITEBUFMAX+4]; if (bufsize > WRITEBUFMAX) { memcpy(message, buf, WRITEBUFMAX); message[WRITEBUFMAX] = '.'; message[WRITEBUFMAX+1] = '.'; message[WRITEBUFMAX+2] = '.'; message[WRITEBUFMAX+3] = 0; } else { memcpy(message, buf, bufsize); message[bufsize] = 0; } char *s; for (s = message; *s; s++) { switch (*s) { case '\n': case '\r': *s = ' '; break; } } LOGDEBUG1("firestep_write %s start", message); ssize_t rc = write(fdwTinyG, buf, bufsize); if (rc == bufsize) { LOGINFO2("firestep_write %s (%ldB)", message, bufsize); } else { LOGERROR2("firestep_write %s -> [%ld]", message, rc); } return rc < 0 ? rc : 0; }
int firestep_init(){ if (fdrTinyG >= 0) { return 0; // already started } const char * path = "/dev/ttyUSB0"; char cmdbuf[CMDMAX+1]; int rc; sprintf(cmdbuf, "stty 115200 -F %s", path); rc = callSystem(cmdbuf); if (rc) { return rc; } sprintf(cmdbuf, "stty 1400:4:1cb2:a00:3:1c:7f:15:4:1:1:0:11:13:1a:0:12:f:17:16:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0 -F %s", path); rc = callSystem(cmdbuf); if (rc) { return rc; } fdwTinyG = fdrTinyG = open(path, O_RDWR | O_ASYNC | O_NONBLOCK); if (fdrTinyG < 0) { rc = errno; LOGERROR2("Cannot open %s (errno %d)", path, rc); return rc; } LOGINFO1("firestep_init %s (open for write) ", path); LOGRC(rc, "pthread_create(firestep_reader) -> ", pthread_create(&tidReader, NULL, &firestep_reader, NULL)); //firestep_config(); return rc; }
int firefuse_write(const char *path, const char *buf, size_t bufsize, off_t offset, struct fuse_file_info *fi) { LOGTRACE1("firefuse_write(%s)", path); if (!buf) { LOGERROR1("firefuse_write %s -> null buffer", path); return EINVAL; } if (is_cv_path(path)) { return cve_write(path, buf, bufsize, offset, fi); } if (offset) { LOGERROR2("firefuse_write %s -> non-zero offset:%ld", path, (long) offset); return EINVAL; } if (is_cnc_path(path)) { return cnc_write(path, buf, bufsize, offset, fi); } if (strcmp(path, ECHO_PATH) == 0) { if (bufsize > MAX_ECHO) { sprintf(echoBuf, "firefuse_write %s -> string too long (%ld > %d bytes)", path, bufsize, MAX_ECHO); LOGERROR1("%s", echoBuf); return EINVAL; } memcpy(echoBuf, buf, bufsize); echoBuf[bufsize] = 0; LOGINFO2("firefuse_write %s -> %s", path, echoBuf); } else if (strcmp(path, FIRELOG_PATH) == 0) { switch (buf[0]) { case 'E': case 'e': case '0': firelog_level(FIRELOG_ERROR); break; case 'W': case 'w': case '1': firelog_level(FIRELOG_WARN); break; case 'I': case 'i': case '2': firelog_level(FIRELOG_INFO); break; case 'D': case 'd': case '3': firelog_level(FIRELOG_DEBUG); break; case 'T': case 't': case '4': firelog_level(FIRELOG_TRACE); break; } } else if (strcmp(path, FIRESTEP_PATH) == 0) { firestep_write(buf, bufsize); } return bufsize; }
static int firefuse_rename(const char *path1, const char *path2) { //LOGTRACE2("firefuse_rename(%s,%s)", path1, path2); if (is_cv_path(path1) && is_cv_path(path2)) { return cve_rename(path1, path2); } LOGERROR2("firefuse_rename(%s,%s) -> -ENOENT", path1, path2); return -ENOENT; }
static int callSystem(char *cmdbuf) { int rc = 0; rc = system(cmdbuf); if (rc == -1) { LOGERROR2("callSystem(%s) -> %d", cmdbuf, rc); return rc; } if (WIFEXITED(rc)) { if (WEXITSTATUS(rc)) { LOGERROR2("callSystem(%s) -> EXIT %d", cmdbuf, WEXITSTATUS(rc)); return rc; } } else if (WIFSTOPPED(rc)) { LOGERROR2("callSystem(%s) -> STOPPED %d", cmdbuf, WSTOPSIG(rc)); return rc; } else if (WIFSIGNALED(rc)) { LOGERROR2("callSystem(%s) -> SIGNALED %d", cmdbuf, WTERMSIG(rc)); return rc; } LOGINFO1("callSystem(%s)", cmdbuf); return 0; }
int firefuse_read(const char *path, char *buf, size_t size, off_t offset, struct fuse_file_info *fi) { if (is_cv_path(path)) { int res = cve_read(path, buf, size, offset, fi); if (res > 0) { bytes_read += res; } return res; } if (is_cnc_path(path)) { int res = cnc_read(path, buf, size, offset, fi); if (res > 0) { bytes_read += res; } return res; } LOGTRACE1("firefuse_read(%s)", path); size_t sizeOut = size; size_t len; (void) fi; if (strcmp(path, STATUS_PATH) == 0) { const char *status_str = firepick_status(); sizeOut = firefuse_readBuffer(buf, status_str, size, offset, strlen(status_str)); } else if (strcmp(path, CONFIG_PATH) == 0) { sizeOut = firefuse_readBuffer(buf, pConfigJson, size, offset, strlen(pConfigJson)); } else if (strcmp(path, HOLES_PATH) == 0) { const char *holes_str = "holes"; sizeOut = firefuse_readBuffer(buf, holes_str, size, offset, strlen(holes_str)); } else if (strcmp(path, ECHO_PATH) == 0) { sizeOut = firefuse_readBuffer(buf, echoBuf, size, offset, strlen(echoBuf)); } else if (strcmp(path, FIRELOG_PATH) == 0) { char *str = "Actual log is " FIRELOG_FILE "\n"; sizeOut = firefuse_readBuffer(buf, str, size, offset, strlen(str)); } else if (strcmp(path, FIRESTEP_PATH) == 0) { const char *json = firestep_json(); sizeOut = firefuse_readBuffer(buf, json, size, offset, strlen(json)); } else { LOGERROR2("firefuse_read(%s, %ldB) ENOENT", path, size); return -ENOENT; } LOGTRACE3("firefuse_read(%s, %ldB) -> %ldB", path, size, sizeOut); bytes_read += sizeOut; return sizeOut; }
static void * firestep_reader(void *arg) { #define READBUFLEN 100 char readbuf[READBUFLEN]; LOGINFO("firestep_reader listening..."); if (fdrTinyG >= 0) { char c; char loop = true; while (loop) { int rc = read(fdrTinyG, readbuf, READBUFLEN); if (rc < 0) { if (errno == EAGAIN) { sched_yield(); continue; } LOGERROR2("firestep_reader %s [ERRNO:%d]", inbuf, errno); break; } if (rc == 0) { sched_yield(); // nothing available to read continue; } else { int i; for (i = 0; i < rc; i++) { if (!firestep_readchar(readbuf[i])) { loop = false; break; } } } } } LOGINFO("firestep_reader exit"); return NULL; }