From 7cb4fe0944b839f28dfd96a88a772cd6a8b58019 Mon Sep 17 00:00:00 2001 From: Selene ToyKeeper Date: Thu, 2 Nov 2023 17:16:25 -0600 Subject: reorganized project files (part 1) (just moved files, didn't change the contents yet, and nothing will work without updating #includes and build scripts and stuff) --- bin/build-all.sh | 57 +++++++++++++++++++++++++++++++++++++++++++++ bin/models.py | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ bin/steps.py | 51 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 179 insertions(+) create mode 100755 bin/build-all.sh create mode 100755 bin/models.py create mode 100755 bin/steps.py (limited to 'bin') diff --git a/bin/build-all.sh b/bin/build-all.sh new file mode 100755 index 0000000..b3fc5d3 --- /dev/null +++ b/bin/build-all.sh @@ -0,0 +1,57 @@ +#!/bin/sh + +# Usage: build-all.sh [pattern] +# If pattern given, only build targets which match. + +if [ ! -z "$1" ]; then + SEARCH="$1" +fi + +UI=anduril + +date '+#define VERSION_NUMBER "%Y-%m-%d"' > version.h + +PASS=0 +FAIL=0 +PASSED='' +FAILED='' + +for TARGET in cfg-*.h ; do + + # maybe limit builds to a specific pattern + if [ ! -z "$SEARCH" ]; then + echo "$TARGET" | grep -i "$SEARCH" > /dev/null + if [ 0 != $? ]; then continue ; fi + fi + + # friendly name for this build + NAME=$(echo "$TARGET" | perl -ne '/cfg-(.*).h/ && print "$1\n";') + echo "===== $NAME =====" + + # figure out MCU type + ATTINY=$(grep 'ATTINY:' $TARGET | awk '{ print $3 }') + if [ -z "$ATTINY" ]; then ATTINY=85 ; fi + + # try to compile + echo ../../../bin/build.sh $ATTINY "$UI" "-DCFG_H=${TARGET}" + ../../../bin/build.sh $ATTINY "$UI" "-DCFG_H=${TARGET}" + + # track result, and rename compiled files + if [ 0 = $? ] ; then + mv -f "$UI".hex "$UI".$NAME.hex + PASS=$(($PASS + 1)) + PASSED="$PASSED $NAME" + else + echo "ERROR: build failed" + FAIL=$(($FAIL + 1)) + FAILED="$FAILED $NAME" + fi + +done + +# summary +echo "===== $PASS builds succeeded, $FAIL failed =====" +#echo "PASS: $PASSED" +if [ 0 != $FAIL ]; then + echo "FAIL:$FAILED" +fi diff --git a/bin/models.py b/bin/models.py new file mode 100755 index 0000000..1985352 --- /dev/null +++ b/bin/models.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python + +import os +import re + +def main(args): + """models.py: scan build targets to generate the MODELS file + """ + + models = [] + + # load all cfg-*.h files + paths = os.listdir('.') + for p in paths: + if p.startswith('cfg-') and p.endswith('.h'): + m = load_cfg(p) + models.append(m) + + # sort by model number + foo = [(m.num, m.name, m) for m in models] + foo.sort() + models = [x[-1] for x in foo] + + fmt = '%s\t%-30s\t%s' + print(fmt % ('Model', 'Name', 'MCU')) + print(fmt % ('-----', '----', '---')) + for m in models: + print(fmt % (m.num, m.name, m.attiny)) + + print('\nDuplicates:') + for i, m in enumerate(models): + for m2 in models[i+1:]: + #if (m.num == m2.num) and (m is not m2): + if m.num == m2.num: + print('%s\t%s, %s' % (m.num, m.name, m2.name)) + + print('\nMissing:') + for m in models: + if not m.num: + print(m.name) + + +class Empty: + pass + + +def load_cfg(path): + m = Empty() + m.name, m.num, m.attiny = '', '', 'attiny85' + + m.name = path.replace('cfg-', '').replace('.h', '') + + num_pat = re.compile(r'#define\s+MODEL_NUMBER\s+"(\d+)"') + mcu_pat = re.compile(r'ATTINY:\s+(\d+)') + # TODO? use C preprocessor to generate more complete file to scan + with open(path) as fp: + for line in fp: + found = num_pat.search(line) + if found: + m.num = found.group(1) + found = mcu_pat.search(line) + if found: + m.attiny = 'attiny' + found.group(1) + + return m + + +if __name__ == "__main__": + import sys + main(sys.argv[1:]) + diff --git a/bin/steps.py b/bin/steps.py new file mode 100755 index 0000000..e19c9a6 --- /dev/null +++ b/bin/steps.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python + +"""steps.py: Calculate the stepped ramp levels used by Anduril. +Usage: steps.py floor ceiling num_steps +For example: + > ./steps.py 1 150 3 + 1: 1 + 2: 75 + 3: 150 +""" + +def main(args): + floor, ceil, steps = [int(x) for x in args[:3]] + for i in range(steps): + guess = floor + (i * (float(ceil-floor)/(steps-1))) + this = nearest_level(guess, floor, ceil, steps) + #print('%i: %i (guess: %i)' % (i+1, this, guess)) + print('%i: %i' % (i+1, this)) + + +def nearest_level(target, floor, ceil, steps): + """Copied/adapted from anduril.c""" + # bounds check + # using int16_t here saves us a bunch of logic elsewhere, + # by allowing us to correct for numbers < 0 or > 255 in one central place + mode_min = floor; + mode_max = ceil; + + if (target < mode_min): return mode_min; + if (target > mode_max): return mode_max; + # the rest isn't relevant for smooth ramping + #if (! ramp_style): return target; + + ramp_range = ceil - floor; + ramp_discrete_step_size = int(ramp_range / (steps-1)); + this_level = floor; + + for i in range(steps): + this_level = floor + (i * int(ramp_range) / (steps-1)); + diff = int(target - this_level); + if (diff < 0): diff = -diff; + if (diff <= (ramp_discrete_step_size>>1)): + return this_level; + + return this_level; + + +if __name__ == "__main__": + import sys + main(sys.argv[1:]) + -- cgit v1.2.3