import network,aioespnow,asyncio,time,json,cryptolib,uselect,sys,os,ubinascii,binascii;from machine import Pin
#def naredi_geslo(length=16):random_bytes = os.urandom(length);return ubinascii.hexlify(random_bytes).decode()
#geslo = naredi_geslo();podatki = b'0123456789012345';šifra1 = cryptolib.aes(geslo,1);šifra2 = cryptolib.aes(geslo,1);kodirani_podatki = šifra1.encrypt(podatki);odkodirani_podatki = šifra2.decrypt(kodirani_podatki)
tipka=Pin(9,Pin.IN);rdeca=Pin(3,Pin.OUT, Pin.PULL_DOWN);zelena=Pin(4,Pin.OUT);modra=Pin(5,Pin.OUT)#;ESP32-S3 tipka=Pin(9,Pin.IN);modra=Pin(8,Pin.OUT, Pin.PULL_DOWN);#ESP32-C3_Mini_V1
vektorji ={}
stanje={'skupina':'prva','ime':'vrstnik','mac':'','aktiven':0}
#oddaj={'c':b'\xff\xff\xff\xff\xff\xff','p':'','o':'01010000'}       #o-xxyykkkk 1 x-01 yy-del kkkk-aktiven
def stanje_zapis():f=open('/stanje.txt', 'w');f.write(str(stanje));f.close()
try:f = open('/stanje.txt', 'r');f.close();found = True
except:found = False
if found:f=open('/stanje.txt', 'r');stanje=eval(f.read(256));f.close();
else:stanje_zapis()
stanje["aktiven"]=0;sta = network.WLAN(network.STA_IF);sta.active(True);sta.config(channel=1);sta.disconnect();e = aioespnow.AIOESPNow();e.active(True);e.add_peer(b'\xff\xff\xff\xff\xff\xff')
async def oddaja(e,mac,podatek):await e.asend(mac, json.dumps(podatek).encode(), sync=True)#;print('oddaja      =',json.dumps(podatek),len(json.dumps(podatek)),'bytov')
async def sprejem(e):
    while True:
        async for mac, msg in e:
            try:
              modra.value(not modra.value());p=eval(msg);maci=[];maci.append(mac);vektorji[p['ime']]=maci
            except:print('Napaka')  
            #for k,x in e.peers_table.items():
            #    if not k in vrstniki: x.append('02010000');vrstniki[k]=x##o-xxyykkkk 1 x-02 yy-del kkkk-aktiven
            #    if mac==k:x[2]='02010000';vrstniki[k]=x
                #print("k  :",mac)
            #for k,x in p.items():
                #if not k in vrstniki: x.append('02010000');vrstniki[k]=x##o-xxyykkkk 1 x-02 yy-del kkkk-aktiven
                #if mac==k:x[2]='02010000';vrstniki[k]=x  
                #print(f"sprejem:{binascii.a2b_base64(mac)} , {binascii.a2b_base64(k)}")
            #print("mac:", mac,' ime:',p['ime'])
async def sekunda(e):
    while True:
        await oddaja(e,b'\xff\xff\xff\xff\xff\xff',stanje);stanje["aktiven"]+=1
        #print(vektorji.get(stanje['mac']))
        await asyncio.sleep(0.2);rdeca.value(False)
        await asyncio.sleep(0.8);rdeca.value(True)
def izpis_navodila():
    print('UKAZ        - AKCIJA');print('tip stanje  - tip slovar stanje');print('tip vektorji- tip slovar vektorji');print('tip ime     - nastavi ime vrstnika v slovar stanje');print('ime ukaz    - ukaz na vrstnika z imenom')#;print('Ctrl-c      - konec programa')
def izpis(x):
        if   len(x)==2 :#ukaz in parameter
           if x[0]=='tip':
            try:
              if   x[1]=='stanje'  :
                print(type(stanje))
                for k,v in stanje.items():print(k,'=',v)
              elif x[1]=='vektorji':
                print(type(vektorji))
                for k,v in vektorji.items():print(k,'=',v)
              else:stanje['ime']=x[1];stanje_zapis();print(stanje)  
            except:izpis_navodila() 
           else :  print('ime:',x[0],' ukaz:',x[1])
        else:izpis_navodila()   
poll = uselect.poll();poll.register(sys.stdin, uselect.POLLIN);izpis_navodila()
async def vhod(e):
    while True:
      try:
       if poll.poll(0):vhod = sys.stdin.readline().strip();x=vhod.split();izpis(x)
      except OSError as err:print("Napaka:", err)
      await asyncio.sleep(0.001)
async def main(e):await asyncio.gather(sprejem(e), sekunda(e),vhod(e))
try:asyncio.run(main(e))
except KeyboardInterrupt:
    e.active(False);sta.active(False)
 