import utime
import uselect
import urandom
import re
from machine import Pin
from machine import UART
from machine import reset

CONTROLLER_VERSION = 'V0.05'
CMD_PROMPT = 'CMD>'
ERR_UNK_CMD = 'Error! unknown command'
ERR_UNK_TARGET = 'Error! unknown target'
ERR_UNK_PARAMS = 'Error! unknown parameters'

LED1_PIN = 27
LED2_PIN = 14
LED3_PIN = 12

LED1_NAME = 'LED1'
LED2_NAME = 'LED2'
LED3_NAME = 'LED3'

UART_UNIT01 = 1
UART_BAUD = 115200
TX_PIN = 25
RX_PIN = 26

#  LED Class
class LED:

    def __init__(self, led_pin, name):
        # setup LED device
        self.pin = Pin(led_pin, Pin.OUT)
        self.pin.off()
        self.name = name

ij

#  Controller class
class Controller:

    def __init__(self):
        # init instance variables
        self.uart = None
        self.poll = None
        self.function_table = None

    def setup_uart(self, uart_unit, tx_pin, rx_pin, baud):
        # setup device
        self.uart = UART(uart_unit, baud)
        self.uart.init(baud, bits = 8, parity = None, stop = 1, tx = tx_pin, rx = rx_pin)
        utime.sleep_ms(500)   # wait for 500msec
        self.uart.read()           # read and drop data
        self.poll = uselect.poll()
        self.poll.register(self.uart, uselect.POLLIN)


    def setup_led(self, led1_pin, led1_name, led2_pin, led2_name, led3_pin, led3_name ):
        led1 = LED(led1_pin, led1_name)
        led2 = LED(led2_pin, led2_name)
        led3 = LED(led3_pin, led3_name)

        # function table for SET/GET device with parameters
        self.function_table = {'CTRL' : {'GET' : self.get, 'SET' : self.set},
                               'LED1' : {'GET' : led1.get, 'SET' : led1.set},
                               'LED2' : {'GET' : led2.get, 'SET' : led2.set},
                               'LED3' : {'GET' : led3.get, 'SET' : led3.set}}

ij

def main():
    controller = Controller()
    controller.setup_uart(UART_UNIT01, TX_PIN, RX_PIN, UART_BAUD)
    controller.setup_led(LED1_PIN, LED1_NAME, LED2_PIN, LED2_NAME, LED3_PIN, LED3_NAME)
    controller.main_loop()

main()

