import utime
import uselect
import urandom
import re

from machine import Pin
from machine import UART
from machine import TouchPad

MAX_RETRY_COUNT = 30
CMD_PROMPT = b'CMD>'

WAIT_FOR_NEXTLOOP = 5      # loop with 5msec wait
TOUCH_PIN = 32
TOUCH_THRESHOLD = 390
THRESHOLD_FOR_HOLDED = 30 
# if touched in (30 * WAIT) msec then switch to holded mode

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

IS_SENSOR_NONE = 0
IS_SENSOR_TAPPED = 1
IS_SENSOR_HOLDED = 2

#  TouchSensor Class
class TouchSensor():

    def __init__(self, touch_pin):  
        self.is_touch = False
        self.is_touch_prev = False
        self.is_holded = False
        self.holding_counter = 0
        self.touch = TouchPad(Pin(touch_pin))

    def get_state(self, verbose=False):
        sense_value = self.touch.read()
        self.is_touch_prev = self.is_touch
        if sense_value < TOUCH_THRESHOLD:
            if verbose:
                print(sense_value)
            self.is_touch = True
        else:
            self.is_touch = False

ij

# LED Pattern data: (LED3,LED1,LED1)
LED_PATTERN = (('OFF', 'OFF', 'ON'), ('OFF', 'ON', 'OFF'), 
	       ('ON', 'OFF', 'OFF'), ('ON', 'OFF', 'ON'), 
	       ('ON', 'ON', 'OFF'), ('ON', 'ON', 'ON'))

#  MiniDice Class
class MiniDice():

    def __init__(self, uart_unit, tx_pin, rx_pin, baud, touch_pin):  
        # setup device
        self.uart = UART(uart_unit, baud)
        self.uart.init(baud, bits = 8, parity = None, stop = 1, tx = tx_pin, rx = rx_pin)

        self.poll = uselect.poll()
        self.poll.register(self.uart, uselect.POLLIN)
        self.is_controler_ready = False

        self.sensor = TouchSensor(touch_pin)

    def main_loop(self):
        self.is_controller_ready = False
        tapping_counter = 0
        while True:
            if not self.is_controller_ready:
                print('check Controller status')
                while not self.is_controller_ready:
                    self.is_controller_ready = self.check_controller_status()
                    utime.sleep(1)               # wait for 1sec 
                    if self.is_controller_ready:
                        print('Controller is ready')
                        break
                    else:
                        print('wait for Controller ready')

            value = self.sensor.get_state(verbose=False)
            if value == IS_SENSOR_TAPPED:
                     print('tapped')
                     tapping_counter += 1
                     self.set_led(LED_PATTERN[tapping_counter % 6])
            elif value == IS_SENSOR_HOLDED:
                     print('holded')
                     tapping_counter = 0
                     rand_ptn = int(urandom.random() * 6)
                     self.set_led(LED_PATTERN[rand_ptn])
            utime.sleep_ms(WAIT_FOR_NEXTLOOP)

    #
    #       <patern> := (<state_led3>,<state_led2>,<state_led1>)
    # <state_led[n]> := ( ON | OFF)
    #
    def set_led(self, pattern):
        (led3, led2, led1) = pattern
        cmd = 'SET(LED3,{:s})\r'.format(led3)
        self.send_cmd(cmd)
        cmd = 'SET(LED2,{:s})\r'.format(led2)
        self.send_cmd(cmd)
        cmd = 'SET(LED1,{:s})\r'.format(led1)
        self.send_cmd(cmd)

    def send_cmd(self, cmd):
        print(cmd,end='')

ij

def main():
    minidice = MiniDice(UART_UNIT01, TX_PIN, RX_PIN, UART_BAUD, TOUCH_PIN)
    minidice.main_loop()

main()
    
    
