import network
import espnow
import time
from machine import Pin , PWM

Ain1 = Pin(9, Pin.OUT)
Ain2 = Pin(6, Pin.OUT)
speed = PWM(Pin(7))
Bin1 = Pin(20, Pin.OUT)
Bin2 = Pin(10, Pin.OUT)
enable = Pin(21, Pin.OUT)

def move_forward():
    enable.off()
    Ain1.on()
    Ain2.off() 
    speed.duty_u16(MAX_SPEED)
    return

def go_reverse():
    enable.off()
    Ain1.off()
    Ain2.on()
    speed.duty_u16(MAX_SPEED)
    return

def move_fwd_left():
    Bin1.on()
    Bin2.off()
    enable.on()
    Ain1.on()
    Ain2.off()
    speed.duty_u16(MAX_SPEED)
    return

def move_fwd_right():
    Bin1.off()
    Bin2.on()
    enable.on()
    Ain1.on()
    Ain2.off() 
    speed.duty_u16(MAX_SPEED)
    return

def go_reverse_left():
    Bin1.on()
    Bin2.off()
    enable.on()
    Ain1.off()
    Ain2.on() 
    speed.duty_u16(MAX_SPEED)
    return

def go_reverse_right():
    Bin1.off()
    Bin2.on()
    enable.on()
    Ain1.off()
    Ain2.on() 
    speed.duty_u16(MAX_SPEED)
    return
    

MAX_SPEED = 40000 # adjust if necessary 

enable.off()
speed.duty_u16(0)

# Initialize Wi-Fi in station mode
sta = network.WLAN(network.STA_IF)
sta.active(True)
sta.config(channel=1)  # Set channel explicitly if packets are not received
sta.disconnect()

# Initialize ESP-NOW
e = espnow.ESPNow()
try:
    e.active(True)
except OSError as err:
    #print("Failed to initialize ESP-NOW:", err)
    raise
# Sender's MAC address
sender_mac = b'\xxx\xxx\xxx\xxx\xxx\xxx'  # Sender MAC , replace by your senders MAC adress , important !!!

#print("Listening for ESP-NOW messages...")
while True:
    try:
        #print("running")
        # Receive message (host MAC, message, timeout of 10 seconds)
        host, msg = e.recv(10000)
        msg = str(msg)
        print(msg)
        if msg == "b'stop'" :
            #print("shut down motors !")
            speed.duty_u16(0)
            enable.off()
            
        if msg == "b'forward_left'" :
            #print("left")
            move_fwd_left()
            
        if msg == "b'forward_right'" :
            #print("right")
            move_fwd_right()
                 
        if msg =="b'forward'" :
            move_forward()
            
        if msg == "b'reverse'" :
            go_reverse()
            
        if msg == "b'reverse_left'" :
            go_reverse_left()
        
        if msg == "b'reverse_right'" :
            go_reverse_right()
            
    except OSError as err:
        #print("Error:", err)
        time.sleep(5)
        
    except KeyboardInterrupt:
        #print("Stopping receiver...")
        e.active(False)
        sta.active(False)
        break