First quick attempt at an oscilloscope demo for the stampdock software of http://stampdock.com/ it demonstrates how to use the stampdock software from an mbed

Dependencies:   mbed

Revision:
0:6a0d5fb13029
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Tue Nov 02 15:30:43 2010 +0000
@@ -0,0 +1,1357 @@
+ 
+
+// mbed demo program (needs stampdock software)
+// by apspijkerman ap@apsdev.com
+
+
+#include "mbed.h"
+
+//Serial pc(USBTX, USBRX); // tx, rx
+Serial serial(USBTX, USBRX); // tx, rx     default 9600 8N1
+
+AnalogIn xa(p15);
+AnalogIn ya(p16);
+
+DigitalOut myled1(LED1);
+DigitalOut myled2(LED2);
+DigitalOut myled3(LED3);
+DigitalOut myled4(LED4);
+
+
+void SetLed(int led, int mode)
+{
+   if (led == 0) myled1 = mode;
+   if (led == 1) myled2 = mode;
+   if (led == 2) myled3 = mode;
+   if (led == 3) myled4 = mode;
+}
+
+
+void Blink(int led)
+{
+   if (led == 0) myled1 = 1;
+   if (led == 1) myled2 = 1;
+   if (led == 2) myled3 = 1;
+   if (led == 3) myled4 = 1;
+   wait(0.1);
+   if (led == 0) myled1 = 0;
+   if (led == 1) myled2 = 0;
+   if (led == 2) myled3 = 0;
+   if (led == 3) myled4 = 0;   
+}
+
+
+
+void SetLeds(void)
+{
+   int t;
+
+// flash all leds
+/*
+   for (t = 0; t < 4; t++){
+      SetLed(t, 1);
+   }
+   wait(1);
+   for (t = 0; t < 4; t++){
+      SetLed(t, 0);
+   }   
+*/
+// kitt led test
+   for (t = 0; t < 4; t++){
+      SetLed(t, 1);
+      wait(0.2);
+      SetLed(t, 0);
+   }
+}
+
+
+
+void ToggleLed(int led)
+{
+   if (led == 0) myled1 = !myled1;
+   if (led == 1) myled2 = !myled2;
+   if (led == 2) myled3 = !myled3;
+   if (led == 3) myled4 = !myled4;
+   wait(0.25);
+}
+
+//public class demo {
+
+  // seems we need to write commands in one go, so have a buffer
+  //static StringBuffer buf = new StringBuffer(128);
+
+  // check if the system has events for us
+  // if value greater then zero then thats the ID number of
+  // the gui element or the event number
+
+
+void InitStampdock(void)
+{
+//   serial.begin( 9600 );
+//   serial.baud(19200);
+//   serial.format(8,None,1);
+   SetLeds();
+
+}
+
+
+
+  static int GetEvent()
+  {
+      int e = 0, ready = 0, cnt = 0;
+      char v;
+      //  DEBUG "?Q;"     'query for events .. also sync with PC
+      //  SERIN 16, Baud, [x]             '16468
+      //  PAUSE 1   ' millisecs .. let serial bus settle
+
+      //serial.printf("\n");      // test .. purge buffer ?
+      serial.printf("?Q;");     // query for event
+      //wait(0.11);   //CPU.delay(1);        // ??
+      do{
+      if (serial.readable()){
+         //v = Serial.read();
+         v = serial.getc();
+
+         e = v;
+         if (e < 0) e += 256;      // signed char to int ?
+
+         //e = (255-v) + 1;   // 2's complement
+
+         //serial.printf("EVENT:");
+         //serial.printf(e);
+         //serial.printf("<-");
+         ready = 1;
+      }else{
+         //serial.printf("no event");
+         wait(0.0001);
+         cnt++;
+         if (cnt == 1000) ready = 1;
+         Blink(0);
+      }
+      }while(!ready);
+      //CPU.delay(10);
+
+      // .. flush out of sync events ..
+      //while (serial.readable()){
+      if (serial.readable()){
+         // Serial.read();
+         serial.getc();
+         Blink(1);
+      }
+
+      if (serial.readable()){
+         // Serial.read();
+         serial.getc();
+         Blink(2);
+      }
+      
+      return e;
+  }
+
+  // request the state of GUI element i
+
+  static int GetValue(int i)
+  {
+      int e = 0, ready = 0, cnt = 0;
+      char v;
+      //StringBuffer buf=new StringBuffer(12);
+
+      // DEBUG "?i",DEC x,";"      'get state of gui element x
+      // SERIN 16, Baud, [s]             '16468
+      // PAUSE 1   ' millisecs
+
+      //serial.printf("?i");     // query for event
+      //serial.printf(i);
+      //serial.printf(";");
+
+      //buf.clear();
+      //buf.append("?i");
+      //buf.append( i );
+      //buf.append(";");
+      //System.out.print(buf.toString());
+ 
+      serial.printf("?i%d;", i );
+
+      //wait(0.1);         //CPU.delay(1);         // ??
+      do {
+      if (serial.readable()){
+         //v = Serial.read();
+         v = serial.getc();
+
+         e = v;
+         if (e < 0) e += 256;    // signed char to int ?
+
+         //e = (255-v) + 1;   // 2's complement
+         ready = 1;
+      }else{
+         wait(0.0001);
+         cnt++;
+         if (cnt == 1000) ready = 1;
+      }
+      //CPU.delay(10);
+      }while(!ready);
+      return e;
+  }
+
+  // set the state (v) of gui element i
+
+  static void SetValue(int i, int v)
+  {
+      //StringBuffer buf=new StringBuffer(16);
+
+      // DEBUG "?i",DEC x,";"      'get state of gui element x
+      // SERIN 16, Baud, [s]             '16468
+      // PAUSE 1   ' millisecs
+
+      //serial.printf("!i");     // set value
+      //serial.printf(i);
+      //serial.printf(",")
+      //serial.printf(v);
+      //serial.printf(";");
+
+      //buf.clear();      // slow ascii method to allow values > 255
+      if (i <= 255){
+         //buf.append("!ib");      // fast binary way
+         //buf.append((char) 2 );  // write 2 bytes
+         //buf.append((char) i );  // write id
+         //buf.append((char) v );  // always smaller als 256
+
+         serial.printf("!ib%c%c%c;", 2 , i , v );
+      }else{
+         //buf.append("!i");   // slow ascii way
+         //buf.append( i );    // in case ID greater as 255
+         //buf.append(",");
+         //buf.append( v );
+
+         serial.printf("!i%d,%d;", i, v);
+      }
+      //buf.append(";");
+      //System.out.print(buf.toString());
+
+      //CPU.delay(1);         // ??
+  }
+
+
+  static char ReadByte()
+  {
+     char v = 0, ready = 0, cnt = 0;
+
+     //wait(0.1);
+     do {
+     if (serial.readable()){
+         //v =  Serial.read();
+         v = serial.getc();
+
+         //e = v;
+         //if (e < 0) e += 256;    // signed char to int ?
+         ready = 1;
+     }else{
+        wait(0.0001);
+        cnt++;
+        if (cnt == 1000) ready = 1;
+     }
+     }while(!ready);
+     return v;
+  }
+
+
+  static void SetColor(int r, int g, int b)
+  {
+     // StringBuffer buf=new StringBuffer(12);
+
+    if (r == 0 && g == 0 && b == 0){
+      serial.printf("!s;");      // black
+    }else{
+      //buf.clear();
+      //buf.append("!sb");     // fast binary method .. so values <= 255
+      //buf.append((char) 3 ); // write 3 bytes
+      //buf.append((char) r );
+      //buf.append((char) g );
+      //buf.append((char) b );
+      //buf.append(";"      );
+      //System.out.print(buf.toString());
+
+      serial.printf("!sb%c%c%c%c;", 3, r, g, b );
+    }
+      //CPU.delay(1);         // ??
+  }
+
+
+   static void SetGrey(int g)
+  {
+     // StringBuffer buf=new StringBuffer(12);
+
+    // DEBUG "!fb", 1, dat, ";"
+
+    if (g == 0){
+      //System.out.print("!f;");      // black
+      serial.printf("!f;");      // black
+    }else{
+      //buf.clear();
+      //buf.append("!fb");     // fast binary method .. so values <= 255
+      //buf.append((char) 1 ); // write 3 bytes
+      //buf.append((char) g );
+      //buf.append(";"      );
+      //System.out.print(buf.toString());
+
+
+      serial.printf("!sf%c%c;", 1, g );
+    }
+      //CPU.delay(1);         // ??
+  }
+
+
+
+  static void SetLED(int i, int r, int g, int b)
+  {
+     // StringBuffer buf=new StringBuffer(12);
+
+      //buf.clear();
+      //buf.append("!jb");     // fast binary method .. so values <= 255
+      //buf.append((char) 4 ); // write 4 bytes
+      //buf.append((char) i );
+      //buf.append((char) r );
+      //buf.append((char) g );
+      //buf.append((char) b );
+      //buf.append(";"      );
+      //System.out.print(buf.toString());
+
+      serial.printf("!jb%c%c%c%c%c;", 4, i, r, g, b );
+
+      //CPU.delay(1);         // ??
+  }
+
+  static void DrawLine(int x1, int y1, int x2, int y2)
+  {
+      //StringBuffer buf=new StringBuffer(36);
+
+      //if (x1 < 0) x1 = 0;
+      //if (y1 < 0) y1 = 0;
+      //if (x2 < 0) x2 = 0;
+      //if (y2 < 0) y2 = 0;
+
+      //buf.clear();
+      if (x1 >= 0 && x1 <= 255 && y1 >= 0 && y1 <= 255 && x2 >= 0 && x2 <= 255 && y2 
+
+>= 0 && x2 <= 255){
+        //buf.append("!lb");        // fast binary method
+        //buf.append((char) 4  );   // write 4 bytes
+        //buf.append((char) x1 );
+        //buf.append((char) y1 );
+        //buf.append((char) x2 );
+        //buf.append((char) y2 );
+
+        serial.printf("!lb%c%c%c%c%c;", 4, x1, y1, x2, y2 );
+      }else{
+        //buf.append("!l");     // slow method .. so values > 255
+        //buf.append( x1 );
+        //buf.append("," );
+        //buf.append( y1 );
+        //buf.append("," );
+        //buf.append( x2 );
+        //buf.append("," );
+        //buf.append( y2 );
+
+        serial.printf("!l%d,%d,%d,%d;", x1, y1, x2, y2);
+      }
+      //buf.append(";" );
+      //System.out.print(buf.toString());
+
+      //CPU.delay(1);         // ??
+  }
+
+  static void Plot(int x, int y)
+  {
+      //StringBuffer buf=new StringBuffer(16);
+
+      //if (x < 0) x = 0;
+      //if (y < 0) y = 0;
+
+      //buf.clear();
+      if (x >= 0 && x <= 255 && y >= 0 && y <= 255){
+         //buf.append("!pb");       // fast method .. so values <= 255
+         //buf.append((char) 2  );  // write 2 bytes
+         //buf.append((char) x  );
+         //buf.append((char) y  );
+
+         serial.printf("!pb%c%c%c;", 2, x, y);
+      }else{
+         //buf.append("!p");        // slow method .. so values > 255
+         //buf.append( x  );
+         //buf.append("," );
+         //buf.append( y  );
+
+         serial.printf("!p%d,%d;", x, y);
+      }
+      //buf.append(";" );
+      //System.out.print(buf.toString());
+
+      //CPU.delay(1);         // ??
+  }
+
+
+  static void DrawGrid(int a, int b, int c, int d, int e, int f)
+  {
+      //StringBuffer buf=new StringBuffer(36);
+
+      //buf.clear();
+      //buf.append("!ab");        // fast binary method
+      //buf.append((char) 6  );   // write 6 bytes
+      //buf.append((char) a  );   // xspace
+      //buf.append((char) b  );   // yspace
+      //buf.append((char) c  );   // xlines
+      //buf.append((char) d  );   // ylines
+      //buf.append((char) e  );   // xoffset
+      //buf.append((char) f  );   // yoffset
+      //buf.append(";" );
+      //System.out.print(buf.toString());
+
+      serial.printf("!ab%c%c%c%c%c%c%c;", 6, a, b, c, d, e, f );
+
+      //CPU.delay(1);         // ??
+  }
+
+  static void ClearScreen()
+  {
+      serial.printf("!c;");
+  }
+
+  // shortcut:     Cmd("!c;");  or Cmd("?O;");
+
+  static void Cmd(char *p)
+  {
+      serial.printf(p);
+  }
+
+  // for "!nSpeech;" or "!Llog file;"
+
+  static void CmdStr(char cmd, char *p  )
+  {
+       //buf.clear();
+       //buf.append("!");
+       //buf.append( cmd  );
+       //buf.append( p    );
+       //buf.append(";" );
+       //System.out.print(buf.toString());
+
+       serial.printf("!%c%s;", cmd, p);
+  }
+
+  // cmd with no argument so  Cmd0('s');  = "!s;"
+
+  static void Cmd0(char cmd  )
+  {
+       //buf.clear();
+       //buf.append("!");
+       //buf.append( cmd  );
+       //buf.append(";" );
+       //System.out.print(buf.toString());
+
+       serial.printf("!%c;", cmd);
+  }
+
+  // request with no arguments
+  // Req0( 'm' );  =  "?m;"
+
+  static void Req0(char req  )
+  {
+       //buf.clear();
+       //buf.append("?");
+       //buf.append( req  );
+       //buf.append(";" );
+       //System.out.print(buf.toString());
+
+       serial.printf("?%c;", req );
+  }
+
+  // cmd with 1 arg   Cmd1('a' , 1 );  =  "!a1;"
+
+  static void Cmd1(char cmd, int arg1 )
+  {
+     //buf.clear();
+     //buf.append("!");
+     //buf.append( cmd  );
+     if (arg1 < 256){
+       //buf.append( 'b'  );      // binary mode
+       //buf.append((char) 1  );  // 1 argument
+       //buf.append((char) arg1 );
+
+       serial.printf("!%cb%c%c;", cmd, 1, arg1 );
+     }else{
+       //buf.append( arg1 );       // slow ascii mode
+
+       serial.printf("!%c%d;", cmd, arg1 );
+    }
+    //buf.append(";" );
+    //System.out.print(buf.toString());
+  }
+
+  // cmd with 2 args    Cmd2('G', 20, 1);  = "!G20,1;"
+  // plot = Cmd2( 'p', x, y );
+
+  static void Cmd2(char cmd, int arg1, int arg2 )
+  {
+    //buf.clear();
+    //buf.append("!"   );       // !
+    //buf.append( cmd  );
+    if (arg1 < 255 && arg2 < 255){
+       //buf.append( 'b'  );      // binary mode
+       //buf.append((char) 2  );  // 2 arguments
+       //buf.append((char) arg1 );
+       //buf.append((char) arg2 );
+
+       serial.printf("!%cb%c%c%c;", cmd, 2, arg1, arg2 );
+     }else{
+       //buf.append( arg1 );        // slow ascii mode
+       //buf.append(","   );
+       //buf.append( arg2 );
+ 
+       serial.printf("!%c%d,%d;", cmd, arg1, arg2 );
+     }
+     //buf.append(";"   );
+     //System.out.print(buf.toString());
+  }
+
+  // cmd with 3 args
+  // setcolor = Cmd3( 's', r, g, b );
+
+  static void Cmd3(char cmd, int arg1, int arg2, int arg3 )
+  {
+    //buf.clear();
+    //buf.append("!"   );       // !
+    //buf.append( cmd  );
+    if (arg1 < 255 && arg2 < 255 && arg3 < 255){
+       //buf.append( 'b'  );      // binary mode
+       //buf.append((char) 3  );  // 3 arguments
+       //buf.append((char) arg1 );
+       //buf.append((char) arg2 );
+       //buf.append((char) arg3 );
+
+       serial.printf("!%cb%c%c%c%c;", cmd, 3, arg1, arg2, arg3 );
+    }else{
+       //buf.append( arg1 );     // slow ascii mode
+       //buf.append(","   );
+       //buf.append( arg2 );
+       //buf.append(","   );
+       //buf.append( arg3 );
+
+       serial.printf("!%c%d,%d,%d;", cmd, arg1, arg2, arg3 );
+     }
+     //buf.append(";"   );
+     //System.out.print(buf.toString());
+  }
+
+  // cmd with 4 args
+  // line = Cmd4( 'l', x1, y1, x2, y2);
+
+  static void Cmd4(char cmd, int arg1, int arg2, int arg3, int arg4 )
+  {
+    //buf.clear();
+    //buf.append("!"   );       // !
+    //buf.append( cmd  );
+    if (arg1 < 255 && arg2 < 255 && arg3 < 255 && arg4 < 255){
+       //buf.append( 'b'  );      // binary mode
+       //buf.append((char) 4  );  // 4 arguments
+       //buf.append((char) arg1 );
+       //buf.append((char) arg2 );
+       //buf.append((char) arg3 );
+       //buf.append((char) arg4 );
+
+       serial.printf("!%cb%c%c%c%c%c;", cmd, 4, arg1, arg2, arg3, arg4 );
+    }else{
+       //buf.append( arg1 );    // slow ascii mode
+       //buf.append(","   );
+       //buf.append( arg2 );
+       //buf.append(","   );
+       //buf.append( arg3 );
+       //buf.append(","   );
+       //buf.append( arg4 );
+ 
+       serial.printf("!%c%d,%d,%d,%d;", cmd, arg1, arg2, arg3, arg4 );
+    }
+     //buf.append(";"   );
+     //System.out.print(buf.toString());
+  }
+
+  // play video, mp3 or picture
+
+  static void Media(char *p)
+  {
+       //buf.clear();
+       //buf.append("!V");
+       //buf.append( p );
+       //buf.append(";" );
+       //System.out.print(buf.toString());
+  
+       serial.printf("!V%s;", p);
+  }
+
+  static void Speech(char *p)
+  {
+       //buf.clear();
+       //buf.append("!n");
+       //buf.append( p );
+       //buf.append(";" );
+       //System.out.print(buf.toString());
+ 
+       serial.printf("!n%s;", p);
+  }
+
+  static void Log(char *p)
+  {
+       //buf.clear();
+       //buf.append("!L");
+       //buf.append( p );
+       //buf.append(";" );
+       //System.out.print(buf.toString());
+  
+       serial.printf("!L%s;", p);
+ }
+
+ static void ScrollLeft()
+ {
+     serial.printf("!G20,1;");
+  }
+
+/*
+  static void DrawGrid(int a, int b, int c, int d, int e, int f)
+  {
+      //StringBuffer buf=new StringBuffer(36);
+
+      //buf.clear();
+      //buf.append("!ab");        // fast binary method
+      //buf.append((char) 6  );   // write 6 bytes
+      //buf.append((char) a  );   // xspace
+      //buf.append((char) b  );   // yspace
+      //buf.append((char) c  );   // xlines
+      //buf.append((char) d  );   // ylines
+      //buf.append((char) e  );   // xoffset
+      //buf.append((char) f  );   // yoffset
+      //buf.append(";" );
+
+      //System.out.print(buf.toString());
+
+      serial.printf("!ab%c%c%c%c%c%c%c;", 6, a, b, c, d, e, f );
+
+      //CPU.delay(1);         // ??
+  }
+*/
+
+  /*
+  static void initpins() {
+    // OUTPUT dischargecap     'capacitor reset   p 15
+    // LOW    dischargecap     'disable           p 15
+
+    // OUTPUT chargecap        'capacitor charge  p 14
+    // HIGH   chargecap        'disable           p 14
+
+    // INPUT  chanblow      'channel b    p 12
+    // INPUT  chanalow      'channel a    p 13
+    // INPUT  chanbhigh     'channel b high  p 10
+    // INPUT  chanahigh     'channel a high  p 11
+
+    CPU.setInput (CPU.pins[10]);    // chan b high opamp
+    CPU.setInput (CPU.pins[11]);    // chan a high opamp
+    CPU.setInput (CPU.pins[12]);    // chan b low opamp
+    CPU.setInput (CPU.pins[13]);    // chan a low opamp
+
+    CPU.setOutput(CPU.pins[14]);    // charge cap pin
+    CPU.setOutput(CPU.pins[15]);    // discarge cap pin
+
+    CPU.writePin (CPU.pins[15] ,  false );
+    CPU.writePin (CPU.pins[14] ,  true  );
+  }
+
+
+  // interface with ltc1298 chip
+
+  // static int gEnablePin;        // speedup ?
+  // static int gClockPin;
+  // static int gDataPin;
+
+  static void initadc(int dataPin, int clockPin, int enablePin){
+
+    //gEnablePin =  CPU.pins[enablePin];   // speedup ?
+    //gClockPin  =  CPU.pins[clockPin];
+    //gDataPin   =  CPU.pins[dataPin];
+
+    CPU.writePin(CPU.pins[enablePin],false);          // init the bus
+    CPU.writePin(CPU.pins[clockPin ],false);
+    CPU.delay(100);                         // settle down
+    CPU.writePin(CPU.pins[enablePin],false);
+    CPU.writePin(CPU.pins[enablePin],true );
+
+    //CPU.writePin(CPU.pins[dataPin  ],false );     // test
+    //Serial.print(CPU.pins[ 1 ]);      // just adds one ?
+  }
+
+  static int readadc(int dataPin, int clockPin, int enablePin, int channel, int 
+
+mode){
+
+     int command, readSize;
+     int clockIn;
+
+     if (channel == 0)  command = 0x1a;      // %11010  read ch0  (pin2)
+     else               command = 0x1e;      // %11110  read ch1  (pin3)
+
+     readSize   = 12;                        // Bytes to Read on the LTC1298
+     //resolution = 4096;                    // Range of the LTC1298
+     //clockIn    = 1000;
+
+     CPU.writePin(CPU.pins[enablePin],false);
+     // set port
+     CPU.shiftOut(CPU.pins[dataPin],CPU.pins[clockPin],5,CPU.SHIFT_MSB,(command << 
+
+11));
+     // read the value
+     clockIn = 
+
+CPU.shiftIn(CPU.pins[dataPin],CPU.pins[clockPin],readSize,CPU.PRE_CLOCK_MSB);
+     CPU.writePin(CPU.pins[enablePin],true);
+
+     //CPU.delay(100);
+     //CPU.writePin(CPU.pins[dataPin],false ); // test
+     //CPU.setInput(dataPin);
+
+
+     if (mode == 0){           // low
+        clockIn = clockIn - (2048-128);
+     }else{
+        if (mode == 1){         // high
+         //clockIn = clockIn / 16;   //  make 8 bits from 12
+           clockIn = clockIn >> 4;   //  make 8 bits from 12
+        }else{                         // gnd
+           clockIn = 128;
+        }
+     }
+
+     //  Serial.print("v:");
+     //  Serial.print(channel);
+     //  Serial.print(",");
+     //  Serial.print(clockIn);
+     //  Serial.println("");
+
+     return clockIn;
+  }
+  */
+
+
+  /*
+  static int measure(int channel, int mode) {
+    int e, time;
+
+    if (channel == 0){  // chan a
+       if (mode == 0){
+          e = 13;       // a low
+       }else{
+          if (mode == 1){
+             e = 11;       // a high
+          }else{
+             return 128;   // gnd
+          }
+       }
+    }else{   // chan b
+       if (mode == 0){
+          e = 12;       // b low
+       }else{
+          if (mode == 1){
+             e = 10;       // b high
+          }else{
+             return 128;   // gnd
+          }
+       }
+    }
+
+    // PULSOUT dischargecap, 10     '2uS units   ->  20uS
+
+    //CPU.writePin(CPU.pins[15] ,  1 );    // discharge cap
+    //CPU.delay( 1 );
+    //CPU.writePin(CPU.pins[15] ,  0 );
+    CPU.pulseOut(2, CPU.pins[15] );   //     2 x 8.7 = 17 uS
+
+    // LOW    chargecap    'start charge
+    // RCTIME chanahigh, 0 , val         'PULSIN
+    // HIGH   chargecap   'stop charge
+
+    CPU.writePin(CPU.pins[14] ,  false );
+    time = CPU.rcTime( 1000 ,CPU.pins[ e ], true );  //  8.68 uS units    (0-200uS)
+    CPU.writePin(CPU.pins[14] ,  true  );
+
+    //CPU.readPin(  CPU.pins[e]);    // switch back to input
+    time = time << 3;    // resolution 8 times lower as basic stamp
+
+    return time;
+  }
+ */
+
+
+
+/*
+                     val = readadc(2,1,0,  0, ChanAMode );
+                     val = readadc(2,1,0,  1, ChanBMode ); ;
+*/
+// mode0 = low , mode1 = high
+
+int readadc(int p1, int p2, int p3,  int chan, int mode)
+{
+   int ret;
+   
+   if (mode == 0){
+      if (chan == 0)  ret = xa * 4096;
+      if (chan == 1)  ret = ya * 4096;
+   }
+   if (mode == 1){
+      if (chan == 0)  ret = xa *  256;
+      if (chan == 1)  ret = ya *  256;
+   }
+
+   return ret;
+}
+
+int measure( int chan, int mode)
+{
+   int ret;
+   
+   if (mode == 0){
+      if (chan == 0)  ret = xa * 4096;
+      if (chan == 1)  ret = ya * 4096;
+   }
+   if (mode == 1){
+      if (chan == 0)  ret = xa *  256;
+      if (chan == 1)  ret = ya *  256;
+   }
+
+   return ret;
+}
+#define boolean int
+
+  // ChanXMode    '0=off, 1=low, 2=high, 3=gnd ?
+ //  Mode          '0=scope,  1=XY,  2=record   (3=off ?)
+
+
+
+
+
+int main() {
+   boolean UseChanA = true,  UseChanB = true;        // Bit
+   boolean ready, grid = true, adc = false;    // Bit
+   int     ChanAMode = 0, ChanBMode = 0, mode = 0;       // Nib
+   int     PosA = 128, PosB = 128;
+
+   int     val, valb, ecnt = 0;       // Word
+   int     pval = 0, pvalb = 0;     // Bytes
+   int     x, s, cnt = 0, ptr, speed = 0;     // Byte
+
+   boolean trigMode = true, trigEdge = false, trigSrc = false;       // Bit
+   int     trigLevel = 127;   // Byte     (128 results in 127 !)
+   int  mem[100];  //  [] mem;
+
+   //StringBuffer serbuf = new StringBuffer(80);
+
+   //mem      = new int [100];
+
+   InitStampdock();
+
+
+   //initpins();
+   //initadc(2,1,0);
+
+   //for (s = 0; s < 100; s++) System.out.print((char) 127 );
+   //System.out.print((char) 127 );
+   //System.out.print("scope running .. ");
+   serial.printf("scope running .. ");
+
+   // reset value of gui buttons if reset
+   SetValue(1, mode);     // System.out.print("!i1,0;");    // mode, 0 is xt scope
+
+   SetValue(102,0);       // System.out.print("!i102,1;");  // on/off switch on
+   if (grid)     SetValue(103,1); else SetValue(103,0);   // System.out.print("!i103,1;");  // grid switch on
+   if (adc)      SetValue(104,1); else SetValue(104,0);   // System.out.print("!i104,0;");  // ltc1298 off
+
+   SetValue(30, speed);     // System.out.print("!i30,0;");    // speed switch 0
+   SetValue(40, trigLevel); // System.out.print("!i40,128;");  // trigger level 128
+   if (trigMode) SetValue(41,1); else SetValue(41,0); // System.out.print("!i41,1;");  // trigger on
+   if (trigEdge) SetValue(42,1); else SetValue(42,0); // System.out.print("!i42,1;");  // trigger edge
+   if (trigSrc)  SetValue(43,1); else SetValue(43,0); // System.out.print("!i43,0;");  // trigger source
+
+   SetValue(10, PosA);      // System.out.print("!i10,128;");  // pos chan a
+   SetValue(12, ChanAMode); // System.out.print("!i12,0;");    // chan a mode
+   if (UseChanA) SetValue(11,1); else SetValue(11,0); // System.out.print("!i11,1;");    // channel a on
+
+   SetValue(20, PosB);       // System.out.print("!i20,128;");  // pos chan b
+   SetValue(22, ChanBMode);  // System.out.print("!i22,0;");    // chan b mode
+   if (UseChanB) SetValue(21,1); else SetValue(21,0);  // System.out.print("!i21,1;");    // channel b on
+
+   while (true){
+      if (ecnt == 2){        // test speed up
+         x = GetEvent();
+         ecnt = 0;
+      }else{
+         ecnt++;
+         x = 0;
+      }
+
+      if (x != 0){      // do we have a gui click or event ?
+        ecnt = 0;            // just had an event, so max wait
+        s = GetValue(x);     // get value of gui element x
+
+        // now handle GUI element x with value/state s
+        if (x == 1){      //mode 0=scope, 1=xy, 2=rec(,3 =off ?)
+           mode = s;
+           // clear graph
+           //'DEBUG "!s100,100,200;!c;"    'set blue color , clear screen    17c
+           //DEBUG "!sb",3, 100,100,200, ";!c;"     'fast binary way to set color  11c
+           //System.out.print("!s100,100,200;!c;");
+           SetColor(100,100,200);
+           ClearScreen();
+        } else
+        if (x == 102){      // on/off switch ??
+           // mode = s;
+        } else
+        if (x == 100){     // turnknob for recorder
+           // mode = s;
+        } else
+        if (x == 103){     // grid on/off switch
+           //grid = s;
+           if (s == 0) grid = false; else grid = true;
+        } else
+        if (x == 104){     // ltc1298 on/off switch
+           //grid = s;
+           if (s == 0) adc = false; else adc = true;
+        } else
+        if (x == 30){      // speed 0,1,2,3
+           speed = s;
+        } else
+
+
+
+
+         if (x == 40){     // trigger level
+            trigLevel = 255 - s;
+         } else
+         if (x == 41){     // trigger on/off
+            //trigMode = s;
+            if (s == 0) trigMode = false; else trigMode = true;
+         } else
+         if (x == 42){    // trigger edge
+            //trigEdge = s;
+            if (s == 0) trigEdge = false; else trigEdge = true;
+         } else
+         if (x == 43){      // trigger source
+            //trigSrc = s;
+            if (s == 0) trigSrc = false; else trigSrc = true;
+         } else
+
+         if (x == 10){     // pos chan a
+            PosA = s;
+         } else
+         if (x == 11){    // chan a on/off
+            //UseChanA = s;
+            if (s == 0) UseChanA = false; else UseChanA = true;
+         } else
+         if (x == 12){    //  chan a mode (0=1.5v, 1=15v, 2=gnd)
+            ChanAMode = s;
+         } else
+
+         if (x == 20){     // pos chan b
+            PosB = s;
+         } else
+         if (x == 21){    // chan b on/off
+            //UseChanB = s;
+            if (s == 0) UseChanB = false; else UseChanB = true;
+         } else
+         if (x == 22){    //  chan b mode (0=1.5v, 1=15v, 2=gnd)
+            ChanBMode = s;
+         }
+      }  // if event
+
+
+      if (mode == 0){     // xt scope mode
+         // trigger
+         if (trigMode){
+
+            if (trigEdge == false){
+               pval = 255;
+            }else{
+               pval = 0;
+            }
+            cnt   = 0;
+            ready = false;
+            do {
+               cnt++;
+               if (cnt == 20) ready = true;
+
+               if (adc){   // ltc 1298 mode
+                  if (trigSrc == false){   // chan a
+                     val = readadc(2,1,0,  0, ChanAMode );
+                  }else{              // chan b
+                     val = readadc(2,1,0,  1, ChanBMode ); ;
+                  }
+               }else{   // opamp/transistor mode
+
+                  if (trigSrc == false){   // chan a
+                     val = measure(0, ChanAMode );
+                  }else{              // chan b
+                     val = measure(1, ChanBMode );
+                  }
+
+               }
+               //  now val is the value we want to check trigger on
+
+               if (trigEdge == false) {
+                  if (trigLevel < val && trigLevel >= pval) ready = true;
+               }else{
+                  if (trigLevel > val && trigLevel <= pval) ready = true;
+               }
+               pval = val;
+
+            }while (!ready);
+         } // trigMode
+
+         ptr = 0;    // mem counter
+         if (adc){   // ltc 1298 mode
+         for (cnt = 0; cnt <= 29; cnt++){
+            if (UseChanA){
+               //val = readadc(2,1,0,  0, ChanAMode );
+               //if (ChanAMode == 0){
+               //   val = val - (2048-128);
+               //}else{
+               //   val = val >> 4;
+               //}
+               //mem[ptr] = val;
+               mem[ptr] = readadc(2,1,0,  0, ChanAMode );
+            }
+            ptr++;
+
+            if (UseChanB){
+               //val = readadc(2,1,0,  1, ChanBMode );
+               //if (ChanBMode == 0){
+               //   val = val - (2048-128);
+               //}else{
+               //   val = val >> 4;
+               //}
+               //mem[ptr] = val;
+               mem[ptr] = readadc(2,1,0,  1, ChanBMode );
+            }
+            ptr++;
+
+            if (speed > 0){
+               if (speed == 1) wait(0.001); // CPU.delay(speed);
+               if (speed == 2) wait(0.01 ); // CPU.delay(speed);
+               if (speed == 3) wait(0.1  ); // CPU.delay(speed);
+            }
+         }     // for
+         }else{  // opamp/transistor mode
+         for (cnt = 0; cnt <= 29; cnt++){
+            if (UseChanA){
+               //val = measure(0, ChanAMode );
+               //mem[ptr] = val;
+               mem[ptr] = measure(0, ChanAMode );
+            }
+            ptr++;
+
+            if (UseChanB){
+               //val = measure(1, ChanBMode );
+               //mem[ptr] = val;
+               mem[ptr] = measure(1, ChanBMode );
+            }
+            ptr++;
+
+            if (speed > 0){
+               if (speed == 1) wait(0.001); // CPU.delay(speed);
+               if (speed == 2) wait(0.01 ); // CPU.delay(speed);
+               if (speed == 3) wait(0.1  ); // CPU.delay(speed);
+            }
+         }     // for
+         }  // !adc
+
+         //  ' clear graph
+         //  'DEBUG "!s100,100,200;!c;"    'set blue color , clear screen    17c
+         // DEBUG "!sb",3, 100,100,200, ";!c;"     'fast binary way to set color  11c
+         //System.out.print("!s100,100,200;!c;");
+         SetColor(100,100,200);
+         ClearScreen();
+
+         if (grid){
+            //'DEBUG "!s128,128,228;"            'set lighter color  14c
+            // DEBUG "!sb",3,128,128,228,";"      'fast binary way to set color  8c
+            //System.out.print("!s128,128,228;");
+            SetColor(128,128,228);
+
+            //'DEBUG "!a20,20,29,19,55,12;"      'slow ascii way draw grid    20c
+            //DEBUG "!ab",6,20,20,29,19,55,12,";"     'fast binary way to draw grid  11c
+            //System.out.print("!a20,20,29,19,55,12;");
+            DrawGrid(20,20,29,19,55,12);
+
+            if (trigMode){
+               cnt = trigLevel;
+               if (trigSrc == false){
+                  cnt = 255 - cnt + PosA - 128;
+               }else{
+                  cnt = 255 - cnt + PosB - 128;
+               }
+
+               // 'DEBUG "!l", DEC 1,",", DEC cnt,",", DEC 40,",", DEC cnt, ";"   'slow
+               //DEBUG "!lb", 4,1,cnt,40,cnt,";"    ' fast
+                //System.out.print("!l1,");
+                //System.out.print( cnt);
+                //System.out.print(",40,");
+                //System.out.print( cnt  );
+                //System.out.print(";");
+                DrawLine(1,cnt,40,cnt);
+            } // end trigMode
+         }  // end grid
+
+
+         if (UseChanA){
+            //    draw channel a
+            // 'set color black
+            // 'DEBUG "!s0,0,0;"                     'slow ascii way to set color  8c
+            // DEBUG "!sb",3, 0,0,0, ";"         'fast binary way to set color   8c
+            //System.out.print("!s0,0,0;");
+            SetColor(0,0,0);
+
+            ptr = 0;
+            s = mem[ ptr ];
+            s = 255 - s + PosA - 128;
+            ptr = ptr + 2;
+            s -= 60;
+
+            //DEBUG "!Pb", 33,20, 0,60 , s     ' init poly line cmd in binary mode  38c
+            //' 33 is number of bytes we are going to send
+            //' 20=dx , 0=dy      (which means we only send y values)
+            //' 0,60 = start x,y
+
+            //System.out.print("!P20,0,60,");
+            //System.out.print( s );
+/*
+            serbuf.clear();
+            serbuf.append("!Pb");        // poly line, binary mode
+            serbuf.append((char)33);     // 33 values follow
+            serbuf.append((char)20);     // dx=20
+            serbuf.append((char) 0);     // dy=0 .. so only y values
+            serbuf.append((char)60);     // x start
+            serbuf.append((char) s);     // y start
+*/
+            serial.printf("!Pb");
+            serial.printf("%c%c%c%c%c", 33, 20, 0, 60, s);
+
+            for (cnt = 0; cnt <= 28; cnt++){
+               x = mem[ ptr ];
+               x = 255 - x + PosA - 128;
+               ptr = ptr + 2;
+
+               //'' --- slow line ---
+               //''val = cnt * 20
+               //''DEBUG "!l",DEC val,",",DEC s,",", DEC val+20,",", DEC x,";"    ' chars 18
+               //'' --- faster line ---
+               //''val = cnt * 8
+               //''DEBUG "!lb", 4 , val , s, val+8 , x , ";"                  'chars 8
+               //'' --- fastest line ---
+               //DEBUG x      'chars 1    (poly line cmd with constant dx)
+
+               //System.out.print( "," );
+               //System.out.print( x );
+
+               x -= 60;
+               if (x > 127) x -= 256;  // int to char ?
+               //serbuf.append((char) x  );    // y value of next line
+               serial.printf("%c", x );    // y value of next line
+
+               //s = x;
+            }
+            //System.out.print(";");
+            //serbuf.append(";");
+            //System.out.print(serbuf.toString());
+            serial.printf(";");
+
+         } // end UseChanA
+
+         if (UseChanB){
+            //' draw channel b
+            //'set color white
+            //'DEBUG "!s255,255,255;"                  'slow ascii way to set color
+            //DEBUG "!sb",3,255,255,255,";"     'fast binary way to set color
+            //System.out.print("!s255,255,255;");
+            SetColor(255,255,255);
+
+            ptr = 1;
+            s = mem[ ptr ];
+            s = 255 - s + PosB - 128;
+            ptr = ptr + 2;
+            s -= 60;
+
+            //DEBUG "!Pb", 33,20, 0,60 , s     ' init poly line cmd in binary mode  38c
+            //' 33 is number of bytes we are going to send
+            //' 20=dx , 0=dy      (which means we only send y values)
+            //' 0,60 = start x,y
+
+            //System.out.print("!P20,0,60,");
+            //System.out.print( s );
+/*
+            serbuf.clear();
+            serbuf.append("!Pb");
+            serbuf.append((char)33);
+            serbuf.append((char)20);
+            serbuf.append((char) 0);
+            serbuf.append((char)60);
+            serbuf.append((char) s);
+*/
+            serial.printf("!Pb");
+            serial.printf("%c%c%c%c%c", 33, 20, 0, 60, s );
+
+            for (cnt = 0; cnt <= 28; cnt++){
+               x = mem[ ptr ];
+               x = 255 - x + PosB - 128;
+               ptr = ptr + 2;
+
+               //'' --- slow line ---
+               //''val = cnt * 20
+               //''DEBUG "!l",DEC val,",",DEC s,",", DEC val+20,",", DEC x,";"
+               //'' --- faster line ---
+               //''val = cnt * 8
+               //''DEBUG "!lb", 4 , val , s, val+8 , x , ";"
+               //'' --- fastest line ---
+               //DEBUG x      'chars 1          (poly line cmd with constant dx)
+
+               //System.out.print( "," );
+               //System.out.print( x );
+
+               x -= 60;
+               if (x > 127) x -= 256;  // int to char ?
+               //serbuf.append((char) x  );
+               serial.printf("%c", x );
+
+               //s = x;
+            }
+            //System.out.print(";");
+            //serbuf.append(";");
+            //System.out.print(serbuf.toString());
+            serial.printf(";");
+
+         } // end UseChanB
+
+         //CPU.delay(1);
+      }   // end xt scope mode
+
+      if (mode == 2){   // recorder mode
+         if (adc){   // ltc1298 mode
+            val  = readadc(2,1,0,  0, ChanAMode );
+            valb = readadc(2,1,0,  1, ChanBMode );
+         }else{
+            val  = measure(0, ChanAMode );
+            valb = measure(1, ChanBMode );
+         }
+
+         val  = val  + PosA - 128;        // offset
+         valb = valb + PosB - 128;
+
+         //' set plot color
+         //DEBUG "!s0,0,0;"
+         //System.out.print("!s0,0,0;");
+         SetColor(0,0,0);
+
+         //' plot xy
+         //'DEBUG "!p", DEC 610,",", DEC val, ";"
+         //' line xy
+         //DEBUG "!l", DEC 610,",", DEC val,",", DEC 609,",", DEC pval ,";"
+
+         //System.out.print("!l610,");
+         //System.out.print( val  );
+         //System.out.print(",609,");
+         //System.out.print( pval );
+         //System.out.print(";");
+         DrawLine(610,val,609,pval);
+
+         pval = val;
+
+         //' set plot color
+         //'DEBUG "!s250,250,250;"           'slow ascii way to set color
+         //DEBUG "!sb",3,250,250,250,";"     'fast binary way to set color
+         //System.out.print("!s250,250,250;");
+         SetColor(250,250,250);
+
+         //' plot xy
+         //'DEBUG "!p", DEC 610,",", DEC valb, ";"
+         //' line xy
+         //DEBUG "!l", DEC 610,",", DEC valb,",", DEC 609,",", DEC pvalb ,";"
+
+         //System.out.print("!l610,");
+         //System.out.print( valb  );
+         //System.out.print(",609,");
+         //System.out.print( pvalb );
+         //System.out.print(";");
+         DrawLine(610,valb,609,pvalb);
+
+         pvalb = valb;
+
+         // ' scrol 1 pixel to the left
+         //DEBUG "!G20,1;"
+         //System.out.print("!G20,1;");
+         serial.printf("!G20,1;");
+      }   // end recorder mode
+
+      if (mode == 1){    // xy scope mode
+         if (adc){    // ltc1298 mode
+            val  = readadc(2,1,0,  0, ChanAMode );
+            valb = readadc(2,1,0,  1, ChanBMode );
+         }else{
+            val  = measure(0, ChanAMode );
+            valb = measure(1, ChanBMode );
+         }
+
+         //' set plot color
+         //'DEBUG "!s200,200,200;"           'slow ascii way to set color
+         //DEBUG "!sb",3,200,200,200,";"     //fast binary way to set color
+         //System.out.print("!s,200,200,200;");
+         SetColor(200,200,200);
+
+         //' plot xy
+         //DEBUG "!p", DEC val,",", DEC valb, ";"
+         //System.out.print("!p");
+         //System.out.print( val );
+         //System.out.print(",");
+         //System.out.print( valb );
+         //System.out.print(";");
+         Plot(val,valb);
+
+         //' line xy
+         //DEBUG "!l", DEC val,",", DEC valb,",", DEC pval,",",DEC pvalb,  ";"
+
+         //System.out.print("!l");
+         //System.out.print( val  );
+         //System.out.print(",");
+         //System.out.print( valb );
+         //System.out.print(",");
+         //System.out.print( pval  );
+         //System.out.print(",");
+         //System.out.print( pvalb );
+         //System.out.print(";");
+         DrawLine(val, valb, pval, pvalb);
+
+         pval  = val;
+         pvalb = valb;
+
+         cnt = cnt + 1;
+         if (cnt == 50){
+            //' clear graph
+            //'DEBUG "!s100,100,200;!c;"    'set blue color , clear screen    17c
+            //DEBUG "!sb",3, 100,100,200, ";!c;"     'fast binary way to set color  11c
+            //System.out.print("!s,100,100,200;!c;");
+            SetColor(100,100,200);
+            ClearScreen();
+
+            cnt = 0;
+         }
+
+
+      } // end xy mode scope
+
+   }   // end while true
+ }       // end main
+
+
+
+
+