Serial flashing while controller is running is possible

This commit is contained in:
Ollo
2021-02-10 23:05:54 +01:00
parent 3059744dd7
commit b5f36e5445
4 changed files with 53 additions and 23 deletions

View File

@@ -8,6 +8,8 @@ DIET=bin/luasrcdiet
DEVICE=$1
BAUD=115200
LUASCRIPT_STOP=${TOOLDIR}/stopController.lua
# check environment
if [ ! -f $LUATOOL ]; then
echo "$LUATOOL not found"
@@ -59,6 +61,17 @@ if [ $# -eq 1 ]; then
echo "STOOOOP"
exit 1
fi
else
echo "Reboot ESP and stop init timer"
if [ ! -f $LUASCRIPT_STOP ]; then
echo "Cannot find $LUASCRIPT_STOP"
exit 1
fi
python3 $LUATOOL -p $DEVICE -f $LUASCRIPT_STOP -b $BAUD --volatile --delay 2
if [ $? -ne 0 ]; then
echo "Could not reboot"
exit 1
fi
fi
echo "Start Flasing ..."
@@ -78,7 +91,9 @@ for f in $FILES; do
fi
done
echo "Reboot the ESP"
echo "node.restart()" >> $DEVICE
if [ $# -eq 1 ]; then
echo "Reboot the ESP"
echo "node.restart()" >> $DEVICE
fi
exit 0

View File

@@ -54,6 +54,9 @@ class AbstractTransport:
def writer(self, data):
self.writeln("file.writeline([==[" + data + "]==])\r")
def execute(self, data):
self.writeln(data + "\r")
def performcheck(self, expected):
line = ''
char = ''
@@ -190,6 +193,7 @@ if __name__ == '__main__':
parser.add_argument('-e', '--echo', action='store_true', help='Echo output of MCU until script is terminated.')
parser.add_argument('--delay', default=0.3, help='Delay in seconds between each write.', type=float)
parser.add_argument('--delete', default=None, help='Delete a lua/lc file from device.')
parser.add_argument('--volatile', action='store_true', help='Volatile (nothing stored on ESP)')
parser.add_argument('--ip', default=None, help='Connect to a telnet server on the device (--ip IP[:port])')
args = parser.parse_args()
@@ -201,7 +205,7 @@ if __name__ == '__main__':
char = transport.read(1)
if char == '' or char == chr(62):
break
sys.stdout.write(char)
sys.stdout.write(str.encode(char))
sys.exit(0)
if args.id:
@@ -212,7 +216,7 @@ if __name__ == '__main__':
if char == '' or char == chr(62):
break
if char.isdigit():
id += char
id += char.decode("utf-8")
print("\n"+id)
sys.exit(0)
@@ -222,10 +226,10 @@ if __name__ == '__main__':
fn = ""
while True:
char = transport.read(1)
if char == '' or ord(char) == 62:
if char == '' or len(char) == 0 or ord(char) == 62:
break
if char not in ['\r', '\n']:
fn += char.decode("utf-8")
fn += str(char)
else:
if fn:
file_list.append(fn.strip())
@@ -270,7 +274,7 @@ if __name__ == '__main__':
sys.stderr.write("Upload starting\r\n")
# remove existing file on device
if args.append==False:
if args.append==False and not args.volatile:
if args.verbose:
sys.stderr.write("Stage 1. Deleting old file from flash memory")
transport.writeln("file.open(\"" + args.dest + "\", \"w\")\r")
@@ -284,23 +288,31 @@ if __name__ == '__main__':
# read source file line by line and write to device
if args.verbose:
sys.stderr.write("\r\nStage 2. Creating file in flash memory and write first line")
if args.append:
transport.writeln("file.open(\"" + args.dest + "\", \"a+\")\r")
if not args.volatile:
if args.append:
transport.writeln("file.open(\"" + args.dest + "\", \"a+\")\r")
else:
transport.writeln("file.open(\"" + args.dest + "\", \"w+\")\r")
else:
transport.writeln("file.open(\"" + args.dest + "\", \"w+\")\r")
if args.verbose:
sys.stderr.write("\r\nStage 2. Directly execute the script...")
line = f.readline()
if args.verbose:
sys.stderr.write("\r\nStage 3. Start writing data to flash memory...")
while line != '':
transport.writer(line.strip())
if args.volatile:
transport.execute(line.strip())
else:
transport.writer(line.strip())
line = f.readline()
# close both files
f.close()
if args.verbose:
sys.stderr.write("\r\nStage 4. Flush data and closing file")
transport.writeln("file.flush()\r")
transport.writeln("file.close()\r")
if not args.volatile:
transport.writeln("file.flush()\r")
transport.writeln("file.close()\r")
# compile?
if args.compile:
@@ -319,7 +331,8 @@ if __name__ == '__main__':
if args.verbose:
sys.stderr.write("\r\nEchoing MCU output, press Ctrl-C to exit")
while True:
sys.stdout.write(transport.read(1))
data = transport.read(1)
sys.stdout.write( data.decode("ascii") )
# close serial port
transport.close()

2
tools/stopController.lua Normal file
View File

@@ -0,0 +1,2 @@
node.restart()
if (initTimer ~= nil) then initTimer:unregister() end