Initial commit
commit
5a008b3052
@ -0,0 +1 @@
|
||||
*~
|
@ -0,0 +1 @@
|
||||
Adafruit CircuitPython 5.1.0 on 2020-04-02; Adafruit Trellis M4 Express with samd51g19
|
@ -0,0 +1,120 @@
|
||||
import time
|
||||
|
||||
import board
|
||||
import busio
|
||||
from adafruit_neotrellis.neotrellis import NeoTrellis
|
||||
from adafruit_neotrellis.multitrellis import MultiTrellis
|
||||
from neotrellism4 import NeoTrellisM4
|
||||
import conway
|
||||
import adafruit_adxl34x
|
||||
|
||||
ACCEL_THRESHOLD = 100
|
||||
|
||||
|
||||
#create the i2c object for the trellis
|
||||
I2C = busio.I2C(board.SCL, board.SDA)
|
||||
|
||||
"""create the trellis. This is for a 2x2 array of TrellisM4 (first row) with
|
||||
2 Neotrellis (second row).
|
||||
|
||||
[ NeoM4_left | NeoM4_right ]
|
||||
neotrellis0 | neotrellis1
|
||||
"""
|
||||
|
||||
trellim4_left = NeoTrellisM4()
|
||||
trellim4_right = NeoTrellisM4(left_part=trellim4_left)
|
||||
trelli = [
|
||||
[trellim4_left, trellim4_right],
|
||||
[NeoTrellis(I2C, False, addr=0x2F), NeoTrellis(I2C, False, addr=0x2E)]
|
||||
]
|
||||
|
||||
trellis = MultiTrellis(trelli)
|
||||
|
||||
#some color definitions
|
||||
OFF = (0, 0, 0)
|
||||
ON = (100, 100, 80)
|
||||
# RED = (127, 0, 0)
|
||||
# YELLOW = (127, 75, 0)
|
||||
# GREEN = (0, 127, 0)
|
||||
# CYAN = (0, 127, 127)
|
||||
# BLUE = (0, 0, 127)
|
||||
# PURPLE = (90, 0, 127)
|
||||
|
||||
|
||||
I2C_ACCEL = busio.I2C(board.ACCELEROMETER_SCL, board.ACCELEROMETER_SDA)
|
||||
accelerometer = adafruit_adxl34x.ADXL343(I2C_ACCEL)
|
||||
|
||||
# Init universe
|
||||
univers = [[False for x in range(8)] for y in range(8)]
|
||||
|
||||
universe = conway.GLIDER
|
||||
|
||||
#this will be called when button events are received
|
||||
def genesis_callback(xcoord, ycoord, edge):
|
||||
#turn the LED on when a rising edge is detected
|
||||
if edge == NeoTrellis.EDGE_RISING:
|
||||
universe[xcoord][ycoord] = not(universe[xcoord][ycoord])
|
||||
if univers[xcoord][ycoord]:
|
||||
trellis.color(xcoord, ycoord, ON)
|
||||
else:
|
||||
trellis.color(xcoord, ycoord, OFF)
|
||||
conway.draw_universe(trellis, universe)
|
||||
|
||||
|
||||
def evo_callback(xcoord, ycoord, edge):
|
||||
pass
|
||||
|
||||
|
||||
# Init. all the keys for Genesis
|
||||
for x in range(8):
|
||||
for y in range(8):
|
||||
#activate rising edge events on all keys
|
||||
trellis.activate_key(x, y, NeoTrellis.EDGE_RISING)
|
||||
trellis.set_callback(x, y, genesis_callback)
|
||||
|
||||
trellis.sync()
|
||||
conway.draw_universe(trellis, universe)
|
||||
|
||||
accelerometer.enable_motion_detection(threshold=ACCEL_THRESHOLD)
|
||||
|
||||
# Genesis
|
||||
while not(accelerometer.events["motion"]):
|
||||
#the trellis can only be read every 17 millisecons or so
|
||||
trellis.sync()
|
||||
time.sleep(.02)
|
||||
|
||||
print("The end of Genesis, time to evolve...")
|
||||
|
||||
# Init. all the keys for Evolution
|
||||
for x in range(8):
|
||||
for y in range(8):
|
||||
#activate rising edge events on all keys
|
||||
trellis.activate_key(x, y, NeoTrellis.EDGE_RISING)
|
||||
trellis.set_callback(x, y, evo_callback)
|
||||
|
||||
trellis.sync()
|
||||
conway.draw_universe(trellis, universe)
|
||||
|
||||
generation = 0
|
||||
|
||||
#Evolution
|
||||
while True:
|
||||
new_universe = [[False for x in range(8)] for y in range(8)]
|
||||
ext_universe = conway.extend_universe(universe)
|
||||
for x in range(8):
|
||||
for y in range(8):
|
||||
n = conway.living_neighbour_count(x, y, ext_universe)
|
||||
if n == 3:
|
||||
new_universe[x][y] = True
|
||||
# print(x, y, n, "alive")
|
||||
elif n == 2 and universe[x][y]:
|
||||
new_universe[x][y] = True
|
||||
# print(x, y, n, "still alive")
|
||||
else:
|
||||
new_universe[x][y] = False
|
||||
# print(x, y, n, "dead")
|
||||
generation += 1
|
||||
print(generation)
|
||||
universe = new_universe.copy()
|
||||
|
||||
conway.draw_universe(trellis, universe)
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,61 @@
|
||||
GLIDER = [[False, False, False, False, False, False, False, False],
|
||||
[False, False, False, False, True, False, False, False],
|
||||
[False, False, True, False, True, False, False, False],
|
||||
[False, False, False, True, True, False, False, False],
|
||||
[False, False, False, False, False, False, False, False],
|
||||
[False, False, False, False, False, False, False, False],
|
||||
[False, False, False, False, False, False, False, False],
|
||||
[False, False, False, False, False, False, False, False]]
|
||||
|
||||
OFF = (0, 0, 0)
|
||||
ON = (100, 100, 80)
|
||||
|
||||
def draw_universe(trellis, universe):
|
||||
for x in range(8):
|
||||
for y in range(8):
|
||||
#activate rising edge events on all keys
|
||||
if universe[x][y]:
|
||||
trellis.color(x, y, ON)
|
||||
else:
|
||||
trellis.color(x, y, OFF)
|
||||
|
||||
|
||||
def extend_universe(universe):
|
||||
"""Extend an 8x8 universe to 10x10 with first and last columns and rows as in an donut-shaped universe"""
|
||||
ext_universe = [[False for x_ext in range(10)] for y_ext in range(10)]
|
||||
|
||||
# Copy universe in an extended donut-shaped universe
|
||||
for x_ext in range(10):
|
||||
for y_ext in range(10):
|
||||
if x_ext == 0:
|
||||
loc_x = 7
|
||||
elif x_ext == 9:
|
||||
loc_x = 0
|
||||
else:
|
||||
loc_x = x_ext-1
|
||||
if y_ext == 0:
|
||||
loc_y = 7
|
||||
elif y_ext == 9:
|
||||
loc_y = 0
|
||||
else:
|
||||
loc_y = y_ext-1
|
||||
|
||||
ext_universe[x_ext][y_ext] = universe[loc_x][loc_y]
|
||||
return ext_universe
|
||||
|
||||
|
||||
def living_neighbour_count(xcoord, ycoord, ext_universe):
|
||||
"""Count living cells around xcoord, ycoord"""
|
||||
|
||||
living_neighbours = []
|
||||
living_neighbours.append(ext_universe[xcoord][ycoord])
|
||||
living_neighbours.append(ext_universe[xcoord][ycoord+1])
|
||||
living_neighbours.append(ext_universe[xcoord][ycoord+2])
|
||||
living_neighbours.append(ext_universe[xcoord+1][ycoord])
|
||||
living_neighbours.append(ext_universe[xcoord+1][ycoord+2])
|
||||
living_neighbours.append(ext_universe[xcoord+2][ycoord])
|
||||
living_neighbours.append(ext_universe[xcoord+2][ycoord+1])
|
||||
living_neighbours.append(ext_universe[xcoord+2][ycoord+2])
|
||||
# print(living_neighbours.count(True), living_neighbours)
|
||||
return living_neighbours.count(True)
|
||||
|
Loading…
Reference in New Issue