diff --git a/bluedot_server/dotserver.py b/bluedot_server/dotserver.py
index c378c670735b01ce5b1b8de9600ce1dbe1bd0db9..d63ce410ffff2de43c3264d0edfdeb21d5d30a0e 100644
--- a/bluedot_server/dotserver.py
+++ b/bluedot_server/dotserver.py
@@ -20,6 +20,8 @@ if platform!="":
 
 data0=0
 data1=0
+data2=0xaa
+
 last_sensors=0
 sensors=0
 
@@ -33,10 +35,33 @@ laststate=st_stop
 pwm_left=12
 pwm_right=33
 
+
+#d0 - d7
 data_pins=[7,8,10,11,13,15,16,18]
+data_dir=22
+data_gate=40
+
+data_out=GPIO.HIGH
+data_in=GPIO.LOW
+data_en=GPIO.LOW
+data_dis=GPIO.HIGH
+
+a0=29
+a1=31
+
+a2=32
+a3=35
+a4=36
+
+rd=37
+wr=38
+
+#master card number:
+master_out=2
 
-data_strobe0=22
-data_strobe1=40     
+extra_out=3
+
+master_in=4
 
 data0_ids={"fwd":0,"bwd":1,"LL":2,"LR":3,"RL":4,"RR":5,"none":6,"none":7}
 data1_ids={"lbrushcw":0,"lbrushccw":1,"rbrushcw":2,"rbrushccw":3,"col1":4,"col2":5,"col3":6,"col4":7}
@@ -45,7 +70,7 @@ data1_ids={"lbrushcw":0,"lbrushccw":1,"rbrushcw":2,"rbrushccw":3,"col1":4,"col2"
 ##### id_sd 27
 ##### id_sc 28
 
-estop_pins=[29,31,32,35,36,37,38]
+#estop_pins=[29,31,32,35,36,37,38]
 
 sensor_ids=["railstart","railend","railposition","left","right","center","none"]
 
@@ -113,41 +138,167 @@ pumptargets=[
 
 
 #################################################
+def blink(pin):
+    GPIO.output(pin,GPIO.HIGH)
+    time.sleep(.01)
+    GPIO.output(pin,GPIO.LOW)
+    time.sleep(.01)
 
+def set_adr_pins(adr):
+    if ((adr>>0)&1==1):
+       GPIO.output(a0,GPIO.HIGH)
+    else:
+       GPIO.output(a0,GPIO.LOW)
+    if ((adr>>1)&1==1):
+       GPIO.output(a1,GPIO.HIGH)
+    else:
+       GPIO.output(a1,GPIO.LOW)
 
+def set_card_adr(card):
+    if ((card>>0)&1==1):
+       GPIO.output(a2,GPIO.HIGH)
+    else:
+       GPIO.output(a2,GPIO.LOW)
+    
+    if ((card>>1)&1==1):
+       GPIO.output(a3,GPIO.HIGH)
+    else:
+       GPIO.output(a3,GPIO.LOW)
 
-#####################################################
+    if ((card>>2)&1==1):
+       GPIO.output(a4,GPIO.HIGH)
+    else:
+       GPIO.output(a4,GPIO.LOW)
 
 
-def init_hardware():
-  if platform!="":
-    print("setting up GPIO")
+
+def set_data_pins(d):
+    #print("data0: ",data0)
+    for b in range(0,8):
+        if ((d>>b)&1==1):
+            GPIO.output(data_pins[b],GPIO.HIGH)
+        else:
+            GPIO.output(data_pins[b],GPIO.LOW)
+
+def get_data_pins():
+    #print("data0: ",data0)
+    v=0
+    t_data=0
+    for b in range(0,7):
+        v=GPIO.input(data_pins[b])
+        if (v==1):
+            t_data=t_data | (1<<b)
+    return t_data
+
+
+def strobe_wr():
+    GPIO.output(wr,GPIO.LOW)
+    time.sleep(.001)
+    GPIO.output(wr,GPIO.HIGH)
+
+def strobe_rd():
+    GPIO.output(rd,GPIO.LOW)
+    time.sleep(.001)
+    GPIO.output(rd,GPIO.HIGH)
+
+
+def write_data(card_no,adr,d):
+    #print("WRITE card_no: ",card_no," subadr: ",adr," data: ",d)
+
+    set_data_out()
+    GPIO.output(data_dir,data_out)
+    #time.sleep(0.001)
+    set_data_pins(d)
+    #time.sleep(0.001)
+    GPIO.output(data_gate,data_en)
+    #time.sleep(0.001)
+    set_adr_pins(adr)
+    set_card_adr(card_no)
+    time.sleep(0.01)
+    strobe_wr()
+    time.sleep(0.01)
+    GPIO.output(data_gate,data_dis)
+    set_data_pins(0)
+    set_adr_pins(15)
+
+    #time.sleep(0.01)
+
+def read_data(card_no,adr):
+    set_data_in()
+    GPIO.output(data_dir,data_in)
     
-    print("setup data_strobe0:",data_strobe0)
+    set_adr_pins(adr)
+    set_card_adr(card_no)
+    GPIO.output(data_gate,data_en)
+    time.sleep(0.01)
+
+    strobe_rd()
+    time.sleep(0.01)
+    result=get_data_pins()
+
+    GPIO.output(data_gate,data_dis)
+    set_data_out()
+    set_data_pins(0)
+    set_adr_pins(15)
 
-    GPIO.setup(data_strobe0,GPIO.OUT)
-    GPIO.output(data_strobe0,GPIO.LOW)
+    #print("READ card_no: ",card_no," subadr: ",adr," data: ",result)
 
-    print("setup data_strobe1:",data_strobe1)
-    GPIO.setup(data_strobe1,GPIO.OUT)
-    GPIO.output(data_strobe1,GPIO.LOW)
+    return result
 
-    print("setup data pins")
+
+
+def set_data_out():
+    #print("setup data pins out")
     for i in range(0,8):
-      print("pin: ",data_pins[i])
+#      print("pin: ",data_pins[i])
       GPIO.setup(data_pins[i],GPIO.OUT)
       GPIO.output(data_pins[i],GPIO.LOW)
 
-    print("setup estop pins:")
-    for i in range(0,7):
-      print("pin: ",estop_pins[i])
-      try:
-        GPIO.setup(estop_pins[i],GPIO.IN,pull_up_down=GPIO.PUD_DOWN)
-      except:
-        print(estop_pins[i],"trouble")
-        pass
-      #GPIO.output(estop_pins[i],GPIO.LOW)
+def set_data_in():
+    #print("setup data pins in")
+    for i in range(0,8):
+#      print("pin: ",data_pins[i])
+      GPIO.setup(data_pins[i],GPIO.IN)
+
+#####################################################
+
+def init_hardware():
+  #if platform!="":
+    print("setting up GPIO")
+    
+    print("setup data_dir:",data_dir)
+
+    GPIO.setup(data_dir,GPIO.OUT)
+    GPIO.output(data_dir,data_out)
+
+    print("setup data_gate:",data_gate)
+    GPIO.setup(data_gate,GPIO.OUT)
+    GPIO.output(data_gate,data_dis)
+
+    set_data_out()
+    
+
+    print("setup address pins:")
+    GPIO.setup(a0,GPIO.OUT)
+    GPIO.setup(a1,GPIO.OUT)
+    GPIO.setup(a2,GPIO.OUT)
+    GPIO.setup(a3,GPIO.OUT)
+    GPIO.setup(a4,GPIO.OUT)
+
+    GPIO.output(a0,GPIO.LOW)
+    GPIO.output(a1,GPIO.LOW)
+    GPIO.output(a2,GPIO.LOW)
+    GPIO.output(a3,GPIO.LOW)
+    GPIO.output(a4,GPIO.LOW)
 
+    print("setup read/write pins:")
+    GPIO.setup(rd,GPIO.OUT)
+    GPIO.setup(wr,GPIO.OUT)
+    GPIO.output(rd,GPIO.HIGH)
+    GPIO.output(rd,GPIO.HIGH)
+
+
+      
     print("init spi channel for adc")
     spi_max_speed = 10000 # 4 MHz
     V_Ref = 5000 # 5V in mV
@@ -170,44 +321,10 @@ def init_hardware():
     print("hardware setup done")
 
 
-###################################################
-
-def get_sensors():
-    global sensors
-    t_estops=0
-    for b in range(0,7):
-        v=GPIO.input(estop_pins[b])
-        if (v==1):
-            t_estops=t_estops | (1<<b)
-    sensors=t_estops        
-    
+#################################################
 
 ###################################################
 
-def set_data():
-    #print("data0: ",data0)
-    for b in range(0,8):
-        if ((data0>>b)&1==1):
-            GPIO.output(data_pins[b],GPIO.HIGH)
-        else:
-            GPIO.output(data_pins[b],GPIO.LOW)
-    GPIO.output(data_strobe0,GPIO.HIGH)
-    time.sleep(.01)
-    GPIO.output(data_strobe0,GPIO.LOW)
-
-
-    #print("data1: ",data1)
-    for b in range(0,8):
-        if ((data1>>b)&1==1):
-            GPIO.output(data_pins[b],GPIO.HIGH)
-        else:
-            GPIO.output(data_pins[b],GPIO.LOW)
-    GPIO.output(data_strobe1,GPIO.HIGH)
-    time.sleep(.01)
-    GPIO.output(data_strobe1,GPIO.LOW)
-
-
-
 ###################################################
 
 def initsequences():
@@ -270,7 +387,7 @@ def forward_on():
 
 #    print(data0_ids["fwd"])
     data0=data0 | 1<<data0_ids["fwd"]
-    set_data()
+#    write_data(master_out,0,data0)
 
     state=st_fwd
     if state!=laststate:
@@ -285,8 +402,8 @@ def backward_on():
     global data0
 
 #    print(data0_ids["fwd"])
-    data0=data0 | 1<<data0_ids["fwd"]
-    set_data()
+    data0=data0 | 1<<data0_ids["bwd"]
+#    write_data(master_out,0,data0)
     
     state=st_bwd
     if state!=laststate:
@@ -302,7 +419,7 @@ def stop():
 
     data0=data0 & ~(1<<data0_ids["fwd"])
     data0=data0 & ~(1<<data0_ids["bwd"])
-    set_data()
+#    write_data(master_out,0,data0)
 
     #GPIO.output(bwd_pin,GPIO.LOW)
     #GPIO.output(fwd_pin,GPIO.LOW)
@@ -321,11 +438,13 @@ def quicktimerevent():
     global stoprequested
     global power
     global last_sensors
-    
-    get_sensors()
+
+        
+    sensors=read_data(master_in,0)
     if sensors!=last_sensors:
       print(sensors)
       last_sensors=sensors
+    
 
     if stoprequested:
        if (actual_left_speed==0) and (actual_right_speed==0) and (actual_track_speed==0):
@@ -352,6 +471,11 @@ def quicktimerevent():
             actual_track_speed-=1
     setMoveOutput(actual_track_speed)
 
+    write_data(master_out,0,data0)
+    write_data(master_out,1,data1)
+
+    write_data(extra_out,0,data2)
+
     sendStatus()
 
 
@@ -373,6 +497,16 @@ def sectimerevent():
     global nextpumptarget
     global stoprequested
 
+    global data2
+
+
+    data2=random.randint(0,255)
+
+
+    return
+
+
+
     time_elap+=1
     
     if power:
@@ -520,7 +654,8 @@ def setRotateOutput(id, speed):
         pwmright.ChangeDutyCycle(abs(speed))
 
 
-    set_data()
+#    write_data(master_out,1,data1)
+
 
 ###################################################    
 
@@ -531,6 +666,20 @@ def connected():
 
 ########################################################
 
+def disconnected():
+    global data1
+    
+    print("DISCONNECTED")
+    
+
+    data1=data1 & ~(1<<data1_ids["col1"])
+    data1=data1 & ~(1<<data1_ids["col2"])
+    data1=data1 & ~(1<<data1_ids["col3"])
+    data1=data1 & ~(1<<data1_ids["col4"])
+
+    
+
+########################################################
 
 #clicked event
 def pressed(pos,id):
@@ -560,7 +709,7 @@ def pressed(pos,id):
 
     ts = int(round(time.time() * 1000))
     
-    #print("pressed: ",id,ts);
+#    print("pressed: ",id,ts);
 
     if id=="leftbrush":
         leftpressedts=ts
@@ -592,18 +741,19 @@ def pressed(pos,id):
     elif id in data0_ids:
         if power:
             data0=data0 | 1<<data0_ids[id]
-            set_data()
+#            write_data(master_out,0,data0)
+
 
     elif id in data1_ids:
         if power:
             data1=data1 | 1<<data1_ids[id]
-            set_data()
-
+#            write_data(master_out,1,data1)
+        
 ######################################################
 
 def released(pos,id):
     ts = int(round(time.time() * 1000))
-    #print("released: ",id, ts)
+#    print("released: ",id, ts)
 
     global data0
     global data1
@@ -633,12 +783,13 @@ def released(pos,id):
     elif id in data0_ids:
         #print(data0_ids[id])
         data0=data0 & ~(1<<data0_ids[id])
-        set_data()
+#        write_data(master_out,0,data0)
+
 
     elif id in data1_ids:
         #print(data1_ids[id])
         data1=data1 & ~(1<<data1_ids[id])
-        set_data()
+#        write_data(master_out,1,data1)
 
 
 
@@ -701,7 +852,8 @@ pwmright = GPIO.PWM(pwm_right, 100)   # Initialize PWM on pwmPin 100Hz frequency
 
 init_hardware()
 
-set_data()
+write_data(master_out,0,data0)
+write_data(master_out,1,data1)
 
 
 #initsequences()
@@ -725,7 +877,7 @@ target_speed=0
 
 
 t = aTimer(1,sectimerevent)
-#t.start()
+t.start()
 
 t2 = aTimer(.1,quicktimerevent)
 t2.start()
@@ -736,6 +888,7 @@ bd.when_rotated = rotated
 bd.when_pressed = pressed
 bd.when_released = released
 bd.when_client_connects = connected
+bd.when_client_disconnects = disconnected
 
 pause()