started writing some command parsing and basic command for uploading the logfiles to a webserver
This commit is contained in:
parent
40c38effe1
commit
920d7619be
1 changed files with 84 additions and 0 deletions
84
sdlogger.py
84
sdlogger.py
|
|
@ -8,10 +8,12 @@ BUFFER = bytearray(BUFSIZE_BUFFER)
|
||||||
|
|
||||||
import os, vfs
|
import os, vfs
|
||||||
import time
|
import time
|
||||||
|
import json
|
||||||
|
|
||||||
from machine import UART
|
from machine import UART
|
||||||
from machine import SPI
|
from machine import SPI
|
||||||
from machine import Pin
|
from machine import Pin
|
||||||
|
from machine import RTC
|
||||||
from sdcard import SDCard
|
from sdcard import SDCard
|
||||||
|
|
||||||
BUF_POS = 0
|
BUF_POS = 0
|
||||||
|
|
@ -19,6 +21,9 @@ SD_MOUNT = '/sd'
|
||||||
LOG_FOLDER = 'logs'
|
LOG_FOLDER = 'logs'
|
||||||
LOG_FILENAME = 'logfile.log'
|
LOG_FILENAME = 'logfile.log'
|
||||||
LOG_PATH = SD_MOUNT + '/' + LOG_FOLDER + '/' + LOG_FILENAME
|
LOG_PATH = SD_MOUNT + '/' + LOG_FOLDER + '/' + LOG_FILENAME
|
||||||
|
CMD_PREFIX = const(b"sdlogger {")
|
||||||
|
BUF_LASTLINE = bytearray(1024)
|
||||||
|
BUF_POS_LASTLINE = 0
|
||||||
WRITETIME = time.ticks_ms()
|
WRITETIME = time.ticks_ms()
|
||||||
|
|
||||||
UART0 = UART(0, baudrate=115200, rx=20, tx=21, rxbuf=BUFSIZE_RXBUF)
|
UART0 = UART(0, baudrate=115200, rx=20, tx=21, rxbuf=BUFSIZE_RXBUF)
|
||||||
|
|
@ -85,6 +90,84 @@ def readuart():
|
||||||
tmp = str.encode("\r\nsdlogger: buffer was full\r\n")
|
tmp = str.encode("\r\nsdlogger: buffer was full\r\n")
|
||||||
mv[BUF_POS:BUF_POS+len(tmp)] = tmp
|
mv[BUF_POS:BUF_POS+len(tmp)] = tmp
|
||||||
|
|
||||||
|
def parse_cmd():
|
||||||
|
# find first \n
|
||||||
|
# expand BUF_LASTLINE
|
||||||
|
# check for CMD_PREFIX
|
||||||
|
#
|
||||||
|
# find last newline
|
||||||
|
# search for CMD_PREFIX between first and last newline
|
||||||
|
#
|
||||||
|
# lastline = from last newline
|
||||||
|
global BUF_POS
|
||||||
|
global BUF_POS_LASTLINE
|
||||||
|
global BUF_LASTLINE
|
||||||
|
global BUFFER
|
||||||
|
|
||||||
|
firstnl = BUFFER.find(b'\r', 0, BUF_POS)
|
||||||
|
if (firstnl != -1) and ((firstnl + BUF_POS_LASTLINE) < len(BUF_LASTLINE)):
|
||||||
|
buf_line_len = BUF_POS_LASTLINE + firstnl
|
||||||
|
BUF_LASTLINE[BUF_POS_LASTLINE:buf_line_len] = BUFFER[0:firstnl]
|
||||||
|
cmd = BUF_LASTLINE.find(CMD_PREFIX, 0, buf_line_len)
|
||||||
|
if (cmd != -1):
|
||||||
|
json_start = cmd + len(CMD_PREFIX) - 1
|
||||||
|
mv = memoryview(BUF_LASTLINE)
|
||||||
|
exec_cmd(mv[json_start:buf_line_len])
|
||||||
|
|
||||||
|
lastnl = BUFFER.rfind(b'\r', BUF_POS)
|
||||||
|
t = BUF_POS - lastnl
|
||||||
|
BUF_LASTLINE[0:t] = BUFFER[lastnl:BUF_POS]
|
||||||
|
cmd = 0
|
||||||
|
while cmd != -1:
|
||||||
|
cmd = BUFFER.find(CMD_PREFIX, firstnl, lastnl)
|
||||||
|
if cmd != -1:
|
||||||
|
line_end = BUFFER.find(b'\r', cmd, lastnl)
|
||||||
|
json_start = cmd + len(CMD_PREFIX) - 1
|
||||||
|
mv = memoryview(BUFFER)
|
||||||
|
exec_cmd(mv[json_start:line_end])
|
||||||
|
|
||||||
|
|
||||||
|
def exec_cmd(json_cmd):
|
||||||
|
try:
|
||||||
|
cmd = json.loads(json_cmd)
|
||||||
|
except:
|
||||||
|
return
|
||||||
|
if cmd['cmd'] == "rtc":
|
||||||
|
exec_rtc(cmd)
|
||||||
|
elif cmd['cmd'] == "upload":
|
||||||
|
exec_upload(cmd)
|
||||||
|
elif cmd['cmd'] == "reset":
|
||||||
|
exec_reset(cmd)
|
||||||
|
|
||||||
|
def exec_rtc(cmd):
|
||||||
|
rtc = machine.RTC()
|
||||||
|
# the command should have an option "epoch", giving seconds since year 2000
|
||||||
|
rtc.datetime(time.gmtime(cmd['epoch']))
|
||||||
|
|
||||||
|
def exec_reset(cmd):
|
||||||
|
import machine
|
||||||
|
machine.reset()
|
||||||
|
|
||||||
|
def exec_upload(cmd):
|
||||||
|
# options:
|
||||||
|
# wlan_ssid
|
||||||
|
# wlan_password - optional
|
||||||
|
# upload_server
|
||||||
|
global BUFFER
|
||||||
|
del BUFFER # delete buffer to free some memory for upload process
|
||||||
|
if 'wlan_password' in cmd:
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
cmd['wlan_password'] = None
|
||||||
|
import network
|
||||||
|
wlan = network.WLAN(network.WLAN.IF_STA)
|
||||||
|
wlan.active(True)
|
||||||
|
if not wlan.isconnected():
|
||||||
|
wlan.connect(cmd['wlan_ssid'], cmd['wlan_password'])
|
||||||
|
while not wlan.isconnected():
|
||||||
|
pass
|
||||||
|
# TODO: upload file to server
|
||||||
|
|
||||||
|
|
||||||
def control():
|
def control():
|
||||||
"""main control loop"""
|
"""main control loop"""
|
||||||
|
|
@ -93,6 +176,7 @@ def control():
|
||||||
readuart()
|
readuart()
|
||||||
if (BUF_POS > BUF_THRESHOLD) or (BUF_POS > 0 and (1000 < time.ticks_diff(time.ticks_ms(), WRITETIME))):
|
if (BUF_POS > BUF_THRESHOLD) or (BUF_POS > 0 and (1000 < time.ticks_diff(time.ticks_ms(), WRITETIME))):
|
||||||
# write log if no UART transfer for more than WRITETIME seconds or buffer is fuller than BUF_THRESHOLD
|
# write log if no UART transfer for more than WRITETIME seconds or buffer is fuller than BUF_THRESHOLD
|
||||||
|
parse_cmd()
|
||||||
writebuf()
|
writebuf()
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue