Browse Source

refactor: binfs share-data

micha 5 months ago
parent
commit
afdbbe43a5
1 changed files with 110 additions and 61 deletions
  1. 110 61
      lib/binfs.py

+ 110 - 61
lib/binfs.py

@@ -27,108 +27,152 @@ import time
 #fname = "/ram-dir/user/data.bin"
 #fname = "/media/user/FAT2G-BLACK/data.bin"
 fname = "/tmp/data.bin"
+fname = "/tmp/vmaster.bin"
+data = [-1]*512
+debug=1
 
 print(fname)
 def init_bin(f):
     f.seek(0)
-    for i in range(512):
+    for i in range(len(data)):
         f.write(b'\x00')
         f.flash()
 
-data = [0]*512
 
 #bytearray
 import struct
 import os
 
-def patch(i,v):
+def _read(i):
+    f=open(fname,"r+b", buffering=0)
+    r=f.seek(i)
+    v = f.read(1)
+    if v == b'':
+        return None
+    v=struct.unpack('B',v)
+    v=v[0]
+    return v
+
+def _init():
+    if not os.path.isfile(fname):
+        f=open(fname,"w+b", buffering=0)
+        init_bin(f)
+        f.close()
+        print("_init",fname)
+
+def _extend(i,xdata=None):
+    if type(xdata) is type(None):
+        ydata = data
+    else:
+        ydata = xdata
+
+    while i >= len(ydata):
+        ydata.append(-1)
+        if debug:print("binfs extend data",i,len(ydata))
+
+def _write(i,v):
+    f=open(fname,"r+b", buffering=0)
+    f.seek(i)
+    if v < 0:
+        v=0
+    if v > 255:
+        v=255
+    v=struct.pack('B',v)
+    f.write(v)
+    f.flush()
+
+data_buffer = []
+def buffer(i,v=None):
     try:
-        #f=open(fname,"a+b", buffering=0)
-        f=open(fname,"r+b", buffering=0)
-        r=f.seek(0) #,whence=os.SEEK_SET)
-        #f.truncate()
-        print(r)
-        r=f.seek(i) #,whence=os.SEEK_SET)
-        #f.truncate()
-        print(r)
-        if v > 255:
-            v=255
-        v=struct.pack('B',v)
-        print("write",round(time.time(),3),":",i,v)
-        f.write(v)
-        f.flush()
+        i = int(i)
+        _extend(i,data_buffer)   
+        data_buffer[i] = v
     except Exception as e:
-        print("server-err",e)
-
+        print(e)
+    
+def update_loop():
+    while 1:
+        try:
+            for i,v in enumerate(data_buffer):
+                #print("-",i,v)
+                patch(i,v)
+            time.sleep(0.05)
+        except Exception as e:
+            print(e)
+import _thread as thread
+def loop():
+    thread.start_new_thread(update_loop,())
 
-def server():
+def patch(i,v=None):
     try:
-        f=open(fname,"wb", buffering=0)
-        #f.seek(0)
-        init_bin(f)
+        i = int(i)
+        _init()
+
+        if type(v) is type(None):
+            v = _read(i)
+        elif type(v) is int:
+            if v < 0:
+                v=0
+            if v > 255:
+                v=255
+            v2 = _read(i)
+            if v != v2:
+                #print("patch.write",round(time.time(),3),":",[i,v,v2],fname)
+                _write(i,v)
+            #else:
+            #    #if "patch" in sys.argv:
+            #    #   print("x patch.write",round(time.time(),3),":",[i,v,v2],fname)
+
+        return v
         
     except Exception as e:
-        print("server-err",e)
-        time.sleep(1)
-    print(dir(f))
-    print(data)
+        print("patch-err-binfs",e)
+        raise e
+
+import random
+def server():
+    x = 1
     while 1:
         try:
-            f.seek(0)
             for i in range(200,0,-1):
                 i+=20
                 if i >= len(data):
                     continue
-
-                f.seek(i)
                 v=data[i]
-                #print(data)
-                v+=1+i
-                if v > 255:
-                    v=1
-                data[i]=v
+                v+=x+i
+                if x > 255:
+                    x=0
 
-                #v=bytes(v)
-                v=struct.pack('B',v)
-                print(round(time.time(),3),":",i,v)
-                f.write(v)
-                f.flush()
+                r=patch(i,v)
+                data[i]=v
                 time.sleep(0.02)           
             time.sleep(10)           
         except Exception as e:
-            print("server-err",e)
+            print("server-err-binfs",e)
             time.sleep(1)
+        x += 1
 
 
 def client():
-    try:
-        f=open(fname,"rb", buffering=0)
-        
-    except Exception as e:
-        print("client-err",e)
-        time.sleep(1)
-    v=''
-    i=0
     while 1:
         try:
-            start = time.time()
-            f=open(fname,"rb", buffering=0)
             i=0
-            f.seek(0)
-            v = f.read(1)
-            while v:
-                v2=b''
-                if v:
-                    v2=struct.unpack('B',v)
+            v = patch(i)
+            while type(v) is int:
+                _extend(i)
+
+
                 if v != data[i]:
-                    print(round(time.time(),4),i,v,v2)
+                    v2=struct.pack('B',v)
+                    print(round(time.time(),3),[i,v,v2])
+
                     data[i] = v
-                v = f.read(1)
                 i+=1
+                v = patch(i)
                 
             time.sleep(0.01)
         except Exception as e:
-            print("client-err",e)
+            print("client-err-binfs",e,i,len(data))
             time.sleep(1)
 
 import sys
@@ -143,4 +187,9 @@ if __name__ == "__main__":
         client()
 
     elif "patch" in sys.argv:
-        patch(int(sys.argv[2]),int(sys.argv[3]))
+        v = None
+        try:
+            v = int(sys.argv[3])
+        except Exception as e:pass
+        r=patch(int(sys.argv[2]),v)
+        print(r)