binfs.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. cmd="""
  2. # ----------------
  3. # setup as root !!
  4. # ----------------
  5. /usr/bin/umount /ram-dir
  6. # create ramfs
  7. mkdir -p /ram-dir
  8. /usr/bin/mount ramfs -t ramfs /ram-dir
  9. ## or tmpfs
  10. ## /usr/bin/mount tmpfs -t tmpfs -o uid=bob -o gid=bob /ram-disk
  11. mkdir /ram-dir/user
  12. chown user:user /ram-dir/user
  13. dd if=/dev/zero of=/ram-dir/user/x bs=100M count=10 status=progress
  14. dd if=/dev/zero of=/ram-dir-x bs=100M count=10 status=progress
  15. mount | grep ram-dir
  16. # ----------------
  17. """
  18. #print(cmd)
  19. import time
  20. #fname = "/ram-dir/user/data.bin"
  21. #fname = "/media/user/FAT2G-BLACK/data.bin"
  22. fname = "/tmp/data.bin"
  23. fname = "/tmp/vmaster.bin"
  24. data = [-1]*512
  25. debug=1
  26. print(fname)
  27. def init_bin(f):
  28. f.seek(0)
  29. for i in range(len(data)):
  30. f.write(b'\x00')
  31. f.flash()
  32. #bytearray
  33. import struct
  34. import os
  35. def _read(i):
  36. f=open(fname,"r+b", buffering=0)
  37. r=f.seek(i)
  38. v = f.read(1)
  39. if v == b'':
  40. return None
  41. v=struct.unpack('B',v)
  42. v=v[0]
  43. return v
  44. def _init():
  45. if not os.path.isfile(fname):
  46. f=open(fname,"w+b", buffering=0)
  47. init_bin(f)
  48. f.close()
  49. print("_init",fname)
  50. def _extend(i,xdata=None):
  51. if type(xdata) is type(None):
  52. ydata = data
  53. else:
  54. ydata = xdata
  55. while i >= len(ydata):
  56. ydata.append(-1)
  57. if debug:print("binfs extend data",i,len(ydata))
  58. def _write(i,v):
  59. f=open(fname,"r+b", buffering=0)
  60. f.seek(i)
  61. if v < 0:
  62. v=0
  63. if v > 255:
  64. v=255
  65. v=struct.pack('B',v)
  66. f.write(v)
  67. f.flush()
  68. data_buffer = []
  69. def buffer(i,v=None):
  70. try:
  71. i = int(i)
  72. _extend(i,data_buffer)
  73. data_buffer[i] = v
  74. except Exception as e:
  75. print(e)
  76. def update_loop():
  77. while 1:
  78. try:
  79. for i,v in enumerate(data_buffer):
  80. #print("-",i,v)
  81. patch(i,v)
  82. time.sleep(0.05)
  83. except Exception as e:
  84. print(e)
  85. import _thread as thread
  86. def loop():
  87. thread.start_new_thread(update_loop,())
  88. def patch(i,v=None):
  89. try:
  90. i = int(i)
  91. _init()
  92. if type(v) is type(None):
  93. v = _read(i)
  94. elif type(v) is int:
  95. if v < 0:
  96. v=0
  97. if v > 255:
  98. v=255
  99. v2 = _read(i)
  100. if v != v2:
  101. #print("patch.write",round(time.time(),3),":",[i,v,v2],fname)
  102. _write(i,v)
  103. #else:
  104. # #if "patch" in sys.argv:
  105. # # print("x patch.write",round(time.time(),3),":",[i,v,v2],fname)
  106. return v
  107. except Exception as e:
  108. print("patch-err-binfs",e)
  109. raise e
  110. import random
  111. def server():
  112. x = 1
  113. while 1:
  114. try:
  115. for i in range(200,0,-1):
  116. i+=20
  117. if i >= len(data):
  118. continue
  119. v=data[i]
  120. v+=x+i
  121. if x > 255:
  122. x=0
  123. r=patch(i,v)
  124. data[i]=v
  125. time.sleep(0.02)
  126. time.sleep(10)
  127. except Exception as e:
  128. print("server-err-binfs",e)
  129. time.sleep(1)
  130. x += 1
  131. def client():
  132. while 1:
  133. try:
  134. i=0
  135. v = patch(i)
  136. while type(v) is int:
  137. _extend(i)
  138. if v != data[i]:
  139. v2=struct.pack('B',v)
  140. print(round(time.time(),3),[i,v,v2])
  141. data[i] = v
  142. i+=1
  143. v = patch(i)
  144. time.sleep(0.01)
  145. except Exception as e:
  146. print("client-err-binfs",e,i,len(data))
  147. time.sleep(1)
  148. import sys
  149. if __name__ == "__main__":
  150. print("ARGV", sys.argv)
  151. if "server" in sys.argv:
  152. server()
  153. elif "client" in sys.argv:
  154. client()
  155. elif "patch" in sys.argv:
  156. v = None
  157. try:
  158. v = int(sys.argv[3])
  159. except Exception as e:pass
  160. r=patch(int(sys.argv[2]),v)
  161. print(r)