Пример #1
0
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;
}
Пример #2
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;
}
Пример #3
0
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;
}
Пример #4
0
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;
}
Пример #5
0
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;
}
Пример #6
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;
}
Пример #7
0
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;
}