cmd="""
# ----------------
# setup as root !!
# ----------------
/usr/bin/umount /ram-dir

# create ramfs
mkdir -p /ram-dir
/usr/bin/mount ramfs -t ramfs /ram-dir
## or tmpfs
## /usr/bin/mount tmpfs -t tmpfs -o uid=bob -o gid=bob /ram-disk

mkdir /ram-dir/user
chown user:user /ram-dir/user
dd if=/dev/zero of=/ram-dir/user/x bs=100M count=10 status=progress
dd if=/dev/zero of=/ram-dir-x bs=100M count=10 status=progress

mount | grep ram-dir
# ----------------
"""

#print(cmd)

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(len(data)):
        f.write(b'\x00')
        f.flash()


#bytearray
import struct
import os

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:
        i = int(i)
        _extend(i,data_buffer)   
        data_buffer[i] = v
    except Exception as 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 patch(i,v=None):
    try:
        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("patch-err-binfs",e)
        raise e

import random
def server():
    x = 1
    while 1:
        try:
            for i in range(200,0,-1):
                i+=20
                if i >= len(data):
                    continue
                v=data[i]
                v+=x+i
                if x > 255:
                    x=0

                r=patch(i,v)
                data[i]=v
                time.sleep(0.02)           
            time.sleep(10)           
        except Exception as e:
            print("server-err-binfs",e)
            time.sleep(1)
        x += 1


def client():
    while 1:
        try:
            i=0
            v = patch(i)
            while type(v) is int:
                _extend(i)


                if v != data[i]:
                    v2=struct.pack('B',v)
                    print(round(time.time(),3),[i,v,v2])

                    data[i] = v
                i+=1
                v = patch(i)
                
            time.sleep(0.01)
        except Exception as e:
            print("client-err-binfs",e,i,len(data))
            time.sleep(1)

import sys

if __name__ == "__main__":
    print("ARGV", sys.argv)

    if "server" in sys.argv:
        server()

    elif "client" in sys.argv:
        client()

    elif "patch" in sys.argv:
        v = None
        try:
            v = int(sys.argv[3])
        except Exception as e:pass
        r=patch(int(sys.argv[2]),v)
        print(r)