fifo.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. cmd="mkfifo backpipe"
  2. fname = "/home/user/backpipe" # fifo named pipe
  3. import json
  4. import sys
  5. import os
  6. import time
  7. import _thread as thread
  8. def write(data):
  9. txt =json.dumps(data)
  10. f = open(fname,"w")
  11. f.write(txt)
  12. f.close()
  13. def read():
  14. f = open(fname,"w")
  15. txt = f.read()
  16. f.close()
  17. txt =json.loads(txt)
  18. return txt
  19. class read_loop():
  20. def __init__(self):
  21. self.fname = fname
  22. #self.f = open(self.fname,"r")
  23. self.s = time.time()
  24. self.buf = []
  25. self.lock = thread.allocate_lock()
  26. self.sleep = 0
  27. def loop(self,sleep=0):
  28. print(self,self.fname)
  29. if sleep:
  30. time.sleep(sleep)
  31. self.sleep=sleep
  32. thread.start_new_thread(self._loop,())
  33. def read(self):
  34. #print("read",self)
  35. out = []
  36. self.lock.acquire()
  37. try:
  38. if self.buf:
  39. out = self.buf[:]
  40. self.buf = []
  41. finally:
  42. self.lock.release()
  43. return out
  44. def check_pipe(self):
  45. r=os.popen("file {}".format(self.fname))
  46. for i in r.readlines():
  47. #print([i])
  48. if ": fifo " in i:
  49. return 1
  50. def _loop(self):
  51. if self.sleep:
  52. time.sleep(self.sleep)
  53. #print("loop_start __ "*100)
  54. #print()
  55. #print("start._loop",self)
  56. #print(self.fname)
  57. while 1:
  58. #print(2)
  59. if not self.check_pipe():
  60. #print("FIFO PIPE ERR:",fname,"is not a pipe")
  61. time.sleep(1)
  62. continue
  63. self.lock.acquire()
  64. self.f = open(self.fname,"r")
  65. txt="null"
  66. try:
  67. txt = self.f.read()
  68. txt=txt.strip()
  69. txt=json.loads(txt)
  70. #print("read",txt)
  71. self.buf.append(txt)
  72. except KeyboardInterrupt as e:
  73. raise e
  74. except Exception as e:
  75. print("FIFO TXT",[txt])
  76. print("FIFO ERR",e)
  77. finally:
  78. self.lock.release()
  79. time.sleep(0.01)
  80. if __name__ == "__main__":
  81. if "server" in sys.argv:
  82. server = read_loop()
  83. server.loop()
  84. while 1:
  85. try:
  86. data = server.read()
  87. if data:
  88. for i in data:
  89. print(":",i)
  90. else:
  91. time.sleep(0.01)
  92. except KeyboardInterrupt as e:
  93. raise e
  94. except Exception as e:
  95. print("ERR1",e)
  96. elif "client" in sys.argv:
  97. i=0
  98. while 1:
  99. #msg=json.dumps({"event":"EXEC","EXEC":btn_nr,"VAL":v,"F-KEY":btn_nr_raw})#.encode("utf-8")
  100. #cmd = "echo '{}' > ~/backpipe ".format(msg)
  101. data = ["data {}".format(i)]*100
  102. data = {"hi":i}
  103. print(data)
  104. txt = write(data)
  105. time.sleep(.1)
  106. i+=1