From f4430bb7f2bcef62e6563f9c436b9a24d4482532 Mon Sep 17 00:00:00 2001 From: Selene ToyKeeper Date: Fri, 7 Apr 2023 17:06:08 -0600 Subject: merging gchart's changes, part 1... + added Sofirn LT1S Pro + added Sofirn SC21 Pro + added Wurkkos TS10 + added Wurkkos TS25 * small changes to other models * improved dual voltage support + added attiny1616 flashing python script w/ pymcuprog These changes are incomplete. It does not yet include: - extended simple UI - t1616 WDT reset detection - gchart's OUTPUT_MUX code (I plan to rewrite the entire tint system) --- bin/flash-1616.py | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 bin/flash-1616.py (limited to 'bin') diff --git a/bin/flash-1616.py b/bin/flash-1616.py new file mode 100644 index 0000000..6b3e2ee --- /dev/null +++ b/bin/flash-1616.py @@ -0,0 +1,76 @@ +# Use with Python3, make sure to have the pymcuprog module installed (via pip) + +# Read out the pymcuprog version +from pymcuprog.version import VERSION as pymcuprog_version +print("pymcuprog version {}".format(pymcuprog_version)) + + +# List out the available ports +import serial.tools.list_ports as ls; +#ports = ls.comports() +ports = [] +for p in ls.comports(): + if "COM" in p.device or "USB" in p.device: + ports.append(p) + +if len(ports) == 0: + print("No serial ports found, exiting") + exit() +elif len(ports) == 1: + print("Found one serial port:", ports[0].device, "-", ports[0].description) + port = ports[0].device +else: # found more than one serial port + print("Found multiple serial ports:") + for p in ports: + print(" *", p.device, "-", p.description) + print("Which serial port would you like to use? (default: " + ports[0].device + ") ", end="") + port = input() + if not port: + port = ports[0].device + + +import sys +args = sys.argv +if len(args) == 1: # only the program name, no arguements: ask for the hex file + print("Which hex file would you like to flash? ", end="") + hexfile = input() +else: + hexfile = args[1] + + +# pymcuprog uses the Python logging module +import logging +logging.basicConfig(format="%(levelname)s: %(message)s", level=logging.WARNING) + +# Configure the session +from pymcuprog.backend import SessionConfig +sessionconfig = SessionConfig("attiny1616") + +# Instantiate Serial transport (only 1 tool connected) +from pymcuprog.toolconnection import ToolSerialConnection +transport = ToolSerialConnection(serialport=port) + +# Instantiate backend +from pymcuprog.backend import Backend +backend = Backend() + +# Connect to tool using transport +backend.connect_to_tool(transport) + +# Start the session +backend.start_session(sessionconfig) + +# Read the target device_id +device_id = backend.read_device_id() +print("Device ID is {0:06X}".format(int.from_bytes(device_id, byteorder="little"))) + +# Erase the device, write the hexfile, and verify the write +backend.erase() +print("Memories erased.") +print("Writing hex file to the device... ") +backend.write_hex_to_target(hexfile) +print("Writing complete.") +print("Verifying the write... ") +verify_status = backend.verify_hex(hexfile) +if verify_status is True: + print("Verification successful!") \ No newline at end of file -- cgit v1.2.3 From d3d29ea2c08595d8a42d36a986f24e5b5afebd41 Mon Sep 17 00:00:00 2001 From: Selene ToyKeeper Date: Tue, 2 May 2023 05:23:22 -0600 Subject: bin/flash-1616.py: added shebang header and +x bit --- bin/flash-1616.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) mode change 100644 => 100755 bin/flash-1616.py (limited to 'bin') diff --git a/bin/flash-1616.py b/bin/flash-1616.py old mode 100644 new mode 100755 index 6b3e2ee..f431b3a --- a/bin/flash-1616.py +++ b/bin/flash-1616.py @@ -1,3 +1,4 @@ +#!/usr/bin/env python3 # Use with Python3, make sure to have the pymcuprog module installed (via pip) # Read out the pymcuprog version @@ -73,4 +74,5 @@ print("Writing complete.") print("Verifying the write... ") verify_status = backend.verify_hex(hexfile) if verify_status is True: - print("Verification successful!") \ No newline at end of file + print("Verification successful!") + -- cgit v1.2.3 From 803191510e07ebc6567158c47cff8b9893a16465 Mon Sep 17 00:00:00 2001 From: Selene ToyKeeper Date: Tue, 30 May 2023 06:18:12 -0600 Subject: with each build, dump a .cpp file with the source after preprocessing (for easier whole-program debugging) --- bin/build.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'bin') diff --git a/bin/build.sh b/bin/build.sh index 4cb03b4..a6169d1 100755 --- a/bin/build.sh +++ b/bin/build.sh @@ -27,9 +27,11 @@ fi export MCU=attiny$ATTINY export CC=avr-gcc +export CPP=avr-cpp export OBJCOPY=avr-objcopy export DFPFLAGS="-B $ATTINY_DFP/gcc/dev/$MCU/ -I $ATTINY_DFP/include/" -export CFLAGS="-Wall -g -Os -mmcu=$MCU -c -std=gnu99 -fgnu89-inline -fwhole-program -DATTINY=$ATTINY -I.. -I../.. -I../../.. -fshort-enums $DFPFLAGS" +export CFLAGS=" -Wall -g -Os -mmcu=$MCU -c -std=gnu99 -fgnu89-inline -fwhole-program -DATTINY=$ATTINY -I.. -I../.. -I../../.. -fshort-enums $DFPFLAGS" +export CPPFLAGS="-Wall -g -Os -mmcu=$MCU -C -std=gnu99 -fgnu89-inline -fwhole-program -DATTINY=$ATTINY -I.. -I../.. -I../../.. -fshort-enums $DFPFLAGS" export OFLAGS="-Wall -g -Os -mmcu=$MCU -mrelax $DFPFLAGS" export LDFLAGS="-fgnu89-inline" export OBJCOPYFLAGS='--set-section-flags=.eeprom=alloc,load --change-section-lma .eeprom=0 --no-change-warnings -O ihex --remove-section .fuse' @@ -45,6 +47,8 @@ function run () { if [ x"$?" != x0 ]; then exit 1 ; fi } +run $CPP $OTHERFLAGS $CPPFLAGS -o foo.cpp $PROGRAM.c +grep --text -E -v '^#|^$' foo.cpp > $PROGRAM.cpp ; rm foo.cpp run $CC $OTHERFLAGS $CFLAGS -o $PROGRAM.o -c $PROGRAM.c run $CC $OFLAGS $LDFLAGS -o $PROGRAM.elf $PROGRAM.o run $OBJCOPY $OBJCOPYFLAGS $PROGRAM.elf $PROGRAM.hex -- cgit v1.2.3 From c369e56e04af2fb7e9d2bd82027874635b084606 Mon Sep 17 00:00:00 2001 From: Selene ToyKeeper Date: Fri, 21 Jul 2023 15:41:59 -0600 Subject: kludgy attempt to factor PWM rise/fall time into level_calc.py (to reduce the ramp bumps at halfspeed / quarterspeed levels) --- bin/level_calc.py | 45 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 7 deletions(-) (limited to 'bin') diff --git a/bin/level_calc.py b/bin/level_calc.py index 1ab507c..8958a15 100755 --- a/bin/level_calc.py +++ b/bin/level_calc.py @@ -19,6 +19,7 @@ def main(args): cli_answers = [] global max_pwm, max_pwms, dyn_pwm pwm_arg = str(max_pwm) + clock_arg = '8:16:1' # quarter/half speed levels and rise time i = 0 while i < len(args): @@ -26,6 +27,9 @@ def main(args): if a in ('--pwm',): i += 1 pwm_arg = args[i] + elif a in ('--clock',): + i += 1 + clock_arg = args[i] else: #print('unrecognized option: "%s"' % (a,)) cli_answers.append(a) @@ -83,6 +87,13 @@ def main(args): max_pwm = val max_pwms = [val] * answers.num_levels + if clock_arg: + parts = clock_arg.split(':') + answers.quarterspeed_level, answers.halfspeed_level = [int(x) for x in parts[:2]] + answers.rise_time_base = float(parts[2]) + else: + answers.quarterspeed_level, answers.halfspeed_level, answers.rise_time_base = 0,0,0 + global ramp_shape ramp_shape = answers.ramp_shape @@ -148,6 +159,7 @@ def multi_pwm(answers, channels): channel.modes = [] for i in range(answers.num_levels): goal_vis, goal_lm = goals[i] + rise_time = calc_rise_time(i, answers) # This channel already is maxed out if goal_lm >= (channel.lm_max + channel.prev_lm): # This shouldn't happen, the FET is assumed to be the highest channel @@ -176,19 +188,20 @@ def multi_pwm(answers, channels): lm_needed = goal_lm - channel.prev_lm - channel.lm_min pwm_top = max_pwms[i] - pwm_avail = pwm_top - channel.pwm_min + pwm_avail = pwm_top - channel.pwm_min - rise_time pwm_needed = pwm_avail * lm_needed / lm_avail + #pwm_needed = min(pwm_needed, pwm_avail) if dyn_pwm and (pwm_top > max_pwm): this_step = max(1, math.floor(pwm_needed)) next_step = this_step + 1 fpart = pwm_needed - math.floor(pwm_needed) correction = (next_step - fpart) / next_step pwm_top = int(pwm_avail * correction) + channel.pwm_min - pwm_avail = pwm_top - channel.pwm_min + pwm_avail = pwm_top - channel.pwm_min - rise_time pwm_needed = pwm_avail * lm_needed / lm_avail max_pwms[i] = pwm_top # save the result - pwm = max(0, pwm_needed + channel.pwm_min) + pwm = max(0, pwm_needed + channel.pwm_min + rise_time) channel.modes.append(pwm) # how close did we get? #ptop = int(round(pwm - channel.pwm_min)) @@ -206,13 +219,18 @@ def multi_pwm(answers, channels): for i in range(answers.num_levels): goal_vis, goal_lm = goals[i] pwms = [] + rise_time = calc_rise_time(i, answers) for c, channel in enumerate(channels): + #top = channel.modes[i] - channel.pwm_min - rise_time top = channel.modes[i] - channel.pwm_min if top < 0: top = 0 - bot = max_pwms[i] - channel.pwm_min - ratio = 100 * (int(round(top)) / float(bot)) - top, bot = channel.modes[i], max_pwms[i] - pwms.append('%.2f/%i (%.3f%%)' % (top, bot, ratio)) + #bot = max_pwms[i] - channel.pwm_min - rise_time + bot = max_pwms[i] + #ratio = 100 * (int(round(top)) / float(bot)) + topf, bot = channel.modes[i], max_pwms[i] + top = int(round(topf)) + ratio = 100 * top / float(bot) + pwms.append('(%.2f) %i/%i (%.3f%%)' % (topf, top, bot, ratio)) if (ratio < prev_ratios[c]) and (ratio > 0): pwms.append('WARN') prev_ratios[c] = ratio @@ -240,6 +258,19 @@ def multi_pwm(answers, channels): print('Ch%i max: %i (%.2f/%s)' % (cnum, i, channel.modes[i-1], max_pwms[i])) +def calc_rise_time(i, answers): + base = answers.rise_time_base + + if (i+1) < answers.quarterspeed_level: + rise_time = base / 4.0 + elif (i+1) < answers.halfspeed_level: + rise_time = base / 2.0 + else: + ratio = 1.0 - math.sqrt((i - base) / (answers.num_levels - base)) + rise_time = answers.rise_time_base * ratio + return rise_time + + def get_value(text, default, args): """Get input from the user, or from the command line args.""" if args: -- cgit v1.2.3 From 02b2bb3929fb4bc60edccfa32ff695e25cd2ae4f Mon Sep 17 00:00:00 2001 From: Selene ToyKeeper Date: Mon, 30 Oct 2023 09:26:03 -0600 Subject: build.sh: use busybox-compatible grep args --- bin/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'bin') diff --git a/bin/build.sh b/bin/build.sh index a6169d1..499b5bd 100755 --- a/bin/build.sh +++ b/bin/build.sh @@ -48,7 +48,7 @@ function run () { } run $CPP $OTHERFLAGS $CPPFLAGS -o foo.cpp $PROGRAM.c -grep --text -E -v '^#|^$' foo.cpp > $PROGRAM.cpp ; rm foo.cpp +grep -a -E -v '^#|^$' foo.cpp > $PROGRAM.cpp ; rm foo.cpp run $CC $OTHERFLAGS $CFLAGS -o $PROGRAM.o -c $PROGRAM.c run $CC $OFLAGS $LDFLAGS -o $PROGRAM.elf $PROGRAM.o run $OBJCOPY $OBJCOPYFLAGS $PROGRAM.elf $PROGRAM.hex -- cgit v1.2.3