pff so many stuff draft

Tue, 11 Oct 2016 00:14:20 +0200

author
David Douard <david.douard@logilab.fr>
date
Tue, 11 Oct 2016 00:14:20 +0200
changeset 8
55021f3f1929
parent 7
5cf4034ba4e0
child 9
e5254c6aa0c8

pff so many stuff

let's break everything again

lib/unigraphic/Mono19x27.h file | annotate | diff | comparison | revisions
lib/unigraphic/Protocols.h file | annotate | diff | comparison | revisions
lib/unigraphic/SPI8.cpp file | annotate | diff | comparison | revisions
lib/unigraphic/SPI8.h file | annotate | diff | comparison | revisions
lib/unigraphic/SSD1322.cpp file | annotate | diff | comparison | revisions
lib/unigraphic/SSD1322.h file | annotate | diff | comparison | revisions
platformio.ini file | annotate | diff | comparison | revisions
src/hp34comm.cpp file | annotate | diff | comparison | revisions
src/hp34comm.cpp~ file | annotate | diff | comparison | revisions
src/hp34comm.h file | annotate | diff | comparison | revisions
src/hp34comm.h~ file | annotate | diff | comparison | revisions
src/main.cpp file | annotate | diff | comparison | revisions
--- a/lib/unigraphic/Mono19x27.h	Fri Sep 23 21:12:43 2016 +0200
+++ b/lib/unigraphic/Mono19x27.h	Tue Oct 11 00:14:20 2016 +0200
@@ -514,7 +514,7 @@
 0x00, 0x00, 0x00, 0x00, 
 0x00, 0x00, 0x00, 0x00, 
 0x00, 0x00, 0x00, 0x00, //  Char '8' 
-	16,
+	15,
 0x00, 0x00, 0x00, 0x00, 
 0xf0, 0x07, 0x00, 0x00, 
 0xf8, 0x0f, 0x0c, 0x00, 
--- a/lib/unigraphic/Protocols.h	Fri Sep 23 21:12:43 2016 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,163 +0,0 @@
- /* mbed UniGraphic library - Abstract protocol class
- * Copyright (c) 2015 Giuliano Dianda
- * Released under the MIT License: http://mbed.org/license/mit
- */
- 
-/** @file Protocols.h
-*/
-#ifndef Protocols_H
-#define Protocols_H
-
-#include "mbed.h"
-
-#define RGB24to16(r,g,b)  (((r&0xF8)<<8)|((g&0xFC)<<3)|((b&0xF8)>>3)) //5 red | 6 green | 5 blue
-#define BGR2RGB(color) (((color&0x1F)<<11) | (color&0x7E0) | ((color&0xF800)>>11))
-
-#define FLIP_NONE   0
-#define FLIP_X      1
-#define FLIP_Y      2
-
-//#define USE_CS
-
-/** Protocol types
-*/
-#include "platform.h"
-
-#if DEVICE_PORTINOUT
-enum proto_t {
-    PAR_8   /**< Parallel 8bit, port pins 0 to 7 */
-    ,PAR_16 /**< Parallel 16bit, port pins 0 to 15 */
-    ,BUS_8   /**< Parallel 8bit, scattered pins */
-    ,BUS_16   /**< Parallel 16bit, scattered pins */
-    ,SPI_8  /**< SPI 8bit */
-    ,SPI_16 /**< SPI 16bit */
-};
-#else 
-enum proto_t {
-    BUS_8   /**< Parallel 8bit, scattered pins */
-    ,BUS_16   /**< Parallel 16bit, scattered pins */
-    ,SPI_8  /**< SPI 8bit */
-    ,SPI_16 /**< SPI 16bit */
-};
-#endif
-
-
-/** Abstract interface class for spi and parallel protocols
-*/
-class Protocols
-{
- public:
-    
-    /** Send 8bit command to display controller 
-    *
-    * @param cmd: byte to send  
-    *
-    */   
-    virtual void wr_cmd8(unsigned char cmd) = 0;
-    
-    /** Send 8bit data to display controller 
-    *
-    * @param data: byte to send   
-    *
-    */   
-    virtual void wr_data8(unsigned char data) = 0;
-    
-    /** Send 2x8bit command to display controller 
-    *
-    * @param cmd: halfword to send  
-    *
-    */   
-    virtual void wr_cmd16(unsigned short cmd) = 0;
-    
-    /** Send 2x8bit data to display controller 
-    *
-    * @param data: halfword to send   
-    *
-    */   
-    virtual void wr_data16(unsigned short data) = 0;
-    
-    /** Send 16bit pixeldata to display controller 
-    *
-    * @param data: halfword to send   
-    *
-    */   
-    virtual void wr_gram(unsigned short data) = 0;
-    
-    /** Send same 16bit pixeldata to display controller multiple times
-    *
-    * @param data: halfword to send
-    * @param count: how many
-    *
-    */   
-    virtual void wr_gram(unsigned short data, unsigned int count) = 0;
-    
-    /** Send array of pixeldata shorts to display controller
-    *
-    * @param data: unsigned short pixeldata array
-    * @param lenght: lenght (in shorts)
-    *
-    */   
-    virtual void wr_grambuf(unsigned short* data, unsigned int lenght) = 0;
-    
-    /** Read 16bit pixeldata from display controller (with dummy cycle)
-    *
-    * @param convert true/false. Convert 18bit to 16bit, some controllers returns 18bit
-    * @returns 16bit color
-    */ 
-    virtual unsigned short rd_gram(bool convert) = 0;
-    
-    /** Read 4x8bit register data (with dummy cycle)
-    * @param reg the register to read
-    * @returns data as uint
-    * 
-    */ 
-    virtual unsigned int rd_reg_data32(unsigned char reg) = 0;
-    
-    /** Read 3x8bit ExtendedCommands register data
-    * @param reg the register to read
-    * @param SPIreadenablecmd vendor/device specific cmd to read EXTC registers
-    * @returns data as uint
-    * @note EXTC regs (0xB0 to 0xFF) are read/write registers but needs special cmd to be read in SPI mode
-    */ 
-    virtual unsigned int rd_extcreg_data32(unsigned char reg, unsigned char SPIreadenablecmd) = 0;
-    
-    /** ILI932x specific, does a dummy read cycle, number of bits is protocol dependent
-    * for PAR protocols: a signle RD bit toggle
-    * for SPI8: 8clocks
-    * for SPI16: 16 clocks
-    */   
-    virtual void dummyread () = 0;
-    
-    /** ILI932x specific, select register for a successive write or read
-    *
-    * @param reg register to be selected
-    * @param forread false = a write next (default), true = a read next
-    * @note forread only used by SPI protocols
-    */   
-    virtual void reg_select(unsigned char reg, bool forread =false) = 0;
-    
-    /** ILI932x specific, write register with data
-    *
-    * @param reg register to write
-    * @param data 16bit data
-    */   
-    virtual void reg_write(unsigned char reg, unsigned short data) = 0;
-    
-    /** ILI932x specific, read register
-    *
-    * @param reg register to be read
-    * @returns 16bit register value
-    */ 
-    virtual unsigned short reg_read(unsigned char reg) = 0;
-    
-    /** HW reset sequence (without display init commands)   
-    */
-    virtual void hw_reset() = 0;
-    
-    /** Set ChipSelect high or low
-    * @param enable 0/1   
-    */
-    virtual void BusEnable(bool enable) = 0;
-
-};
-#endif
\ No newline at end of file
--- a/lib/unigraphic/SPI8.cpp	Fri Sep 23 21:12:43 2016 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,209 +0,0 @@
- /* mbed UniGraphic library - SPI8 protocol class
- * Copyright (c) 2015 Giuliano Dianda
- * Released under the MIT License: http://mbed.org/license/mit
- *
- * Derived work of:
- *
- * mbed library for 240*320 pixel display TFT based on ILI9341 LCD Controller
- * Copyright (c) 2013 Peter Drescher - DC2PD
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
- 
-#include "SPI8.h"
-
-
-SPI8::SPI8(int Hz, PinName mosi, PinName miso, PinName sclk, PinName CS, PinName reset, PinName DC)
-    : _CS(CS), _spi(mosi, miso, sclk), _reset(reset), _DC(DC)
-{
-    _reset = 1;
-    _DC=1;
-    _CS=1;
-    _spi.format(8,0);                  // 8 bit spi mode 0
-    _spi.frequency(Hz);
-    hw_reset();    
-}
-
-void SPI8::wr_cmd8(unsigned char cmd)
-{     
-    _DC.write(0); // 0=cmd
-    _spi.write(cmd);      // write 8bit
-    _DC.write(1); // 1=data next
-}
-void SPI8::wr_data8(unsigned char data)
-{
-    _spi.write(data);    // write 8bit
-}
-
-void SPI8::wr_cmd16(unsigned short cmd)
-{
-    _DC.write(0); // 0=cmd
-    _spi.write(cmd>>8);      // write 8bit
-    _spi.write(cmd&0xFF);      // write 8bit
-    _DC.write(1); // 1=data next
-}
-void SPI8::wr_data16(unsigned short data)
-{
-    _spi.write(data>>8);    // write 8bit
-    _spi.write(data&0xFF);    // write 8bit
-}
-void SPI8::wr_gram(unsigned short data)
-{
-    _spi.write(data>>8);    // write 8bit
-    _spi.write(data&0xFF);    // write 8bit
-}
-void SPI8::wr_gram(unsigned short data, unsigned int count)
-{
-    if((data>>8)==(data&0xFF))
-    {
-        count<<=1;
-        while(count)
-        {
-            _spi.write(data);    // write 8bit
-            count--;
-        }
-    }
-    else
-    {
-        while(count)
-        {
-            _spi.write(data>>8);    // write 8bit
-            _spi.write(data&0xFF);    // write 8bit
-            count--;
-        }
-    }
-}
-void SPI8::wr_grambuf(unsigned short* data, unsigned int lenght)
-{
-    while(lenght)
-    {
-        _spi.write((*data)>>8);    // write 8bit
-        _spi.write((*data)&0xFF);    // write 8bit
-        data++;
-        lenght--;
-    }
-}
-unsigned short SPI8::rd_gram(bool convert)
-{
-    unsigned int r=0;
-    _spi.write(0); // whole first byte is dummy
-    r |= _spi.write(0);
-    r <<= 8;
-    r |= _spi.write(0);
-    if(convert)
-    {
-        r <<= 8;
-        r |= _spi.write(0);
-        // gram is 18bit/pixel, if you set 16bit/pixel (cmd 3A), during writing the 16bits are expanded to 18bit
-        // during reading, you read the raw 18bit gram
-        r = RGB24to16((r&0xFF0000)>>16, (r&0xFF00)>>8, r&0xFF);// 18bit pixel padded to 24bits, rrrrrr00_gggggg00_bbbbbb00, converted to 16bit
-    } 
-    _CS = 1; // force CS HIG to interupt the "read state"
-    _CS = 0;
-    return (unsigned short)r;
-}
-unsigned int SPI8::rd_reg_data32(unsigned char reg)
-{
-    wr_cmd8(reg);
-    unsigned int r=0;
-   
-    r |= _spi.write(0); // we get only 7bit valid, first bit was the dummy cycle
-    r <<= 8;
-    r |= _spi.write(0);
-    r <<= 8;
-    r |= _spi.write(0);
-    r <<= 8;
-    r |= _spi.write(0);
-    r <<= 1; // 32bits are aligned, now collecting bit_0
-    r |= (_spi.write(0) >> 7);
-    // we clocked 7 more bit so ILI waiting for 8th, we need to reset spi bus
-    _CS = 1; // force CS HIG to interupt the cmd
-    _CS = 0;
-    return r;
-}
-unsigned int SPI8::rd_extcreg_data32(unsigned char reg, unsigned char SPIreadenablecmd)
-{
-    unsigned int r=0;
-    for(int regparam=1; regparam<4; regparam++) // when reading EXTC regs, first parameter is always dummy, so start with 1
-    {
-        wr_cmd8(SPIreadenablecmd);  // spi-in enable cmd, 0xD9 (ili9341) or 0xFB (ili9488) or don't know
-        wr_data8(0xF0|regparam);    // in low nibble specify which reg parameter we want
-        wr_cmd8(reg);               // now send cmd (select register we want to read)
-        r <<= 8;
-        r |= _spi.write(0);
-        // r = _spi.write(0) >> 8; for 16bit
-    }
-    _CS = 1; // force CS HIG to interupt the cmd
-    _CS = 0;
-    return r;
-}
-// ILI932x specific
-void SPI8::dummyread()
-{
-    _spi.write(0);    // dummy read
-}
-// ILI932x specific
-void SPI8::reg_select(unsigned char reg, bool forread)
-{
-    _CS = 1;    //fixme: really needed?
-    _CS = 0;    //fixme: really needed?
-    _spi.write(0x70);
-    _spi.write(0);    // write MSB
-    _spi.write(reg);    // write LSB
-    _CS = 1;    //fixme: really needed?
-    _CS = 0;    //fixme: really needed?
-    if(forread) _spi.write(0x73);
-    else _spi.write(0x72);
-}
-// ILI932x specific
-void SPI8::reg_write(unsigned char reg, unsigned short data)
-{
-    _CS = 1;    //fixme: really needed?
-    _CS = 0;    //fixme: really needed?
-    _spi.write(0x70);
-    _spi.write(0);    // write MSB
-    _spi.write(reg);    // write LSB
-    _CS = 1;    //fixme: really needed?
-    _CS = 0;    //fixme: really needed?
-    _spi.write(0x72);
-    _spi.write(data>>8);
-    _spi.write(data&0xFF);
-}
-// ILI932x specific
-unsigned short SPI8::reg_read(unsigned char reg)
-{
-    unsigned short r=0;
-    _CS = 1;    //fixme: really needed?
-    _CS = 0;    //fixme: really needed?
-    _spi.write(0x70);
-    _spi.write(0);    // write MSB
-    _spi.write(reg);    // write LSB
-    _CS = 1;    //fixme: really needed?
-    _CS = 0;    //fixme: really needed?
-    _spi.write(0x73);
-    _spi.write(0);    // dummy read
-    r = _spi.write(0);    // read 8bit
-    r <<= 8;
-    r |= _spi.write(0);    // read 8bit
-    return r;
-}
-void SPI8::hw_reset()
-{
-    wait_ms(15);
-    _DC = 1;
-    _CS = 1;
-    _reset = 0;                        // display reset
-    wait_ms(2);
-    _reset = 1;                       // end reset
-    wait_ms(100);
-}
-void SPI8::BusEnable(bool enable)
-{
-    _CS = enable ? 0:1;
-}
--- a/lib/unigraphic/SPI8.h	Fri Sep 23 21:12:43 2016 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,148 +0,0 @@
-#ifndef SPI8_H
-#define SPI8_H
-
-#define NDEBUG // avoid MBED_ASSERT to halt process when PinName DC==NC
-
-#include "mbed.h"
-#include "Protocols.h"
-//#include "GraphicsDisplay.h"
-
-/** SPI 8bit interface
-*/
-class SPI8 : public Protocols
-{
- public:
-
-    /** Create an SPI 8bit display interface with 3 control pins
-    *
-    * @param SPI mosi
-    * @param SPI miso
-    * @param SPI sclk
-    * @param CS pin connected to CS of display
-    * @param reset pin connected to RESET of display
-    * @param DC pin connected to data/command of display
-    */ 
-    SPI8(int Hz, PinName mosi, PinName miso, PinName sclk, PinName CS, PinName reset, PinName DC=NC);
- 
-protected:
-   
-    /** Send 8bit command to display controller 
-    *
-    * @param cmd: byte to send  
-    *
-    */   
-    virtual void wr_cmd8(unsigned char cmd);
-    
-    /** Send 8bit data to display controller 
-    *
-    * @param data: byte to send   
-    *
-    */   
-    virtual void wr_data8(unsigned char data);
-    
-    /** Send 2x8bit command to display controller 
-    *
-    * @param cmd: halfword to send  
-    */   
-    virtual void wr_cmd16(unsigned short cmd);
-    
-    /** Send 2x8bit data to display controller 
-    *
-    * @param data: halfword to send   
-    *
-    */   
-    virtual void wr_data16(unsigned short data);
-    
-    /** Send 16bit pixeldata to display controller 
-    *
-    * @param data: halfword to send   
-    *
-    */   
-    virtual void wr_gram(unsigned short data);
-    
-    /** Send same 16bit pixeldata to display controller multiple times
-    *
-    * @param data: halfword to send
-    * @param count: how many
-    *
-    */   
-    virtual void wr_gram(unsigned short data, unsigned int count);
-    
-    /** Send array of pixeldata shorts to display controller
-    *
-    * @param data: unsigned short pixeldata array
-    * @param lenght: lenght (in shorts)
-    *
-    */   
-    virtual void wr_grambuf(unsigned short* data, unsigned int lenght);
-    
-    /** Read 16bit pixeldata from display controller (with dummy cycle)
-    *
-    * @param convert true/false. Convert 18bit to 16bit, some controllers returns 18bit
-    * @returns 16bit color
-    */ 
-    virtual unsigned short rd_gram(bool convert);
-    
-    /** Read 4x8bit register data (with dummy cycle)
-    * @param reg the register to read
-    * @returns data as uint
-    * 
-    */ 
-    virtual unsigned int rd_reg_data32(unsigned char reg);
-    
-    /** Read 3x8bit ExtendedCommands register data
-    * @param reg the register to read
-    * @param SPIreadenablecmd vendor/device specific cmd to read EXTC registers
-    * @returns data as uint
-    * @note EXTC regs (0xB0 to 0xFF) are read/write registers but needs special cmd to be read in SPI mode
-    */ 
-    virtual unsigned int rd_extcreg_data32(unsigned char reg, unsigned char SPIreadenablecmd);
-    
-    /** ILI932x specific, does a dummy read cycle, number of bits is protocol dependent
-    * for PAR protocols: a signle RD bit toggle
-    * for SPI8: 8clocks
-    * for SPI16: 16 clocks
-    */   
-    virtual void dummyread ();
-    
-    /** ILI932x specific, select register for a successive write or read
-    *
-    * @param reg register to be selected
-    * @param forread false = a write next (default), true = a read next
-    * @note forread only used by SPI protocols
-    */   
-    virtual void reg_select(unsigned char reg, bool forread =false);
-    
-    /** ILI932x specific, write register with data
-    *
-    * @param reg register to write
-    * @param data 16bit data
-    */   
-    virtual void reg_write(unsigned char reg, unsigned short data);
-    
-    /** ILI932x specific, read register
-    *
-    * @param reg register to be read
-    * @returns 16bit register value
-    */ 
-    virtual unsigned short reg_read(unsigned char reg);
-    
-    /** HW reset sequence (without display init commands)   
-    */
-    virtual void hw_reset();
-    
-    /** Set ChipSelect high or low
-    * @param enable 0/1   
-    */
-    virtual void BusEnable(bool enable);
-  
-    DigitalOut _CS;
-
-private:
-
-    SPI _spi;
-    DigitalOut _reset;
-    DigitalOut _DC;
-  
-};
-#endif
--- a/lib/unigraphic/SSD1322.cpp	Fri Sep 23 21:12:43 2016 +0200
+++ b/lib/unigraphic/SSD1322.cpp	Tue Oct 11 00:14:20 2016 +0200
@@ -94,70 +94,65 @@
 #define SWAP(a, b)  { a ^= b; b ^= a; a ^= b; }
 
 
-SSD1322::SSD1322(proto_t displayproto,
-		 int Hz, PinName mosi, PinName miso, PinName sclk, PinName CS, PinName reset, PinName DC,
-		 const char *name,
-		 const unsigned int lcdsize_x, const unsigned int lcdsize_y) 
+SSD1322::SSD1322(int Hz, PinName mosi, PinName miso, PinName sclk, PinName CS, PinName reset, PinName DC,
+		 const char *name) 
     : GraphicsDisplay(name),
-      screensize_X(lcdsize_x), screensize_Y(lcdsize_y),
-      _BPP(BPP), _PAGES(lcdsize_y/8*BPP),
-      _IC_X_SEGS(IC_X_SEGS), _IC_Y_COMS(IC_Y_COMS), _IC_PAGES(IC_Y_COMS/8*BPP)
+      screensize_X(DISPLAY_WIDTH), screensize_Y(DISPLAY_HEIGHT),
+      _BPP(BPP), _PAGES(DISPLAY_HEIGHT/8*BPP),
+      _IC_X_SEGS(IC_X_SEGS), _IC_Y_COMS(IC_Y_COMS), _IC_PAGES(IC_Y_COMS/8*BPP),
+      _spi(mosi, miso, sclk),
+      _DC(DC), _CS(CS), _RST(reset)
 {
-  proto = new SPI8(Hz, mosi, miso, sclk, CS, reset, DC);
-  buffer = (unsigned char*) malloc (screensize_X*_PAGES);
+  _RST = 1;
+  _DC = 1;
+  _CS = 1;
+  _spi.format(8, 0);                  // 8 bit spi mode 0
+  _spi.frequency(Hz);
   set_auto_up(false);
   foreground(0xFFFF);
   background(0x0000);
   hw_reset();
-  bus_enable(true);
   init();
   set_orientation(1);
   cls();
   locate(0,0);
-}
-
-SSD1322::~SSD1322()
-{
-  free(buffer);
+  //_internalEventCallback.attach(this, &SSD1322::_cbHandler);
 }
 
 void SSD1322::wr_cmd8(unsigned char cmd)
 {
-  proto->wr_cmd8(cmd);
+  _CS = 0;
+  _DC.write(0); // 0=cmd
+  _spi.write(cmd);      // write 8bit
+  _DC.write(1); // 1=data next
+  _CS = 1;
 }
 
 void SSD1322::wr_data8(unsigned char data)
 {
-  proto->wr_data8(data);
-}
-
-void SSD1322::wr_cmd16(unsigned short cmd)
-{
-  proto->wr_cmd16(cmd);
-}
+  _CS = 0;
+  _spi.write(data);    // write 8bit
+  _CS = 1;
 
-void SSD1322::wr_gram(unsigned short data, unsigned int count)
-{
-  proto->wr_gram(data, count);
-}
-
-void SSD1322::wr_grambuf(unsigned short* data, unsigned int lenght)
-{
-  proto->wr_grambuf(data, lenght);
 }
 
 void SSD1322::hw_reset()
 {
-  proto->hw_reset();
+  wait_ms(15);
+  _DC = 1;
+  _CS = 1;
+  _RST = 0;                        // display reset
+  wait_ms(2);
+  _RST = 1;                       // end reset
+  wait_ms(100);
 }
 
 void SSD1322::bus_enable(bool enable)
 {
-  proto->BusEnable(enable);
+  _CS = enable ? 0:1;
 }
 
 
-
 // monochrome SSD1322 driver ICs does not have ram rotate in hw (swap raw<->columns) like TFT displays
 // for portrait views, XY swap will be done in sw in pixel() function
 void SSD1322::set_orientation(int o)
@@ -216,8 +211,8 @@
 
 void SSD1322::invert(unsigned char o)
 {
-    if(o == 0) wr_cmd8(0xA6);
-    else wr_cmd8(0xA7);
+    if(o == 0) wr_cmd8(SSD1322_CMD_SET_DISPLAY_MODE_NORMAL);
+    else wr_cmd8(SSD1322_CMD_SET_DISPLAY_MODE_INVERSE);
 }
 
 void SSD1322::set_contrast(int o)
@@ -243,48 +238,48 @@
     win_y2 = y + h - 1;
 }
 void SSD1322::window_pushpixel(unsigned short color) {
-    pixel(cur_x, cur_y, color);
-    cur_x++;
-    if(cur_x > win_x2) {
-        cur_x = win_x1;
-        cur_y++;
-        if(cur_y > win_y2) {
-            cur_y = win_y1;
-        }
+  pixel(cur_x, cur_y, color);
+  cur_x++;
+  if(cur_x > win_x2) {
+    cur_x = win_x1;
+    cur_y++;
+    if(cur_y > win_y2) {
+      cur_y = win_y1;
     }
+  }
 }
 void SSD1322::window_pushpixel(unsigned short color, unsigned int count) {
-    while(count)
+  while(count)
     {
-        pixel(cur_x, cur_y, color);
-        cur_x++;
-        if(cur_x > win_x2)
+      pixel(cur_x, cur_y, color);
+      cur_x++;
+      if(cur_x > win_x2)
         {
-            cur_x = win_x1;
-            cur_y++;
-            if(cur_y > win_y2)
+	  cur_x = win_x1;
+	  cur_y++;
+	  if(cur_y > win_y2)
             {
-                cur_y = win_y1;
+	      cur_y = win_y1;
             }
         }
-        count--;
+      count--;
     }
 }
 void SSD1322::window_pushpixelbuf(unsigned short* color, unsigned int lenght) {
-    while(lenght)
+  while(lenght)
     {
-        pixel(cur_x, cur_y, *color++);
-        cur_x++;
-        if(cur_x > win_x2)
+      pixel(cur_x, cur_y, *color++);
+      cur_x++;
+      if(cur_x > win_x2)
         {
-            cur_x = win_x1;
-            cur_y++;
-            if(cur_y > win_y2)
+	  cur_x = win_x1;
+	  cur_y++;
+	  if(cur_y > win_y2)
             {
-                cur_y = win_y1;
+	      cur_y = win_y1;
             }
         }
-        lenght--;
+      lenght--;
     }
 }
 
@@ -312,13 +307,13 @@
     buffer[(x + page*screensize_X)] = (buffer[(x + page*screensize_X)] & ~(mask<<(pos*_BPP))) | ((color&mask)<<(pos*_BPP));
     */
 
-    unsigned char cval = buffer[(y*128) + x/2];
+    unsigned char cval = _pixelBuffer[(y*128) + x/2];
     if (x&1) {
       cval = (cval & 0xF0) | (color & 0x0F);
     } else {
       cval = (cval & 0x0F) | (color & 0x0F)<<4;
     }
-    buffer[(y*128) + x/2] = cval;
+    _pixelBuffer[(y*128) + x/2] = cval;
 }
 
 unsigned short SSD1322::pixelread(int x, int y)
@@ -332,7 +327,7 @@
     unsigned char mask = (( 1 << _BPP) - 1);
 
     //FAUX
-    return (buffer[(x + page*screensize_X)]); // = (buffer[(x + page*screensize_X)] & ~(mask<<(pos*_BPP))) | ((color&mask)<<(pos*_BPP));
+    return (_pixelBuffer[(x + page*screensize_X)]); // = (_pixelBuffer[(x + page*screensize_X)] & ~(mask<<(pos*_BPP))) | ((color&mask)<<(pos*_BPP));
 }
 
 
@@ -359,107 +354,69 @@
 
 void SSD1322::copy_to_lcd(void)
 {
+  unsigned int x, y;
   unsigned int i;
-  unsigned char x, y;
-
   set_row_address(0);
   set_column_address(0);
 
+  memcpy((void*)_trBuffer,
+	 (const void*)_pixelBuffer,
+	 DISPLAY_BUFFER_ELEMENTS * sizeof(DISPLAY_BUFFER_TYPE));
+  wr_cmd8(SSD1322_CMD_WRITE_RAM);
+
   i = 0;
-  wr_cmd8(SSD1322_CMD_WRITE_RAM);
   for(y=0; y<64; y++) 
     for(x=0; x<128; x++) 
-      wr_data8(buffer[i++]);
+      wr_data8(_trBuffer[i++]);
 }
 
 void SSD1322::copy_to_lcd(unsigned char from_col, unsigned char to_col,
 			  unsigned char from_row, unsigned char to_row)
 {
-  unsigned char x, y;
-
+  unsigned int x, y;
   if (to_col>0x3F)
     to_col = 0x3F;
   if (to_row>0x3F)
     to_row = 0x3F;
+
+  memcpy((void*)_trBuffer,
+	 (const void*)_pixelBuffer,
+	 DISPLAY_BUFFER_ELEMENTS * sizeof(DISPLAY_BUFFER_TYPE));
+  
   set_row_address(from_row, to_row);
   set_column_address(from_col, to_col);
 
   wr_cmd8(SSD1322_CMD_WRITE_RAM);
   for(y=from_row; y<=to_row; y++) {
     for(x=from_col; x<=to_col; x++) { 
-      wr_data8(buffer[y*128 + 2*x]);
-      wr_data8(buffer[y*128 + 2*x + 1]);
+      wr_data8(_trBuffer[y*128 + 2*x]);
+      wr_data8(_trBuffer[y*128 + 2*x + 1]);
     }
   }
 }
 
 unsigned long SSD1322::buffaddr(unsigned int i)
 {
-  return (unsigned long) &(buffer[i]);
+  return (unsigned long) &(_pixelBuffer[i]);
 }
 
 void SSD1322::clrbuff(const unsigned char value)
 {
-  memset(buffer, value, screensize_X*_PAGES);
+  memset((void*)_pixelBuffer, value, screensize_X*_PAGES);
 }
 
 void SSD1322::fills(const unsigned char value)
 {
-clrbuff(value);
-copy_to_lcd();
+  clrbuff(value);
+  copy_to_lcd();
 }
 
 void SSD1322::cls(void)
 {
-clrbuff();
-copy_to_lcd();
+  clrbuff();
+  copy_to_lcd();
 }
 
-//void ll_fill(const unsigned char value=0xFF, const unsigned char w=0x78, const unsigned char=0x80);
-void SSD1322::ll_fill(const unsigned char value, const unsigned char w, const unsigned char h)
-{
-  unsigned short x,y;
-  //w = 0x78; // 120 x 2px by byte => 240px
-  //h = 0x80; // 0x80 for 64 rows because 2 COMs mode
-  
-  wr_cmd8(0x15); // COL ADDR
-  wr_data8(0x00); 
-  wr_data8(w-1);
-  
-  wr_cmd8(0x75); // ROW ADDR
-  wr_data8(0x00);
-  wr_data8(h-1);
-  
-  wr_cmd8(0x5C); // WRITE RAM
-  for(y=0; y<h/2; y++)
-    {
-      for(x=0; x<2*w; x++)
-	{
-	  if ((y==0) | (y==(h/2-1)))
-	    wr_data8(0xFF);
-	  else if (x == 56) // ????
-	    wr_data8(0xF2); 
-	  else if (x == 183)
-	    //else if (x == (2*w-1))
-	    wr_data8(0x2F);
-	  else if ((x%10) == 0)
-	    wr_data8(0x55);
-	  else if ((x%5) == 0)
-	    wr_data8(0x33);
-	  else
-	    wr_data8(0x22);
-	}
-    }
-}
-
-int SSD1322::sizeX()
-{
-    return screensize_X;
-}
-int SSD1322::sizeY()
-{
-    return screensize_Y;
-}
 
 // reset and init the lcd controller
 void SSD1322::init()
@@ -473,23 +430,3 @@
 	}
     }
  }
-
-void SSD1322::loop_event(void) {
-  if (loop_pos >= 64)
-    loop_pos = 0;
-  set_row_address(loop_pos);
-  set_column_address(0);
-  wr_cmd8(SSD1322_CMD_WRITE_RAM);
-
-  for(uint8_t i=0; i<128; i++)
-    wr_data8(buffer[loop_pos*64+i]);	
-}
-  
-void SSD1322::start_loop(float tick) {
-  loop_pos = 0;
-  bah.attach(this, &SSD1322::loop_event, tick);
-}
-
-void SSD1322::stop_loop() {
-  bah.detach();
-}
--- a/lib/unigraphic/SSD1322.h	Fri Sep 23 21:12:43 2016 +0200
+++ b/lib/unigraphic/SSD1322.h	Tue Oct 11 00:14:20 2016 +0200
@@ -2,18 +2,32 @@
 #define MBED_SSD1322_H
 
 #include "mbed.h"
-
-#include "SPI8.h"
-
-#include "Protocols.h"
 #include "GraphicsDisplay.h"
 
+//Display module specs
+#define DISPLAY_WIDTH	(256)
+#define DISPLAY_HEIGHT	(64)
+#define DISPLAY_BUFFER_TYPE uint8_t
+#define DISPLAY_BUFFER_TYPE_SIZE (2) // 2 pixel / byte
+#define DISPLAY_BUFFER_ELEMENTS 8192 // 256*64 / 2 (because 2 pixels/byte)
+
+
 /** Mirror mode */
-enum mirror_t {X,Y,XY,NONE};
+enum mirror_t {X, Y, XY, NONE};
+
+typedef enum {
+	IDLE,			// No operation currently ongoing
+	CLEARING,		// In the process of clearing the display
+	WRITING,		// In the process of sending a display update
+	WAIT_CLEAR,		// Going to clear after CS pin timeout
+	WAIT_WRITE,		// Going to write after CS pin timeout
+	TRANSFERS_DONE,         // Last transfer in progress
+	DONE,                   // Done with transmission, waiting for CS pin to become high
+} SSD1322_state_t;
 
 /** A common base class for monochrome Display
 */
-class SSD1322 : public GraphicsDisplay
+class SSD1322: public GraphicsDisplay
 {
 
 public:         
@@ -22,15 +36,13 @@
     /** Create a monochrome SSD1322 SPI interface
     * @param name The name used by the parent class to access the interface
     */
-    SSD1322(proto_t displayproto,
-	    int Hz, PinName mosi, PinName miso, PinName sclk, PinName CS, PinName reset, PinName DC,
-	    const char* name,
-	    const unsigned int lcdsize_x=128, const unsigned int lcdsize_y=64);
+  SSD1322(int Hz, PinName mosi, PinName miso, PinName sclk, PinName CS, PinName reset, PinName DC,
+	  const char* name);
     
     /** Destructor
     * will free framebuffer
     */
-    virtual ~SSD1322();
+    virtual ~SSD1322() {};
     
 
     
@@ -129,12 +141,12 @@
     /** get display X size in pixels (native, orientation independent)
     * @returns X size in pixels
     */
-    int sizeX();
+    int sizeX() {return screensize_X;};
 
     /** get display Y size in pixels (native, orientation independent)
     * @returns Y size in pixels
     */
-    int sizeY();
+    int sizeY() {return screensize_Y;};
     
 ////////////////////////////////////////////////////////////////////////////////    
     // not implemented yet
@@ -151,13 +163,10 @@
     void clrbuff(const unsigned char value=0x00);
     unsigned long buffaddr(unsigned int i);
     void fills(const unsigned char value=0xFF);
-    void ll_fill(const unsigned char value=0xFF, const unsigned char w=0x78, const unsigned char=0x80);
+    
     void set_row_address(unsigned char start_row=0x00, unsigned char end_row=0x3F);
     void set_column_address(unsigned char start_col=0x00, unsigned char end_col=0x3F);
 
-    void start_loop(float tick);
-    void stop_loop(void);
-
     virtual void copy_to_lcd(unsigned char from_col, unsigned char to_col,
 			     unsigned char from_row, unsigned char to_row);
     
@@ -188,41 +197,22 @@
     *
     */   
     void wr_data8(unsigned char data);
-    
-    /** Send 16bit command to display controller 
-    *
-    * @param cmd: halfword to send  
-    *
-    */   
-    void wr_cmd16(unsigned short cmd);
-    
-    /** Send same 16bit pixeldata to display controller multiple times
-    *
-    * @param data: halfword to send
-    * @param count: how many
-    *
-    */   
-    virtual void wr_gram(unsigned short data, unsigned int count);
-    
-    /** Send array of pixeldata shorts to display controller
-    *
-    * @param data: unsigned short pixeldata array
-    * @param lenght: lenght (in shorts)
-    *
-    */   
-    virtual void wr_grambuf(unsigned short* data, unsigned int lenght);
-    
+        
     /** HW reset sequence (without display init commands)   
     */
     void hw_reset();
   
     int contrast;
-    void loop_event(void);
     
 protected:
 
-    Protocols* proto;
-    unsigned char *buffer;
+    mbed::SPI _spi;
+    DigitalOut _CS;
+    DigitalOut _RST;
+    DigitalOut _DC;
+    volatile DISPLAY_BUFFER_TYPE _pixelBuffer[DISPLAY_BUFFER_ELEMENTS]; // one full frame buffer
+    DISPLAY_BUFFER_TYPE _trBuffer[DISPLAY_BUFFER_ELEMENTS]; // for sending
+    
     const int screensize_X;
     const int screensize_Y;
     const int _PAGES;
@@ -231,8 +221,6 @@
     const int _IC_Y_COMS;
     const int _IC_PAGES;
 
-    Ticker bah;
-    int loop_pos;
     // pixel location
     int cur_x;
     int cur_y;
@@ -242,6 +230,9 @@
     int win_y1;
     int win_y2;
     int orientation;
+
+    SSD1322_state_t _state;
+
 };
 
 #endif
--- a/platformio.ini	Fri Sep 23 21:12:43 2016 +0200
+++ b/platformio.ini	Tue Oct 11 00:14:20 2016 +0200
@@ -17,14 +17,27 @@
 # Automatic targets - enable auto-uploading
 # targets = upload
 
-[env:nucleo_f446re]
+[env:f446re]
 platform = ststm32
 framework = mbed
 board = nucleo_f446re
-build_flags = -D UNIG_SPI8 -fpermissive
 upload_port = /media/sdb
 lib_compat_mode = 0
 
+[env:f303k8]
+platform = ststm32
+framework = mbed
+board = nucleo_f303k8
+upload_port = /media/sdb
+
+[env:l432kc]
+platform = ststm32
+framework = mbed
+board = nucleo_l432kc
+upload_port = /media/sdb
+lib_compat_mode = 0
+build_flags = -DDEBUG -DDEBUG2
+
 # [env:nucleo_f031k6]
 # platform = ststm31
 # framework = mbed
--- a/src/hp34comm.cpp	Fri Sep 23 21:12:43 2016 +0200
+++ b/src/hp34comm.cpp	Tue Oct 11 00:14:20 2016 +0200
@@ -4,23 +4,22 @@
 
 /***** HP 34970A communication class ***/
 
-#define HP_SERIAL_TX PC_7 // serial6 RX
-#define HP_SERIAL_RX PA_1 // serial4 RX
-
-#ifdef DEBUG
+#ifdef DEBUG2
 
-DigitalOut inrx(PC_0);
-DigitalOut intx(PC_1);
-DigitalOut ack(PC_3);
-DigitalOut staterx(PC_2);
-DigitalOut statetx(PH_1);
+DigitalOut inrx(D9);
+DigitalOut intx(D5);
+DigitalOut ack(D6);
+DigitalOut staterx(D7);
+DigitalOut statetx(D8);
 
 #endif
 
+DigitalOut lled(LED1);
   
-HPSerial::HPSerial():
-  ncmd(0),
-  serial_tx(NC, HP_SERIAL_TX), serial_rx(NC, HP_SERIAL_RX) {
+HPSerial::HPSerial(PinName rx, PinName tx):
+  serial_tx(A7, tx),
+  serial_rx(NC, rx),
+  ncmd(0) {
   
   //pc.printf("HPSerial init\n");
 
@@ -84,7 +83,7 @@
 	if (val == 0x99)
 	  {
 	    tx_ack = true;
-#ifdef DEBUG
+#ifdef DEBUG2
 	    ack = 1;
 	    wait_us(2);
 	    ack = 0;
@@ -97,7 +96,7 @@
 	if (val == 0x00)
 	  {
 	    tx_ack = true;
-#ifdef DEBUG
+#ifdef DEBUG2
 	    ack = 1;
 	    wait_us(2);
 	    ack = 0;
@@ -150,7 +149,7 @@
     }
     else { // end of payload, manage sent content
       uint8_t cur_state = tx_state;
-      pushCmd(tx_state, tx_cmd, head, buf); 
+      pushCmd((TrState)tx_state, tx_cmd, head, (char*)buf); 
       
       switch(val) {
       case 0x66: // a new transmisson
@@ -171,24 +170,25 @@
 
 
 void HPSerial::setstatedbg(void) {
-  /*
+#ifdef DEBUG2
     if (tx_state == Rx)
-    staterx = 1;
+      staterx = 1;
     else
-    staterx = 0;
+      staterx = 0;
     if (tx_state == Tx)
-    statetx = 1;
+      statetx = 1;
     else
-    statetx = 0;
-  */
+      statetx = 0;
+#endif
 }
 
 void HPSerial::rxIrq(void) {
   uint8_t val;
   if(serial_rx.readable()) { // no reason why we would end here without this condition, but hey
-#ifdef DEBUG
+#ifdef DEBUG2
     inrx=1;
 #endif
+  lled = 1;
     val = serial_rx.getc();
     
     timeouter.attach(this, &HPSerial::timeout, 0.001); // if nothing else happen in the next ms, reset
@@ -200,15 +200,16 @@
 	tx_ack = false;
 	setstatedbg();
       }
-      else
+      else {
 	reset(4);
-    
+      }
     else if (tx_state == Tx)  // manage the acks
       handleAck(val);
     
     else 
       handleChar(val);
-#ifdef DEBUG
+  lled = 0;
+#ifdef DEBUG2
     inrx=0;
 #endif
   }
@@ -217,7 +218,7 @@
 void HPSerial::txIrq(void) {
   uint8_t val;
   if(serial_tx.readable()) { // no reason why we would end here without this condition, but hey
-#ifdef DEBUG
+#ifdef DEBUG2
     intx=1;
 #endif
     val = serial_tx.getc();
@@ -231,8 +232,9 @@
 	tx_ack = false;
 	setstatedbg();
       }
-      else
+      else {
 	reset(5);
+      }
     
     else if (tx_state == Rx)  // manage the acks
       handleAck(val);
@@ -240,7 +242,7 @@
     else 
       handleChar(val);
   }
-#ifdef DEBUG
+#ifdef DEBUG2
   intx=0;
 #endif
 }
--- a/src/hp34comm.cpp~	Fri Sep 23 21:12:43 2016 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,241 +0,0 @@
-
-#include "hp34comm.h"
-
-/***** HP 34970A communication class ***/
-
-
-
-  
-HPSerial::HPSerial():
-  ncmd(0),
-  serial_tx(NC, HP_SERIAL_TX), serial_rx(NC, HP_SERIAL_RX) {
-  
-  //pc.printf("HPSerial init\n");
-
-  for(uint8_t i=0; i<MAX_ERRS; i++)
-    errs[i] = 0;
-  reset();
-  
-  serial_tx.baud(187500);
-  serial_tx.attach(this, &HPSerial::txIrq, Serial::RxIrq); //sic!
-  
-  serial_rx.baud(187500);
-  serial_rx.attach(this, &HPSerial::rxIrq, Serial::RxIrq);
-}
-
-bool HPSerial::cmd_available(void) {
-  return !cmdbuf.empty();
-}
-
-bool HPSerial::pop(CMD& cmd) {
-  return cmdbuf.pop(cmd);
-}
-
-bool HPSerial::cmd_buf_full(void) {
-  return cmdbuf.full();
-}
-
-unsigned int HPSerial::nerrors(uint8_t errorno) {
-  return errs[errorno];
-}
-    
-		     
-  
-void HPSerial::reset(uint8_t errorno=0xFF) {
-  timeouter.detach();
-  head = 0;
-  tx_state = Idle;
-  setstatedbg();
-  tx_cmd = 0xFF;
-  tx_ack = false;
-  tx_len = 0xFF;
-  memset(buf, 0, BUF_SIZE);
-  if (errorno != 0xFF){
-    errs[errorno]++;
-    pulse(errorno+1);
-  }
-  
-}
-
-void HPSerial::handleAck(uint8_t val) {
-  if ((tx_state == Rx) & (tx_cmd == 0xFF) & (tx_ack == false) & (val == 0x66)) {
-    // special case: keypad does not acknwledge and takes precedence
-    // on the "bus"
-    tx_state = Tx;
-    setstatedbg();
-  } else
-    
-    if (tx_ack == true)
-      reset(0);
-  
-    else
-      if (tx_cmd == 0xFF) // still at the beginning of a packet, expect 0x99 as ack
-	if (val == 0x99)
-	  {
-	    tx_ack = true;
-#ifdef DEBUG
-	    ack = 1;
-	    wait_us(2);
-	    ack = 0;
-#endif
-	  }
-	else 
-	  reset(1);
-
-      else // expect 0x00 as ack
-	if (val == 0x00)
-	  {
-	    tx_ack = true;
-#ifdef DEBUG
-	    ack = 1;
-	    wait_us(2);
-	    ack = 0;
-	    wait_us(2);
-	    ack = 1;
-	    wait_us(2);
-	    ack = 0;
-#endif
-	  }
-	else
-	  reset(2);
-}
-
-void HPSerial::pushCmd(TrState direction, uint8_t cmd, uint8_t size, char *payload) {
-  CMD val;
-  uint8_t i;
-  val.id = ncmd++;
-  val.direction = direction;
-  val.cmd = cmd;
-  val.size = size;
-  for(i=0; i<size; i++)
-    val.value[i] = payload[i];
-  val.value[i] = 0x00;
-  cmdbuf.push(val);
-}
-
-void HPSerial::handleChar(uint8_t val) {
-  if (tx_ack == false)
-    reset(3);
-  else // remaining of the state machine
-    if (tx_cmd == 0xFF) {
-      // begin of transmission, expect a cmd
-      tx_cmd = val;
-      tx_ack = false;
-      if (tx_state == Rx)
-	tx_len = 0xFF;
-      else
-	tx_len = 0x00; // no payload: tx_cmd is the key stroke
-    }
-    else if (tx_len == 0xFF) {
-      // got a cmd, expect a payload size
-      tx_len = val;
-      tx_ack = false;
-    }
-    else if (tx_len > 0) {
-      // a payload char
-      buf[head++] = val;
-      tx_len--;
-      tx_ack = false;
-    }
-    else { // end of payload, manage sent content
-      uint8_t cur_state = tx_state;
-      pushCmd(tx_state, tx_cmd, head, buf); 
-      
-      switch(val) {
-      case 0x66: // a new transmisson
-	reset();
-	tx_state = cur_state;
-	setstatedbg();
-	break;
-      case 0x55:
-	reset();
-	break;
-      default:
-	reset(6);
-	break;
-      }
-    }
-}
-
-
-
-void HPSerial::setstatedbg(void) {
-  /*
-    if (tx_state == Rx)
-    staterx = 1;
-    else
-    staterx = 0;
-    if (tx_state == Tx)
-    statetx = 1;
-    else
-    statetx = 0;
-  */
-}
-
-void HPSerial::rxIrq(void) {
-  uint8_t val;
-  if(serial_rx.readable()) { // no reason why we would end here without this condition, but hey
-#ifdef DEBUG
-    inrx=1;
-#endif
-    val = serial_rx.getc();
-    
-    timeouter.attach(this, &HPSerial::timeout, 0.001); // if nothing else happen in the next ms, reset
-    
-    if (tx_state == Idle)
-      if (val == 0x66) {
-	// no transmission in progress, expect a start of transmission
-	tx_state = Rx;
-	tx_ack = false;
-	setstatedbg();
-      }
-      else
-	reset(4);
-    
-    else if (tx_state == Tx)  // manage the acks
-      handleAck(val);
-    
-    else 
-      handleChar(val);
-#ifdef DEBUG
-    inrx=0;
-#endif
-  }
-}
-
-void HPSerial::txIrq(void) {
-  uint8_t val;
-  if(serial_tx.readable()) { // no reason why we would end here without this condition, but hey
-#ifdef DEBUG
-    intx=1;
-#endif
-    val = serial_tx.getc();
-    
-    timeouter.attach(this, &HPSerial::timeout, 0.001); // if nothing else happen in the next ms, reset
-    
-    if (tx_state == Idle)
-      if (val == 0x66) {
-	// no transmission in progress, expect a start of transmission
-	tx_state = Tx;
-	tx_ack = false;
-	setstatedbg();
-      }
-      else
-	reset(5);
-    
-    else if (tx_state == Rx)  // manage the acks
-      handleAck(val);
-    
-    else 
-      handleChar(val);
-  }
-#ifdef DEBUG
-  intx=0;
-#endif
-}
-
-void HPSerial::timeout(void) {
-  if (tx_state != Idle) {
-    reset(7);
-  }
-}
--- a/src/hp34comm.h	Fri Sep 23 21:12:43 2016 +0200
+++ b/src/hp34comm.h	Tue Oct 11 00:14:20 2016 +0200
@@ -7,8 +7,8 @@
 /***** HP 34970A communication class ***/
 
 #define MAX_ERRS 10
-#define MAX_BUFF 32
-#define BUF_SIZE 32
+#define MAX_BUFF 16
+#define BUF_SIZE 16
 
 class HPSerial {
 
@@ -29,7 +29,7 @@
 
 
   
-  HPSerial();
+  HPSerial(PinName rx, PinName tx);
   
   bool cmd_available(void);
   bool pop(CMD& cmd);
--- a/src/hp34comm.h~	Fri Sep 23 21:12:43 2016 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,270 +0,0 @@
-#ifndef HP34COMM_H
-#define HP34COMM_H
-
-/***** HP 34970A communication class ***/
-
-class HPSerial {
-
-public:
-  enum TrState {
-        Idle = 0,
-        Tx,
-        Rx,
-    };
-  typedef struct _CMD
-  {
-    TrState direction;
-    uint8_t cmd;
-    uint8_t size;
-    char value[MAX_BUFF+1];
-    unsigned long id;
-  } CMD;
-
-
-  
-  HPSerial(): ncmd(0), serial_tx(NC, HP_SERIAL_TX), serial_rx(NC, HP_SERIAL_RX) {
-    pc.printf("HPSerial init\n");
-    for(uint8_t i=0; i<MAX_ERRS; i++)
-      errs[i] = 0;
-    reset();
-
-    serial_tx.baud(187500);
-    serial_tx.attach(this, &HPSerial::txIrq, Serial::RxIrq); //sic!
-
-    serial_rx.baud(187500);
-    serial_rx.attach(this, &HPSerial::rxIrq, Serial::RxIrq);
-  }
-
-  bool cmd_available(void) {
-    return !cmdbuf.empty();
-  }
-
-  bool pop(CMD& cmd) {
-    return cmdbuf.pop(cmd);
-  }
-
-  bool cmd_buf_full(void) {
-    return cmdbuf.full();
-  }
-
-  unsigned int nerrors(uint8_t errorno) {
-    return errs[errorno];
-  }
-    
-		     
-  
-private:
-  void reset(uint8_t errorno=0xFF) {
-    timeouter.detach();
-    head = 0;
-    tx_state = Idle;
-    setstatedbg();
-    tx_cmd = 0xFF;
-    tx_ack = false;
-    tx_len = 0xFF;
-    memset(buf, 0, BUF_SIZE);
-    if (errorno != 0xFF){
-      errs[errorno]++;
-      pulse(errorno+1);
-    }
-    
-  }
-
-  void handleAck(uint8_t val) {
-    if ((tx_state == Rx) & (tx_cmd == 0xFF) & (tx_ack == false) & (val == 0x66)) {
-      // special case: keypad does not acknwledge and takes precedence
-      // on the "bus"
-      tx_state = Tx;
-      setstatedbg();
-    } else
-    
-    if (tx_ack == true)
-      reset(0);
-
-    else
-      if (tx_cmd == 0xFF) // still at the beginning of a packet, expect 0x99 as ack
-	if (val == 0x99)
-	  {
-	    tx_ack = true;
-#ifdef DEBUG
-	    ack = 1;
-	    wait_us(2);
-	    ack = 0;
-#endif
-	  }
-	else 
-	  reset(1);
-
-      else // expect 0x00 as ack
-	if (val == 0x00)
-	  {
-	    tx_ack = true;
-#ifdef DEBUG
-	    ack = 1;
-	    wait_us(2);
-	    ack = 0;
-	    wait_us(2);
-	    ack = 1;
-	    wait_us(2);
-	    ack = 0;
-#endif
-	  }
-	else
-	  reset(2);
-  }
-
-  void pushCmd(TrState direction, uint8_t cmd, uint8_t size, char *payload) {
-    CMD val;
-    uint8_t i;
-    val.id = ncmd++;
-    val.direction = direction;
-    val.cmd = cmd;
-    val.size = size;
-    for(i=0; i<size; i++)
-      val.value[i] = payload[i];
-    val.value[i] = 0x00;
-    cmdbuf.push(val);
-  }
-  
-  void handleChar(uint8_t val) {
-    if (tx_ack == false)
-      reset(3);
-    else // remaining of the state machine
-      if (tx_cmd == 0xFF) {
-	// begin of transmission, expect a cmd
-	tx_cmd = val;
-	tx_ack = false;
-	if (tx_state == Rx)
-	  tx_len = 0xFF;
-	else
-	  tx_len = 0x00; // no payload: tx_cmd is the key stroke
-      }
-      else if (tx_len == 0xFF) {
-	// got a cmd, expect a payload size
-	tx_len = val;
-	tx_ack = false;
-      }
-      else if (tx_len > 0) {
-	// a payload char
-	buf[head++] = val;
-	tx_len--;
-	tx_ack = false;
-      }
-      else { // end of payload, manage sent content
-	uint8_t cur_state = tx_state;
-	pushCmd(tx_state, tx_cmd, head, buf); 
-
-	switch(val) {
-	case 0x66: // a new transmisson
-	  reset();
-	  tx_state = cur_state;
-	  setstatedbg();
-	  break;
-	case 0x55:
-	  reset();
-	  break;
-	default:
-	  reset(6);
-	  break;
-	}
-      }
-  }
-    
-
-
-  void setstatedbg(void) {
-    /*
-    if (tx_state == Rx)
-      staterx = 1;
-    else
-      staterx = 0;
-    if (tx_state == Tx)
-      statetx = 1;
-    else
-      statetx = 0;
-    */
-  }
-    
-  void rxIrq(void) {
-    uint8_t val;
-    if(serial_rx.readable()) { // no reason why we would end here without this condition, but hey
-#ifdef DEBUG
-      inrx=1;
-#endif
-      val = serial_rx.getc();
-
-      timeouter.attach(this, &HPSerial::timeout, 0.001); // if nothing else happen in the next ms, reset
-      
-      if (tx_state == Idle)
-	if (val == 0x66) {
-	  // no transmission in progress, expect a start of transmission
-	  tx_state = Rx;
-	  tx_ack = false;
-	  setstatedbg();
-	}
-	else
-	  reset(4);
-    
-      else if (tx_state == Tx)  // manage the acks
-	handleAck(val);
-      
-      else 
-	handleChar(val);
-#ifdef DEBUG
-      inrx=0;
-#endif
-    }
-  }
-  
-  void txIrq(void) {
-    uint8_t val;
-    if(serial_tx.readable()) { // no reason why we would end here without this condition, but hey
-#ifdef DEBUG
-      intx=1;
-#endif
-      val = serial_tx.getc();
-
-      timeouter.attach(this, &HPSerial::timeout, 0.001); // if nothing else happen in the next ms, reset
-      
-      if (tx_state == Idle)
-	if (val == 0x66) {
-	  // no transmission in progress, expect a start of transmission
-	  tx_state = Tx;
-	  tx_ack = false;
-	  setstatedbg();
-	}
-	else
-	  reset(5);
-    
-      else if (tx_state == Rx)  // manage the acks
-	handleAck(val);
-      
-      else 
-	handleChar(val);
-    }
-#ifdef DEBUG
-    intx=0;
-#endif
-  }
-
-  void timeout(void) {
-    if (tx_state != Idle) {
-      reset(7);
-    }
-  }
-private:
-  RawSerial serial_tx;
-  RawSerial serial_rx;
-  uint8_t buf[BUF_SIZE];
-  uint8_t head;
-  uint8_t tx_state;
-  uint8_t tx_cmd;
-  uint8_t tx_len;
-  bool tx_ack;
-  CircularBuffer<CMD, 32> cmdbuf;
-  unsigned long ncmd;
-  unsigned int errs[MAX_ERRS];
-  Ticker timeouter;
-};
-
-#endif
--- a/src/main.cpp	Fri Sep 23 21:12:43 2016 +0200
+++ b/src/main.cpp	Tue Oct 11 00:14:20 2016 +0200
@@ -12,18 +12,63 @@
 #include "SSD1322.h"
 #include "hp34comm.h"
 
+
+#if (defined STM32F303x8) || (defined STM32L432xx)
+// display
+#define DSP_MOSI PA_7 //A6
+#define DSP_MISO PA_6 //A5 
+#define DSP_SCLK PA_5 //A4
+#define DSP_CS   PB_0 //D3
+#define DSP_RST  PB_5 //D11
+#define DSP_DC   PB_4 //D12
+// UART for RX (CPU->DP)
+#define HP_RX PA_10 // serial1 RX
+// UART for TX (DP->CPU)
+#define HP_TX PA_3 // serial2 RX
+
+// misc
+#define DBGPIN PA_12
+
+
+#elif defined STM32F446xx
+// display
+#define DSP_MOSI PB_15
+#define DSP_MISO PB_14
+#define DSP_SCLK PB_13
+#define DSP_CS   PB_12
+#define DSP_RST  D11
+#define DSP_DC   D12
+// UART for RX (CPU->DP)
+#define HP_RX PA_1 // serial4 RX
+// UART for TX (DP->CPU)
+#define HP_TX PC_7 // serial6 RX
+
+// misc
+#define DBGPIN PC_0
+
+#define HAS_PC
 Serial pc(USBTX, USBRX);
 
-#define DEBUG
+#endif
+
 
-SSD1322 dsp(SPI_8, 20000000, PB_15, PB_14, PB_13, PB_12, D11, D12, "SSD1322", 256, 64);
-
+SSD1322 *dsp;//(10000000, DSP_MOSI, DSP_MISO, DSP_SCLK, DSP_CS, DSP_RST, DSP_DC, "SSD1322");
+HPSerial *hp; //(HP_RX, HP_TX);
+volatile uint8_t must_refresh;
+Thread tdsp, tloop;
+Timeout blinker;
+DigitalOut led(LED1);
 
 uint8_t curchar;
 uint8_t cmd;
 uint8_t nchars;
 char buffer[MAX_BUFF+1];
 
+void timeout_h() {
+  led = !led;
+  blinker.attach(&timeout_h, 0.5f);  
+}
+
 typedef struct _DSP
 {
   uint8_t cmd;
@@ -80,7 +125,7 @@
 typedef struct _FLAG
 {
   uint8_t flag;
-  uint8_t zone;
+  uint16_t zone;
   uint8_t x;
   uint8_t y;
   const char* msg;
@@ -89,7 +134,7 @@
 
 typedef struct _FRAME
 {
-  uint8_t flag;
+  uint16_t flag;
   uint8_t x0;
   uint8_t y0;
   uint8_t x1;
@@ -102,36 +147,38 @@
     // right-side icons area
     { 0x00, 0x02, 0, 0,  NULL, icon_alarm}, // F1.1
     { 0x01, 0x02, 0, 11, NULL, icon_curve}, // F1.2
-    { 0x14, 0x02, 0, 22,  "4W"},    // F2.5
+    
 
     { 0x03, 0x04, 1, 2, "Channel"}, // F1.4
 
     // col 1
     { 0x34, 0x10, 0,  0,  "MON"},     // F4.5
     { 0x33, 0x10, 0,  8,  "VIEW"},    // F4.4
-    { 0x35, 0x10, 0,  16,  "SCAN"},   // F4.6
+    { 0x35, 0x10, 0,  16, "SCAN"},   // F4.6
 
     //col 2
     { 0x32, 0x20, 0, 0,  "*"},      // F4.3
     { 0x36, 0x20, 0, 8,  "CFG"},    // F4.7
-    { 0xFF, 0x20, 0, 16,  "ERROR"},
+    { 0x27, 0x20, 0, 16, "ERR"},  // F3.8
 
-    /*
-    { 0xFF, 0, 0,  "ADRS"},
-    { 0xFF, 0, 0,  "RMT"},
-    { 0xFF, 0, 0,  "EXT"},
+    // col 3
+    { 0x41, 0x040, 0, 0, "ADRS"}, // F4.2
+    { 0x40, 0x040, 0, 8,  "RMT"},  // F4.1
 
-    { 0xFF, 0, 0,  "ONCE"},
-    { 0xFF, 0, 0,  "AUTO"},
-    { 0xFF, 0, 0,  "MEM"},
+    // col 4
+    { 0x26, 0x080, 0, 0,  "EXT"},  // F3.7
+    { 0x25, 0x080, 0, 8,  "ONCE"}, // F3.6
+    
+    { 0xFF, 0x080, 0, 16,  "MEM"},
 
-    { 0xFF, 0, 0,  "LAST"},
-    { 0xFF, 0, 0,  "MIN"},
-    { 0xFF, 0, 0,  "MAX"},
-
-    { 0xFF, 0, 0,  "AVG"},
-    { 0xFF, 0, 0,  "OC"},
-    */
+    
+    // col 5
+    { 0x14, 0x100, 0, 0,  "4W"},    // F2.5
+    { 0x15, 0x100, 0, 8,  "OC"},    // F2.6
+    { 0xFF, 0x100, 0, 16, "LST"},   // F3.8? Nope
+    { 0xFF, 0x100, 0, 16, "MIN"},
+    { 0xFF, 0x100, 0, 16, "MAX"},
+    { 0xFF, 0x100, 0, 16, "AVG"},
 
     { 0x05, 0x08, 0,   0,  "Alarm"}, // F1.6
     { 0x06, 0x08, 0,  10,  "H"}, // F1.7
@@ -145,25 +192,27 @@
 
 static const FRAME zones[] =
   {
-    { 0x01, 0,   0, 245, 27}, // main display area
-    { 0x02, 246, 0, 255, 27}, // right notif area
-    { 0x04, 203, 28, 255, 54}, // channels display area
-    { 0x08, 160, 28, 202, 54}, // alarms area
-    { 0x10, 0,  28, 32,  54}, // flags col1
-    { 0x20, 33, 28, 70,  54}, // flags col2
-    { 0x40, 71, 28, 159, 54}, // flags col3
+    { 0x001, 0,   0, 245, 27}, // main display area
+    { 0x002, 246, 0, 255, 27}, // right notif area
+    { 0x004, 203, 28, 255, 54}, // channels display area
+    { 0x008, 160, 28, 202, 54}, // alarms area
+    { 0x010, 0,   28, 32,  54}, // flags col1
+    { 0x020, 33,  28, 70,  54}, // flags col2
+    { 0x040, 71,  28, 103, 54}, // flags col3
+    { 0x080, 104, 28, 128, 54}, // flags col4
+    { 0x100, 129, 28, 159, 54}, // flags col5
 
-    { 0x80, 0, 55, 255, 63}, // flags bits display area
+    { 0x8000, 0, 55, 255, 63}, // flags bits display area
   };
 
 static const FRAME frames[] =
   {
-    { 0x02, 203, 35, 248, 55}, // F1.3
+    { 0x02, 203, 35, 255, 54}, // F1.3 - channel frame
+    { 0x07, 160, 28, 202, 54}, // F1.8 - alarm frame
   };
 
 
 #ifdef DEBUG
-#define DBGPIN PC_0
 
 DigitalOut dbgpin(DBGPIN);
 inline void pulse(uint8_t count=1, bool stayup=false)
@@ -187,44 +236,48 @@
 #endif
 
 
-HPSerial hp;
-volatile uint8_t must_refresh;
-Thread tdsp, tloop;
 
 void copy_to_lcd(void);
 void test_dsp();
 
 void setup() {
-    // init the LCD
-
-    //dsp.set_orientation(3);
-    pc.baud (115200);
-    pc.printf("\n\nSystem Core Clock = %.3f MHZ\r\n",
-          (float)SystemCoreClock/1000000);
-
-    // myLCD.set_font((unsigned char*) Terminal6x8);
-    // myLCD.claim(stdout);      // send stdout to the LCD display
-    // myLCD.claim(stderr);      // send stderr to the LCD display
-    dsp.background(Black);    // set background to black
-    dsp.foreground(0xF);
-    dsp.cls();
+  blinker.attach(&timeout_h, 0.5f);
 
-    cmd = 0xFF;
-    curchar = 0;
-    nchars = 0;
-
-    for (uint8_t i=0; i<sizeof(table)/sizeof(table[0]); ++i)
-      memset(table[i].buffer, 0, MAX_BUFF+1);
+  // init the LCD
+  dsp = new SSD1322(20000000, DSP_MOSI, DSP_MISO, DSP_SCLK, DSP_CS, DSP_RST, DSP_DC, "SSD1322");
+  //dsp.set_orientation(3);
+#ifdef HAVE_PC
+  pc.baud (115200);
+#endif
+  printf("\n\nSystem Core Clock = %.3f MHZ\r\n",
+  	 (float)SystemCoreClock/1000000);
+  
+  // myLCD.set_font((unsigned char*) Terminal6x8);
+  // myLCD.claim(stdout);      // send stdout to the LCD display
+  // myLCD.claim(stderr);      // send stderr to the LCD display
+  dsp->background(Black);    // set background to black
+  dsp->foreground(0xF);
+  dsp->cls();
+  
+  cmd = 0xFF;
+  curchar = 0;
+  nchars = 0;
 
-    dsp.locate(30, 10);
-    dsp.set_font(Mono19x27);
-    dsp.printf("HP34970A");
-    dsp.set_font(Terminal6x8);
-    dsp.locate(90, 40);
-    dsp.printf("David Douard");
-    dsp.copy_to_lcd();
-    wait(2);
-    dsp.cls();
+  for (uint8_t i=0; i<sizeof(table)/sizeof(table[0]); ++i)
+    memset(table[i].buffer, 0, MAX_BUFF+1);
+  
+  dsp->locate(30, 10);
+  dsp->set_font((unsigned char*)Mono19x27);
+  dsp->printf("HP34970A");
+  dsp->set_font((unsigned char*)Terminal6x8);
+  dsp->locate(90, 40);
+  dsp->printf("David Douard");
+  dsp->copy_to_lcd();
+  wait(2);
+  dsp->cls();
+
+  hp = new HPSerial(HP_RX, HP_TX);
+  //hp = NULL;
 }
 
 void copy_to_lcd(void) {
@@ -232,10 +285,17 @@
 
   while(1) {
     pulse(0, true);
+    if (must_refresh) {
+      must_refresh = 0;
+      //Thread::wait(20); // give a bit of time for some more cmds  
+      dsp->copy_to_lcd();
+    }
+
+    /*
     if (must_refresh & mask) {
       for(uint8_t i=0; i<sizeof(zones)/sizeof(zones[0]); i++)
 	if (zones[i].flag == mask) {
-	  dsp.copy_to_lcd(zones[i].x0/4, (zones[i].x1+3)/4,
+	  dsp->copy_to_lcd(zones[i].x0/4, (zones[i].x1+3)/4,
 			  zones[i].y0,   zones[i].y1);
 	  must_refresh &= ~mask;
 	  break;
@@ -245,9 +305,9 @@
     if (mask == 0) {
       mask = 1;
     }
-
+    */
     pulse(0, false);
-    Thread::wait(10);
+    Thread::wait(30);
   }
 }
 
@@ -264,96 +324,97 @@
     if (table[i].cmd == cmd) {
       bgcolor = table[i].bgcolor;
       fgcolor = table[i].color;
-      dsp.background(bgcolor);
-      dsp.foreground(fgcolor);
-      dsp.set_font((unsigned char*) table[i].font);
+      dsp->background(bgcolor);
+      dsp->foreground(fgcolor);
+      dsp->set_font((unsigned char*) table[i].font);
       oldv = table[i].buffer;
 
-      dsp.locate(table[i].x0, table[i].y0);
+      dsp->locate(table[i].x0, table[i].y0);
 
       if (table[i].fmt & 0x01 ) {
-	// ascii
-	if (table[i].width > 0)
-	  dsp.fillrect(table[i].x0, table[i].y0, table[i].x0 + table[i].width, table[i].y0 + table[i].font[2], bgcolor);
-	for (uint8_t k=0; ;k++) {
-	  if (txt[k] == 0x00)
-	    {
-	      dsp.printf(txt);
-	      break;
+	if (strncmp(oldv, txt, table[i].maxsize) != 0) {
+	  // ascii
+	  if (table[i].width > 0)
+	    dsp->fillrect(table[i].x0, table[i].y0, table[i].x0 + table[i].width, table[i].y0 + table[i].font[2], bgcolor);
+	  for (uint8_t k=0; ;k++) {
+	    if (txt[k] == 0x00)
+	      {
+		dsp->printf(txt);
+		break;
+	      }
+	    if (txt[k] == 0x09) { // \t is a special char for 'unselected' display value
+	      txt[k] = 0x00;
+	      dsp->printf(txt);
+	      
+	      if (fgcolor == table[i].color)
+		fgcolor /= 2;
+	      else
+		fgcolor = table[i].color;
+	      dsp->foreground(fgcolor);
+	      txt = &(txt[k+1]);
+	      k = 0;
 	    }
-	  if (txt[k] == 0x09) { // \t is a special char for 'unselected' display value
-	    txt[k] = 0x00;
-	    dsp.printf(txt);
-
-	    if (fgcolor == table[i].color)
-	      fgcolor /= 2;
-	    else
-	      fgcolor = table[i].color;
-	    dsp.foreground(fgcolor);
-	    txt = &(txt[k+1]);
-	    k = 0;
 	  }
+	  if (cmd == 0x00) // main area
+	    must_refresh |= 0x01;
+	  if (cmd == 0x0C) // channels area
+	    must_refresh |= 0x04;
 	}
-	if (cmd == 0x00) // main area
-	  must_refresh |= 0x01;
-	if (cmd == 0x0C) // channels area
-	  must_refresh |= 0x04;
       }
-
       /*
       if (table[i].fmt & 0x02 ) {
       // hex
 	for (uint8_t j=0;; j++) {
 	  if (txt[j] == 0x00)
 	    break;
-	  dsp.printf("%02X ", txt[j]);
+	  dsp->printf("%02X ", txt[j]);
 	}
 	for (uint8_t j=3*strlen(txt); j<table[i].maxsize; j++)
-	  dsp.printf(" ");
+	  dsp->printf(" ");
       }
       */
       if (table[i].fmt & 0x04 ) {
       // binary
-	dsp.foreground(fgcolor);
-	dsp.printf(" [");
+	dsp->foreground(fgcolor);
+	dsp->printf(" [");
 	for (uint8_t j=0; j<max(nchar, table[i].maxsize) ; j++) {
 	  if (j>0) {
-	    dsp.foreground(fgcolor);
-	    dsp.printf(" | ");
+	    dsp->foreground(fgcolor);
+	    dsp->printf(" | ");
 	  }
 	  for (uint8_t k=0; k<8; k++) {
 	    if (txt[j] & (1 << (7-k)))
-	      dsp.foreground(fgcolor);
+	      dsp->foreground(fgcolor);
 	    else
-	      dsp.foreground(bgcolor);
-	    dsp.printf("%d", (8-k));
+	      dsp->foreground(bgcolor);
+	    dsp->printf("%d", (8-k));
 	  }
 	}
-	dsp.foreground(fgcolor);
-	dsp.printf("]");
-	must_refresh |= 0x80;
+	dsp->foreground(fgcolor);
+	dsp->printf("]");
+	must_refresh |= 0x8000;
       }
 
       if (table[i].fmt & 0x08 ) {
       // flags
 	for (uint8_t j=0; j<max(nchar, table[i].maxsize) ; j++) {
 	  for (uint8_t k=0; k<8; k++) {
-	    if ((txt[j] & (1 << k) ) != (oldv[j] & (1 << k))) {
+	    if (1) {//(txt[j] & (1 << k) ) != (oldv[j] & (1 << k))) {
 
 	      if (txt[j] & (1 << k))
-		dsp.foreground(fgcolor);
+		dsp->foreground(fgcolor);
 	      else
-		dsp.foreground(bgcolor);
+		dsp->foreground(bgcolor);
 
 	      /*
 	      for (uint8_t l=0;
 		   l<(sizeof(frames)/sizeof(frames[0])); ++l) {
 		if (frames[l].flag & ((j<<4) + k))
-		  dsp.fillrect(frames[l].x0, frames[l].y0,
+		  dsp->fillrect(frames[l].x0, frames[l].y0,
 			       frames[l].x1, frames[l].y1,
 			       fgcolor/8);
 		else
-		  dsp.fillrect(frames[l].x0, frames[l].y0,
+		  dsp->fillrect(frames[l].x0, frames[l].y0,
 			       frames[l].x1, frames[l].y1,
 			       bgcolor);
 
@@ -366,12 +427,12 @@
 		  for (uint8_t m=0; m<(sizeof(zones)/sizeof(zones[0])); m++) {
 		    if (flags[l].zone == zones[m].flag) {
 		      if (flags[l].msg != NULL) { // a string
-			dsp.locate(flags[l].x + zones[m].x0,
+			dsp->locate(flags[l].x + zones[m].x0,
 				   flags[l].y + zones[m].y0);
-			dsp.printf(flags[l].msg);}
+			dsp->printf(flags[l].msg);}
 		      else { // an icon
-			Bitmap_s pic = {9, 10, 2, flags[l].icon};
-			dsp.Bitmap_BW(pic,
+			Bitmap_s pic = {9, 10, 2, (char*) flags[l].icon};
+			dsp->Bitmap_BW(pic,
 				      flags[l].x + zones[m].x0,
 				      flags[l].y + zones[m].y0);
 		      }
@@ -393,7 +454,7 @@
     }
   }
 
-  //dsp.copy_to_lcd();
+  //dsp->copy_to_lcd();
   pulse(1, false);
 }
 
@@ -403,61 +464,93 @@
   show(0x00, "8g8g8g8g8g8g8", 13); // main dsp
   show(0x0C, "888", 3); // channel dsp
   show(0x0A, "\xFF\xFF\xFF\xFF", 4); // all flags
-  dsp.copy_to_lcd();
+  dsp->copy_to_lcd();
   wait(3);
-  dsp.cls();
-  
+  dsp->cls();
+
 
   for (uint8_t i=0; i<(sizeof(zones)/sizeof(zones[0])); i++)
     {
       z = &zones[i];
-      dsp.fillrect(z->x0, z->y0, z->x1, z->y1, 4+i);
-      dsp.locate(z->x0+1, z->y0+1);
-      dsp.printf("%d", i);
+      dsp->fillrect(z->x0, z->y0, z->x1, z->y1, 4+i);
+      dsp->locate(z->x0+1, z->y0+1);
+      dsp->printf("%d", i);
     }
+
+  /*
   for (uint8_t i=0; i<(sizeof(zones)/sizeof(zones[0])); i++)
     {
       z = &zones[i];
-      pc.printf("Zone %d [%x]: %d, %d, %d, %d\n", i, z->flag,
+      printf("Zone %d [%x]: %d, %d, %d, %d\n", i, z->flag,
 		z->x0, z->y0, z->x1, z->y1);
-      must_refresh = z->flag;      
+      must_refresh = z->flag;
       wait(1);
     }
-  pc.printf("Done\n");
+  printf("Done\n");
   wait(2);
-  pc.printf("Copy ALL\n");
-  dsp.copy_to_lcd();
-  wait(2);  
-  dsp.cls();
+  printf("Copy ALL\n");
+  dsp->copy_to_lcd();
+  */
+  wait(2);
+  dsp->cls();
 }
 
 
 void loop() { // run over and over
-  while(1){
-  if (hp.cmd_available())
-    {
-      HPSerial::CMD cmd;
-      if (hp.pop(cmd))
-	{/*
-	  pc.printf("CMD[%s:%d %d/%d/%d/%d/%d/%d/%d] %X\n", (cmd.direction==HPSerial::Rx)?"Rx":"Tx", cmd.id,
-		    hp.nerrors(0),
-		    hp.nerrors(1),
-		    hp.nerrors(2),
-		    hp.nerrors(3),
-		    hp.nerrors(4),
-		    hp.nerrors(5),
-		    hp.nerrors(6),
-		    cmd.cmd);
-	 */
-	  if (cmd.direction == HPSerial::Rx) {
-	    //  if ((cmd.cmd == 0x00) || (cmd.cmd == 0x0C))
-	    //  pc.printf("  data=%s\n", cmd.value);
-	    show(cmd.cmd, cmd.value, cmd.size);
-
-	  }
+  unsigned int err[8];
+  for (uint8_t i=0; i<8; i++)
+    err[i] = 0;
+  while(1) {
+    if (hp != NULL) {
+      if (hp->cmd_available())
+	{
+	  led = 1;
+	  HPSerial::CMD cmd;
+	  if (hp->pop(cmd))
+	    {
+	      for (uint8_t i=0; i<7; i++)
+		if (hp->nerrors(i) > err[i]) {
+		  printf("ERR: %d/%d/%d/%d/%d/%d/%d\n",
+			 hp->nerrors(0),
+			 hp->nerrors(1),
+			 hp->nerrors(2),
+			 hp->nerrors(3),
+			 hp->nerrors(4),
+			 hp->nerrors(5),
+			 hp->nerrors(6)
+			 );
+		  break;
+		}
+	      for (uint8_t i=0; i<7; i++)
+		err[i] = hp->nerrors(i);
+	      printf("CMD[%s:%d] %02X", (cmd.direction==HPSerial::Rx)?"Rx":"Tx", cmd.id,
+		     cmd.cmd);
+	      
+	      if (cmd.direction == HPSerial::Rx) {
+		if ((cmd.cmd == 0x00) || (cmd.cmd == 0x0C))
+		  printf(": '%s'\n", cmd.value);
+		else {
+		  printf(":");
+		  for (uint8_t i=0; i<cmd.size; i++)
+		    printf("%02x ", cmd.value[i], cmd);
+		  printf("\n");	      
+		}
+		show(cmd.cmd, cmd.value, cmd.size);
+	      }
+	      else
+		printf("\n");
+	  
+	      if (cmd.direction == HPSerial::Rx)
+		show(cmd.cmd, cmd.value, cmd.size);
+	    }
+	  led = 0;
 	}
     }
-  Thread::wait(0.01);
+    else {
+      show(0x00, "hello", 6);
+    }
+      
+  Thread::wait(10);
   }
 }
 
@@ -468,8 +561,6 @@
   tdsp.start(copy_to_lcd);
 
   test_dsp();
-  wait(5);
-  dsp.cls();
 
   tloop.start(loop);
   while(1);

mercurial