fifo.py 3.0 KB

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