add main loop code
This commit is contained in:
		
							
								
								
									
										212
									
								
								main.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										212
									
								
								main.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,212 @@
 | 
				
			|||||||
 | 
					import _thread
 | 
				
			||||||
 | 
					import ubinascii
 | 
				
			||||||
 | 
					from utime import sleep_ms
 | 
				
			||||||
 | 
					from machine import Pin, PWM, Timer, UART
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					conn = None
 | 
				
			||||||
 | 
					conn_highlight = None
 | 
				
			||||||
 | 
					name = "sumo-%s" % ubinascii.hexlify(wlan.config("mac")[-3:]).decode("ascii")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# remote server
 | 
				
			||||||
 | 
					url = "ws://iot.koodur.com:80/p2p/" + name + "/browser/"
 | 
				
			||||||
 | 
					url_highlight = "ws://iot.koodur.com:80/p2p/" + name + "-highlight/browser/"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# local server
 | 
				
			||||||
 | 
					#url = "ws://10.42.0.1:80/p2p/" + name + "/browser/"
 | 
				
			||||||
 | 
					#url_highlight = "ws://10.42.0.1:80/p2p/" + name + "-highlight/browser/"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					scope = dict()
 | 
				
			||||||
 | 
					# send blocks IDs for highlighting
 | 
				
			||||||
 | 
					no_delay = False
 | 
				
			||||||
 | 
					highlight = True
 | 
				
			||||||
 | 
					ast = "move(STOP, '')"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def is_enemy(block_id):
 | 
				
			||||||
 | 
					    if block_id != "" and highlight:
 | 
				
			||||||
 | 
					        conn_highlight.send(block_id)
 | 
				
			||||||
 | 
					    return enemy_distance()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def is_line(dir, block_id):
 | 
				
			||||||
 | 
					    if block_id != "" and highlight:
 | 
				
			||||||
 | 
					        conn_highlight.send(block_id)
 | 
				
			||||||
 | 
					    if dir == LEFT:
 | 
				
			||||||
 | 
					        return line_left()
 | 
				
			||||||
 | 
					    elif dir == RIGHT:
 | 
				
			||||||
 | 
					        return line_right()
 | 
				
			||||||
 | 
					    return False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def move(dir, block_id):
 | 
				
			||||||
 | 
					    if block_id != "" and highlight:
 | 
				
			||||||
 | 
					        conn_highlight.send(block_id)
 | 
				
			||||||
 | 
					    if dir == STOP:
 | 
				
			||||||
 | 
					        motor_left(0)
 | 
				
			||||||
 | 
					        motor_right(0)
 | 
				
			||||||
 | 
					    elif dir == LEFT:
 | 
				
			||||||
 | 
					        motor_left(-100)
 | 
				
			||||||
 | 
					        motor_right(-100)
 | 
				
			||||||
 | 
					    elif dir == RIGHT:
 | 
				
			||||||
 | 
					        motor_left(100)
 | 
				
			||||||
 | 
					        motor_right(100)
 | 
				
			||||||
 | 
					    elif dir == FORWARD:
 | 
				
			||||||
 | 
					        motor_left(100)
 | 
				
			||||||
 | 
					        motor_right(-100)
 | 
				
			||||||
 | 
					    elif dir == BACKWARD:
 | 
				
			||||||
 | 
					        motor_left(-100)
 | 
				
			||||||
 | 
					        motor_right(100)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def move2(dir, block_id):
 | 
				
			||||||
 | 
					    if block_id != "" and highlight:
 | 
				
			||||||
 | 
					        conn_highlight.send(block_id)
 | 
				
			||||||
 | 
					    if dir == STOP:
 | 
				
			||||||
 | 
					        motor_left(0)
 | 
				
			||||||
 | 
					        motor_right(0)
 | 
				
			||||||
 | 
					    elif dir == RIGHT:
 | 
				
			||||||
 | 
					        motor_left(-100)
 | 
				
			||||||
 | 
					        motor_right(-100)
 | 
				
			||||||
 | 
					    elif dir == LEFT:
 | 
				
			||||||
 | 
					        motor_left(100)
 | 
				
			||||||
 | 
					        motor_right(100)
 | 
				
			||||||
 | 
					    elif dir == BACKWARD:
 | 
				
			||||||
 | 
					        motor_left(100)
 | 
				
			||||||
 | 
					        motor_right(-100)
 | 
				
			||||||
 | 
					    elif dir == FORWARD:
 | 
				
			||||||
 | 
					        motor_left(-100)
 | 
				
			||||||
 | 
					        motor_right(100)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def sleep_wrapper(delay, block_id):
 | 
				
			||||||
 | 
					    if block_id != "" and highlight:
 | 
				
			||||||
 | 
					        conn_highlight.send(block_id)
 | 
				
			||||||
 | 
					    for j in range(0, delay, 10):
 | 
				
			||||||
 | 
					        if ast == "move(STOP, '')":
 | 
				
			||||||
 | 
					            return # TODO: raise exception
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            sleep_ms(10)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					exported_functions = dict(
 | 
				
			||||||
 | 
					    STOP = STOP,
 | 
				
			||||||
 | 
					    LEFT = LEFT,
 | 
				
			||||||
 | 
					    RIGHT = RIGHT,
 | 
				
			||||||
 | 
					    FORWARD = FORWARD,
 | 
				
			||||||
 | 
					    BACKWARD = BACKWARD,
 | 
				
			||||||
 | 
					    move = move,
 | 
				
			||||||
 | 
					    is_line = is_line,
 | 
				
			||||||
 | 
					    is_enemy = is_enemy,
 | 
				
			||||||
 | 
					    sleep = sleep_wrapper,
 | 
				
			||||||
 | 
					    motor_left = motor_left,
 | 
				
			||||||
 | 
					    motor_right = motor_right
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					exported_functions2 = dict(
 | 
				
			||||||
 | 
					    STOP = STOP,
 | 
				
			||||||
 | 
					    LEFT = LEFT,
 | 
				
			||||||
 | 
					    RIGHT = RIGHT,
 | 
				
			||||||
 | 
					    FORWARD = FORWARD,
 | 
				
			||||||
 | 
					    BACKWARD = BACKWARD,
 | 
				
			||||||
 | 
					    move = move2,
 | 
				
			||||||
 | 
					    is_line = is_line,
 | 
				
			||||||
 | 
					    is_enemy = is_enemy,
 | 
				
			||||||
 | 
					    sleep = sleep_wrapper,
 | 
				
			||||||
 | 
					    motor_left = motor_left,
 | 
				
			||||||
 | 
					    motor_right = motor_right
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def step():
 | 
				
			||||||
 | 
					    global scope
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    shuffle = False
 | 
				
			||||||
 | 
					    while True:
 | 
				
			||||||
 | 
					        scope = dict(
 | 
				
			||||||
 | 
					            enemy = is_enemy(""),
 | 
				
			||||||
 | 
					            line_left = is_line(LEFT, ""),
 | 
				
			||||||
 | 
					            line_right = is_line(RIGHT, ""),
 | 
				
			||||||
 | 
					            battery_voltage = get_battery_voltage(),
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					        if no_delay:
 | 
				
			||||||
 | 
					            if shuffle:
 | 
				
			||||||
 | 
					                current = exported_functions.copy()
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                current = exported_functions2.copy()
 | 
				
			||||||
 | 
					            shuffle = not shuffle
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            current = exported_functions.copy()
 | 
				
			||||||
 | 
					        current.update(scope)
 | 
				
			||||||
 | 
					        exec(ast, current)
 | 
				
			||||||
 | 
					        # leave time to process WebSocket commands
 | 
				
			||||||
 | 
					        sleep_ms(50)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def ws_handler():
 | 
				
			||||||
 | 
					    global ast
 | 
				
			||||||
 | 
					    global conn
 | 
				
			||||||
 | 
					    global scope
 | 
				
			||||||
 | 
					    global no_delay
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    uart = UART(2, baudrate=115200, rx=34, tx=35, timeout=1)
 | 
				
			||||||
 | 
					    uart.write("uart works, yee!\n")
 | 
				
			||||||
 | 
					    while True:
 | 
				
			||||||
 | 
					        try:
 | 
				
			||||||
 | 
					            fin, opcode, data = conn.read_frame()
 | 
				
			||||||
 | 
					            cmd = uart.readline()
 | 
				
			||||||
 | 
					        except: # urror
 | 
				
			||||||
 | 
					            print("Exception while reading from socket, attempting reconnect")
 | 
				
			||||||
 | 
					            conn = uwebsockets.connect(url)
 | 
				
			||||||
 | 
					            continue
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if cmd:
 | 
				
			||||||
 | 
					            print("command:", cmd)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if data == b"forward":
 | 
				
			||||||
 | 
					            #print("Going forward")
 | 
				
			||||||
 | 
					            ast = "move(FORWARD, '')"
 | 
				
			||||||
 | 
					        elif data == b"backward":
 | 
				
			||||||
 | 
					            #print("Going backward")
 | 
				
			||||||
 | 
					            ast = "move(BACKWARD, '')"
 | 
				
			||||||
 | 
					        elif data == b"right":
 | 
				
			||||||
 | 
					            #print("Going right")
 | 
				
			||||||
 | 
					            ast = "move(RIGHT, '')"
 | 
				
			||||||
 | 
					        elif data == b"left":
 | 
				
			||||||
 | 
					            #print("Going left")
 | 
				
			||||||
 | 
					            ast = "move(LEFT, '')"
 | 
				
			||||||
 | 
					        elif data == b"kick":
 | 
				
			||||||
 | 
					            conn.send(repr(scope))
 | 
				
			||||||
 | 
					        elif data == b"ping":
 | 
				
			||||||
 | 
					            conn.send(repr(scope))
 | 
				
			||||||
 | 
					        elif data.startswith("start:"):
 | 
				
			||||||
 | 
					            print("Got code:")#, data[6:])
 | 
				
			||||||
 | 
					            if b"sleep" in data or b"if" in data or len(data.splitlines()) == 1:
 | 
				
			||||||
 | 
					                no_delay = False
 | 
				
			||||||
 | 
					            else:
 | 
				
			||||||
 | 
					                no_delay = True
 | 
				
			||||||
 | 
					            ast = compile(data[6:], "snippet", "exec")
 | 
				
			||||||
 | 
					        elif data == b"stop":
 | 
				
			||||||
 | 
					            ast = "move(STOP, '')"
 | 
				
			||||||
 | 
					            print("Got stop")
 | 
				
			||||||
 | 
					        elif b"Gone" in data:
 | 
				
			||||||
 | 
					            print("Server said 410 Gone, attempting to reconnect...")
 | 
				
			||||||
 | 
					            conn = uwebsockets.connect(url)
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            print("unknown command:", data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# wait for WiFi to get connected
 | 
				
			||||||
 | 
					while not wlan.isconnected():
 | 
				
			||||||
 | 
					    sleep_ms(100)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# connect to the websocket
 | 
				
			||||||
 | 
					print("Connecting to:", url)
 | 
				
			||||||
 | 
					conn = uwebsockets.connect(url)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# send a ping to the robot
 | 
				
			||||||
 | 
					print("Sending ping")
 | 
				
			||||||
 | 
					conn.send("{'ping': true}")
 | 
				
			||||||
 | 
					conn.send("{'ip': '" + wlan.ifconfig()[0] + "'}")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# connect to the block highlight websocket
 | 
				
			||||||
 | 
					conn_highlight = uwebsockets.connect(url_highlight)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# indicate that the WebSocket is connected
 | 
				
			||||||
 | 
					set_led(STATUS, True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					print("Starting WebSocket and code loop")
 | 
				
			||||||
 | 
					# start the code processing thread
 | 
				
			||||||
 | 
					_thread.start_new_thread(step, ())
 | 
				
			||||||
 | 
					# start the Websocket processing thread
 | 
				
			||||||
 | 
					_thread.start_new_thread(ws_handler, ())
 | 
				
			||||||
		Reference in New Issue
	
	Block a user