static int firestep_readchar(int c) { switch (c) { case EOF: inbuf[inbuflen] = 0; inbuflen = 0; LOGERROR1("firestep_readchar %s[EOF]", inbuf); return 0; case '\n': inbuf[inbuflen] = 0; if (inbuflen) { // discard blank lines if (strncmp("{\"sr\"",inbuf, 5) == 0) { LOGDEBUG2("firestep_readchar %s (%dB)", inbuf, inbuflen); } else { LOGINFO2("firestep_readchar %s (%dB)", inbuf, inbuflen); } } else { inbufEmptyLine++; if (inbufEmptyLine % 1000 == 0) { LOGWARN1("firestep_readchar skipped %ld blank lines", inbufEmptyLine); } } inbuflen = 0; break; case '\r': // skip break; case 'a': case 'A': case 'b': case 'B': case 'c': case 'C': case 'd': case 'D': case 'e': case 'E': case 'f': case 'F': case 'g': case 'G': case 'h': case 'H': case 'i': case 'I': case 'j': case 'J': case 'k': case 'K': case 'l': case 'L': case 'm': case 'M': case 'n': case 'N': case 'o': case 'O': case 'p': case 'P': case 'q': case 'Q': case 'r': case 'R': case 's': case 'S': case 't': case 'T': case 'u': case 'U': case 'v': case 'V': case 'w': case 'W': case 'x': case 'X': case 'y': case 'Y': case 'z': case 'Z': case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '.': case '-': case '_': case '/': case '{': case '}': case '(': case ')': case '[': case ']': case '<': case '>': case '"': case '\'': case ':': case ',': case ' ': case '\t': if (c == '{') { if (jsonDepth++ <= 0) { jsonLen = 0; } ADD_JSON(c); } else if (c == '}') { ADD_JSON(c); if (--jsonDepth < 0) { LOGWARN1("Invalid JSON %s", jsonBuf); return 0; } } else { ADD_JSON(c); } if (inbuflen >= INBUFMAX) { inbuf[INBUFMAX] = 0; LOGERROR1("firestep_readchar overflow %s", inbuf); break; } else { inbuf[inbuflen] = c; inbuflen++; LOGTRACE2("firestep_readchar %x %c", (int) c, (int) c); } break; default: // discard unexpected character (probably wrong baud rate) LOGTRACE2("firestep_readchar %x ?", (int) c, (int) c); break; } return 1; }
bool EspDrv::getData(uint8_t connId, uint8_t *data, bool peek, bool* connClose) { if (connId!=_connId) return false; // see Serial.timedRead long _startMillis = millis(); do { if (espSerial->available()) { if (peek) { *data = (char)espSerial->peek(); } else { *data = (char)espSerial->read(); _bufPos--; } //Serial.print((char)*data); if (_bufPos == 0) { // after the data packet a ",CLOSED" string may be received // this means that the socket is now closed delay(5); if (espSerial->available()) { //LOGDEBUG(".2"); //LOGDEBUG(espSerial->peek()); // 48 = '0' if (espSerial->peek()==48+connId) { int idx = readUntil(500, ",CLOSED\r\n", false); if(idx!=NUMESPTAGS) { LOGERROR(F("Tag CLOSED not found")); } LOGDEBUG(); LOGDEBUG(F("Connection closed")); *connClose=true; } } } return true; } } while(millis() - _startMillis < 2000); // timed out, reset the buffer LOGERROR1(F("TIMEOUT:"), _bufPos); _bufPos = 0; _connId = 0; *data = 0; return false; }
int firefuse_getattr(const char *path, struct stat *stbuf) { if (is_cv_path(path)) { return cve_getattr(path, stbuf); } if (is_cnc_path(path)) { return cnc_getattr(path, stbuf); } int res = 0; struct stat st; memset(stbuf, 0, sizeof(struct stat)); stbuf->st_uid = getuid(); stbuf->st_gid = getgid(); stbuf->st_atime = stbuf->st_mtime = stbuf->st_ctime = time(NULL); if (strcmp(path, "/") == 0) { stbuf->st_mode = S_IFDIR | 0755; stbuf->st_nlink = 2; stbuf->st_nlink = 1; // Safe default value } else if (strcmp(path, FIREREST_SYNC) == 0) { stbuf->st_mode = S_IFDIR | 0755; stbuf->st_nlink = 2; stbuf->st_nlink = 1; // Safe default value } else if (strcmp(path, CONFIG_PATH) == 0) { stbuf->st_mode = S_IFREG | 0444; stbuf->st_nlink = 1; stbuf->st_size = strlen(pConfigJson); } else if (strcmp(path, STATUS_PATH) == 0) { const char *status_str = firepick_status(); stbuf->st_mode = S_IFREG | 0444; stbuf->st_nlink = 1; stbuf->st_size = strlen(status_str); } else if (strcmp(path, HOLES_PATH) == 0) { memcpy(&headcam_image_fstat, &headcam_image, sizeof(FuseDataBuffer)); stbuf->st_mode = S_IFREG | 0666; stbuf->st_nlink = 1; stbuf->st_size = 1; stbuf->st_size = headcam_image_fstat.length; } else if (strcmp(path, ECHO_PATH) == 0) { stbuf->st_mode = S_IFREG | 0666; stbuf->st_nlink = 1; stbuf->st_size = strlen(echoBuf); } else if (strcmp(path, FIRELOG_PATH) == 0) { stbuf->st_mode = S_IFREG | 0666; stbuf->st_nlink = 1; stbuf->st_size = 10000; } else if (strcmp(path, FIRESTEP_PATH) == 0) { stbuf->st_mode = S_IFREG | 0666; stbuf->st_nlink = 1; stbuf->st_size = strlen(firestep_json()); } else { res = -ENOENT; } if (res == -ENOENT) { LOGERROR1("firefuse_getattr(%s) ENOENT", path); } else if (res) { LOGERROR3("firefuse_getattr(%s) st_size:%ldB -> %d", path, (long) stbuf->st_size, res); } else { LOGTRACE3("firefuse_getattr(%s) st_size:%ldB -> %d OK", path, (long) stbuf->st_size, res); } return res; }