summaryrefslogtreecommitdiff
path: root/ledctl/ledctl.py
diff options
context:
space:
mode:
Diffstat (limited to 'ledctl/ledctl.py')
-rw-r--r--ledctl/ledctl.py132
1 files changed, 132 insertions, 0 deletions
diff --git a/ledctl/ledctl.py b/ledctl/ledctl.py
new file mode 100644
index 0000000..da42efa
--- /dev/null
+++ b/ledctl/ledctl.py
@@ -0,0 +1,132 @@
+#!/usr/bin/python
+
+import argparse
+import board
+import neopixel
+import time
+
+from os.path import exists
+
+# parse command line arguments
+
+# TODO parse multiple LEDs e.g. ./ledctl --led 1 red --led 2 white
+
+parser = argparse.ArgumentParser(description='Set LED colors')
+
+parser.add_argument('--led', type=int, help='LED number to control, starting at 1')
+parser.add_argument('color', type=str, help='color or command')
+
+args = parser.parse_args();
+
+# initialize LED array
+leds_max = 1
+leds_num = 0
+leds_array = neopixel.NeoPixel(board.D18, leds_max)
+
+# restore LED array from state file
+statefile = '/tmp/ledctl.state'
+
+if exists(statefile):
+ #print('reading ' + statefile)
+
+ with open(statefile, 'r') as f:
+ lines = f.readlines()
+ i = 0;
+ for line in lines:
+ values = [ int(number) for number in line.rstrip().split(' ')]
+ if (i < leds_max):
+ leds_array[i] = (values[0], values[1], values[2]);
+ i = i + 1
+ f.close()
+
+# figure out if we want to control a single LED or all of them
+if args.led:
+ if (args.led < 1) or (args.led > leds_max):
+ parser.error("led must be within range")
+ else:
+ leds_num = args.led;
+
+# default color is white
+leds_color = (255, 255, 255)
+
+def rgbval(colorname):
+ switch = {
+ 'on': (255, 255, 255),
+ 'off': (0, 0, 0),
+ 'white': (255, 255, 255),
+ 'black': (0, 0, 0),
+ 'red': (255, 0, 0),
+ 'green': (0, 255, 0),
+ 'blue': (0, 0, 255),
+ 'yellow': (255, 255, 0),
+ 'cyan': (0, 255, 255),
+ 'pink': (255, 0, 255),
+ 'boot': (63, 15, 0),
+ 'reboot' : (63, 15, 0),
+ 'ready': (0, 15, 0),
+ 'halt' : (0, 0, 0),
+ 'poweroff' : (0, 0, 0),
+ 'kexec' : (63, 0, 63),
+ }
+ return switch.get(colorname, (255, 255, 255))
+
+def hexval(letter):
+ switch = {
+ '0': 0,
+ '1': 1,
+ '2': 2,
+ '3': 3,
+ '4': 4,
+ '5': 5,
+ '6': 6,
+ '7': 7,
+ '8': 8,
+ '9': 9,
+ 'A': 10,
+ 'a': 10,
+ 'B': 11,
+ 'b': 11,
+ 'C': 12,
+ 'c': 12,
+ 'D': 13,
+ 'd': 13,
+ 'E': 14,
+ 'e': 14,
+ 'F': 15,
+ 'f': 15,
+ }
+ return switch.get(letter, 0)
+
+if args.color:
+ #print('color ' + args.color)
+ if args.color[:1] == '#':
+ red = 16 * hexval(args.color[1:2]) + hexval(args.color[2:3]);
+ green = 16 * hexval(args.color[3:4]) + hexval(args.color[4:5]);
+ blue = 16 * hexval(args.color[5:6]) + hexval(args.color[6:7]);
+ leds_color = (red, green, blue);
+ #print ('color %d %d %d' % leds_color)
+
+ else:
+ leds_color = rgbval(args.color);
+
+if (leds_num > 0):
+ #print('setting LED %d' % leds_num)
+
+ leds_array[leds_num - 1] = leds_color
+else:
+ #print('setting all LEDs')
+
+ leds_array.fill(leds_color)
+
+# write LED array to state file
+
+#print('writing ' + statefile)
+
+with open(statefile, 'w') as f:
+ for i in range(leds_max):
+ for c in range(3):
+ f.write ('%d ' % leds_array[i][c])
+ f.write('\n');
+
+ f.close()
+