cmd="mkfifo backpipe"
fname = "/home/user/backpipe" # fifo named pipe
import json
import sys
import os
import time
import _thread as thread

def write(data):
    txt =json.dumps(data)
    f = open(fname,"w")
    f.write(txt)
    f.close()


def read():
    f = open(fname,"w")
    txt = f.read()
    f.close()
    txt =json.loads(txt)
    return txt

class read_loop():
    def __init__(self):
        self.fname = fname
        #self.f = open(self.fname,"r")
        self.s = time.time()
        self.buf = []
        self.lock = thread.allocate_lock()
        self.sleep = 0
    def loop(self,sleep=0):
        print(self,self.fname)
        if sleep:
            time.sleep(sleep)
            self.sleep=sleep

        thread.start_new_thread(self._loop,())
    def read(self):
        #print("read",self)
        out = []
        self.lock.acquire()
        try:
            if self.buf:
                out = self.buf[:]
                self.buf = []
        finally:
            self.lock.release()
        return out
    def check_pipe(self):
        r=os.popen("file {}".format(self.fname))
        for i in r.readlines():
            #print([i])
            if ": fifo " in i:
                return 1

    def _loop(self):
        if self.sleep:
            time.sleep(self.sleep)
        #print("loop_start __ "*100)
        #print()
        #print("start._loop",self)
        #print(self.fname)
        while 1:
            #print(2)
            if not self.check_pipe():
                #print("FIFO PIPE ERR:",fname,"is not a pipe")
                time.sleep(1)
                continue

            self.lock.acquire()
            self.f = open(self.fname,"r")
            txt="null"
            try:
                txt = self.f.read()
                txt=txt.strip()
                txt=json.loads(txt)
                #print("read",txt)
                self.buf.append(txt)
            except KeyboardInterrupt as e:
                raise e
            except Exception as e:
                print("FIFO TXT",[txt])
                print("FIFO ERR",e)
            finally:
                self.lock.release()
            time.sleep(0.01)

if __name__ == "__main__":
    if "server" in sys.argv:
        server = read_loop()
        server.loop()
        while 1:
            try:
                data = server.read()
                if data:
                    for i in data:
                        print(":",i)
                else:
                    time.sleep(0.01)
            except KeyboardInterrupt as e:
                raise e
            except Exception as e:
                print("ERR1",e)


    elif "client" in sys.argv:
        i=0
        while 1:
            #msg=json.dumps({"event":"EXEC","EXEC":btn_nr,"VAL":v,"F-KEY":btn_nr_raw})#.encode("utf-8")
            #cmd =  "echo '{}' > ~/backpipe ".format(msg)
            data = ["data {}".format(i)]*100
            data = {"hi":i}
            print(data)
            txt = write(data)
            time.sleep(.1)
            i+=1