Sorting out and testing our display position command.
authorsl
Thu, 22 May 2014 16:46:50 +0200
changeset 22efa6ff02287c
parent 21 7d89d719583e
child 23 d4e164906a1b
Sorting out and testing our display position command.
To avoid refresh artefact we will indeed need to use this feature.
It will go like that:
* Setup off screen buffer
* Swap frame buffer
inc/FutabaVfd.h
inc/MainWindow.h
src/FutabaVfd.cpp
src/test.cpp
     1.1 --- a/inc/FutabaVfd.h	Thu May 22 14:57:11 2014 +0200
     1.2 +++ b/inc/FutabaVfd.h	Thu May 22 16:46:50 2014 +0200
     1.3 @@ -110,12 +110,6 @@
     1.4  class GP1212A01A : public GP1212XXXX
     1.5  	{
     1.6  public:
     1.7 -    enum DW
     1.8 -    {
     1.9 -        DW1=12,
    1.10 -        DW2=13
    1.11 -    };
    1.12 -
    1.13  	int Open();
    1.14  	//From FutabaGraphicVfd
    1.15  	virtual int WidthInPixels(){return 256;};
    1.16 @@ -130,11 +124,21 @@
    1.17  	void SetPixelBlock(int aX, int aY, int aHeight, int aSize, unsigned char aValue);
    1.18      void SetPixelBlock(int aX, int aY, int aHeight, int aSize, unsigned char* aPixels);
    1.19      //
    1.20 -    void SetDisplayPosition(DW aDw,int aX, int aY);
    1.21 +	void SetDisplayPosition(int aX, int aY);
    1.22      //
    1.23      void RequestId();
    1.24      void RequestFirmwareRevision();
    1.25      void RequestPowerSupplyStatus();
    1.26 +
    1.27 +private:
    1.28 +	enum DW
    1.29 +		{
    1.30 +        DW1=0xC0,
    1.31 +        DW2=0xD0
    1.32 +		};
    1.33 +
    1.34 +	void SetDisplayPosition(DW aDw,int aX, int aY);
    1.35 +
    1.36  private:
    1.37  	///
    1.38  	//FutabaVfdReport iReport;
     2.1 --- a/inc/MainWindow.h	Thu May 22 14:57:11 2014 +0200
     2.2 +++ b/inc/MainWindow.h	Thu May 22 16:46:50 2014 +0200
     2.3 @@ -78,10 +78,7 @@
     2.4      //
     2.5      long onTimeout(FXObject *sender, FXSelector sel, void *ptr);
     2.6      long onMacTimeout(FXObject *sender, FXSelector sel, void *ptr);
     2.7 -    //
     2.8 -    void SetPixel(int aX, int aY, unsigned char aValue);
     2.9 -    void SetPixelBlock(int aX, int aY, int aHeight, int aSize, unsigned char aValue);
    2.10 -
    2.11 +    
    2.12  private:
    2.13      void SetConnectedStates();
    2.14      bool IsConnected();
    2.15 @@ -104,7 +101,7 @@
    2.16      FXFont *title_font;
    2.17      //Futaba VFD control
    2.18      FXButton *iButtonClearDisplay;
    2.19 -    FXButton *iButtonDimming;
    2.20 +    FXButton *iButtonBrightness;
    2.21      FXButton *iButtonDisplayDataInput;
    2.22      FXButton *iButtonReadId;
    2.23      FXButton *iButtonReadFirmwareRevision;
     3.1 --- a/src/FutabaVfd.cpp	Thu May 22 14:57:11 2014 +0200
     3.2 +++ b/src/FutabaVfd.cpp	Thu May 22 16:46:50 2014 +0200
     3.3 @@ -239,11 +239,21 @@
     3.4      report[3]=0x5B; //Command ID
     3.5      report[4]=aDw;  //Specify our DW
     3.6      report[5]=aX;   //X coordinate of our DW top-left corner
     3.7 -    report[5]=aY;   //Y coordinate of our DW top-left corner
     3.8 +    report[6]=aY;   //Y coordinate of our DW top-left corner
     3.9      Write(report);
    3.10      }
    3.11  
    3.12  /**
    3.13 +Change our display position within our buffer.
    3.14 +*/
    3.15 +void GP1212A01A::SetDisplayPosition(int aX, int aY)
    3.16 +	{
    3.17 +	//Specs apparently says both DW should remain the same
    3.18 +	//Just don't ask
    3.19 +    SetDisplayPosition(GP1212A01A::DW1,aX,aY);
    3.20 +    SetDisplayPosition(GP1212A01A::DW2,aX,aY);
    3.21 +	}
    3.22 +/**
    3.23  */
    3.24  void GP1212A01A::RequestId()
    3.25      {
     4.1 --- a/src/test.cpp	Thu May 22 14:57:11 2014 +0200
     4.2 +++ b/src/test.cpp	Thu May 22 16:46:50 2014 +0200
     4.3 @@ -43,6 +43,7 @@
     4.4      FXMAPFUNC(SEL_COMMAND, MainWindow::ID_FUTABA_SET_PIXEL, MainWindow::onFutabaSetPixel ),
     4.5  	FXMAPFUNC(SEL_COMMAND, MainWindow::ID_FUTABA_RESET_PIXEL, MainWindow::onFutabaResetPixel ),
     4.6      FXMAPFUNC(SEL_COMMAND, MainWindow::ID_FUTABA_SET_ALL_PIXELS, MainWindow::onFutabaSetAllPixels ),
     4.7 +	FXMAPFUNC(SEL_COMMAND, MainWindow::ID_FUTABA_SET_DISPLAY_POSITION, MainWindow::onFutabaSetDisplayPosition ),
     4.8      FXMAPFUNC(SEL_COMMAND, MainWindow::ID_SELECT_FONT, MainWindow::onSelectFont ),
     4.9  	FXMAPFUNC(SEL_TIMEOUT, MainWindow::ID_TIMER, MainWindow::onTimeout ),
    4.10  	FXMAPFUNC(SEL_TIMEOUT, MainWindow::ID_MAC_TIMER, MainWindow::onMacTimeout ),
    4.11 @@ -106,7 +107,7 @@
    4.12  	gb = new FXGroupBox(vf, "Futaba GP1212A01A", FRAME_GROOVE|LAYOUT_FILL_X);
    4.13  	matrix = new FXMatrix(gb, 3, MATRIX_BY_COLUMNS|LAYOUT_FILL_X);
    4.14  	iButtonClearDisplay = new FXButton(matrix, "Clear Display", NULL, this, ID_FUTABA_CLEAR_DISPLAY, BUTTON_NORMAL|LAYOUT_FILL_X);
    4.15 -	iButtonDimming = new FXButton(matrix, "Dimming", NULL, this, ID_FUTABA_DIMMING, BUTTON_NORMAL|LAYOUT_FILL_X);
    4.16 +	iButtonBrightness = new FXButton(matrix, "Brightness", NULL, this, ID_FUTABA_DIMMING, BUTTON_NORMAL|LAYOUT_FILL_X);
    4.17  	iButtonDisplayDataInput = new FXButton(matrix, "Display Data Input", NULL, this, ID_FUTABA_DISPLAY_DATA_INPUT, BUTTON_NORMAL|LAYOUT_FILL_X);
    4.18  	iButtonReadId = new FXButton(matrix, "Read Id", NULL, this, ID_FUTABA_READ_ID, BUTTON_NORMAL|LAYOUT_FILL_X);
    4.19  	iButtonReadFirmwareRevision =  new FXButton(matrix, "Read Firmware Revision", NULL, this, ID_FUTABA_READ_FIRMWARE_REVISION, BUTTON_NORMAL|LAYOUT_FILL_X);
    4.20 @@ -120,7 +121,7 @@
    4.21  	iButtonResetPixel = new FXButton(matrix, "Reset Pixel", NULL, this, ID_FUTABA_RESET_PIXEL, BUTTON_NORMAL|LAYOUT_FILL_X);
    4.22      //
    4.23      iButtonSetAllPixels = new FXButton(matrix, "Set All Pixels", NULL, this, ID_FUTABA_SET_ALL_PIXELS, BUTTON_NORMAL|LAYOUT_FILL_X);
    4.24 -    iButtonSetDisplayPosition = new FXButton(matrix, "Set Display Position", NULL, this, ID_FUTABA_SET_ALL_PIXELS, BUTTON_NORMAL|LAYOUT_FILL_X);
    4.25 +    iButtonSetDisplayPosition = new FXButton(matrix, "Set Display Position", NULL, this, ID_FUTABA_SET_DISPLAY_POSITION, BUTTON_NORMAL|LAYOUT_FILL_X);
    4.26      //
    4.27  
    4.28  	// Output Group Box
    4.29 @@ -187,8 +188,8 @@
    4.30  	//Try to connect to our VFD from start-up
    4.31  	if (iVfd01.Open())
    4.32          {
    4.33 -	    iVfd01.SetAllPixels(true);
    4.34 -	    iVfd01.Close();
    4.35 +	    //iVfd01.SetAllPixels(true);
    4.36 +	    //iVfd01.Close();
    4.37          SetConnectedStates();
    4.38          }
    4.39  
    4.40 @@ -264,7 +265,9 @@
    4.41              }
    4.42          else
    4.43              {
    4.44 -            //TODO: Missing function on our HidDevice class
    4.45 +            s += iVfd01.Vendor();
    4.46 +			s += iVfd01.Product();
    4.47 +			s += iVfd01.SerialNumber();
    4.48              }
    4.49          connected_label->setText(s);
    4.50          output_button->enable();
    4.51 @@ -278,7 +281,7 @@
    4.52              {
    4.53              //Those widgets are specific to our VFD
    4.54              iButtonClearDisplay->enable();
    4.55 -            iButtonDimming->enable();
    4.56 +            iButtonBrightness->enable();
    4.57              iButtonDisplayDataInput->enable();
    4.58              iButtonReadId->enable();
    4.59              iButtonReadFirmwareRevision->enable();
    4.60 @@ -304,7 +307,7 @@
    4.61          disconnect_button->disable();
    4.62  
    4.63          iButtonClearDisplay->disable();
    4.64 -        iButtonDimming->disable();
    4.65 +        iButtonBrightness->disable();
    4.66          iButtonDisplayDataInput->disable();
    4.67          iButtonReadId->disable();
    4.68          iButtonReadFirmwareRevision->disable();
    4.69 @@ -541,41 +544,15 @@
    4.70  long
    4.71  MainWindow::onFutabaClearDisplay(FXObject *sender, FXSelector sel, void *ptr)
    4.72  {
    4.73 -    /*
    4.74 -	memset(iOutputReportBuffer, 0x0, KFutabaMaxHidReportSize);
    4.75 -	iOutputReportBuffer[0]=0x00; //Report ID
    4.76 -	iOutputReportBuffer[1]=0x04; //Report length
    4.77 -	iOutputReportBuffer[2]=0x1B; //
    4.78 -	iOutputReportBuffer[3]=0x5B; //
    4.79 -	iOutputReportBuffer[4]=0x32; //
    4.80 -	iOutputReportBuffer[5]=0x4A; //
    4.81 -	int res = hid_write(connected_device, iOutputReportBuffer, KFutabaMaxHidReportSize);
    4.82 -    */
    4.83      iVfd01.Clear();
    4.84 -
    4.85  	return 1;
    4.86  }
    4.87  
    4.88  long
    4.89  MainWindow::onFutabaDimming(FXObject *sender, FXSelector sel, void *ptr)
    4.90  {
    4.91 -    /*
    4.92 -	memset(iOutputReportBuffer, 0x0, KFutabaMaxHidReportSize);
    4.93 -	iOutputReportBuffer[0]=0x00; //Report ID
    4.94 -	iOutputReportBuffer[1]=0x06; //Report length
    4.95 -	iOutputReportBuffer[2]=0x1B; //
    4.96 -	iOutputReportBuffer[3]=0x5C; //
    4.97 -	iOutputReportBuffer[4]=0x3F; //
    4.98 -	iOutputReportBuffer[5]=0x4C; //
    4.99 -	iOutputReportBuffer[6]=0x44; //
   4.100 -	iDimming = (iDimming==0x35?0x30:++iDimming);
   4.101 -	iOutputReportBuffer[7]=iDimming;
   4.102 -	int res = hid_write(connected_device, iOutputReportBuffer, KFutabaMaxHidReportSize);
   4.103 -    */
   4.104 -
   4.105      iBrightness = (iBrightness==iVfd01.MaxBrightness()?iVfd01.MinBrightness():++iBrightness);
   4.106      iVfd01.SetBrightness(iBrightness);
   4.107 -
   4.108  	return 1;
   4.109  }
   4.110  
   4.111 @@ -602,73 +579,6 @@
   4.112  	return 1;
   4.113  }
   4.114  
   4.115 -
   4.116 -
   4.117 -
   4.118 -/**
   4.119 -Set a single pixel to the specified value.
   4.120 -@param X coordinate of our pixel.
   4.121 -@param Y coordinate of our pixel.
   4.122 -@param The LSB defines our pixel value.
   4.123 -*/
   4.124 -void MainWindow::SetPixel(int aX, int aY, unsigned char aValue)
   4.125 -	{
   4.126 -	//Just specify a one pixel block
   4.127 -	SetPixelBlock(aX,aY,0x00,0x01,aValue);
   4.128 -	}
   4.129 -
   4.130 -/**
   4.131 -Set the defined pixel block to the given value.
   4.132 -@param X coordinate of our pixel block starting point.
   4.133 -@param Y coordinate of our pixel block starting point.
   4.134 -@param The height of our pixel block.
   4.135 -@param The size of our pixel data. Number of pixels divided by 8.
   4.136 -@param The value set to 8 pixels.
   4.137 -*/
   4.138 -void MainWindow::SetPixelBlock(int aX, int aY, int aHeight, int aSize, unsigned char aValue)
   4.139 -	{
   4.140 -	//Size must be 63 or below
   4.141 -	memset(iOutputReportBuffer, 0x0, KFutabaMaxHidReportSize);
   4.142 -	iOutputReportBuffer[0]=0x00; //Report ID
   4.143 -	iOutputReportBuffer[1]=0x08+aSize; //Report length
   4.144 -	iOutputReportBuffer[2]=0x1B; //
   4.145 -	iOutputReportBuffer[3]=0x5B; //
   4.146 -	iOutputReportBuffer[4]=0xF0; //
   4.147 -	iOutputReportBuffer[5]=aX; //X
   4.148 -	iOutputReportBuffer[6]=aY; //Y
   4.149 -	iOutputReportBuffer[7]=aHeight; //Y length before return. Though outside the specs, setting this to zero apparently allows us to modify a single pixel without touching any other.
   4.150 -	iOutputReportBuffer[8]=0x00; //Size of pixel data in bytes (MSB)
   4.151 -	iOutputReportBuffer[9]=aSize; //Size of pixel data in bytes (LSB)
   4.152 -	memset(iOutputReportBuffer+10, aValue, KFutabaMaxHidReportSize);
   4.153 -	//iOutputReportBuffer[10]=aValue; //Pixel data
   4.154 -	int res = hid_write(connected_device, iOutputReportBuffer, KFutabaMaxHidReportSize);
   4.155 -	}
   4.156 -
   4.157 -/**
   4.158 -Send an output report to a Futaba VFD device.
   4.159 -*/
   4.160 -/*
   4.161 -void MainWindow::SendFutabaOutputReport(unsigned char* aReportData, unsigned char aSize)
   4.162 -    {
   4.163 -    //
   4.164 -    memset(iOutputReportBuffer, 0x0, KFutabaMaxHidReportSize);
   4.165 -    iOutputReportBuffer[0]=0x00; //Report ID is always null
   4.166 -    iOutputReportBuffer[1]=0x08+aSize; //Report length
   4.167 -    iOutputReportBuffer[2]=0x1B; //
   4.168 -    iOutputReportBuffer[3]=0x5B; //
   4.169 -    iOutputReportBuffer[4]=0xF0; //
   4.170 -    iOutputReportBuffer[5]=aX; //X
   4.171 -    iOutputReportBuffer[6]=aY; //Y
   4.172 -    iOutputReportBuffer[7]=aHeight; //Y length before return. Though outside the specs, setting this to zero apparently allows us to modify a single pixel without touching any other.
   4.173 -    iOutputReportBuffer[8]=0x00; //Size of pixel data in bytes (MSB)
   4.174 -    iOutputReportBuffer[9]=aSize; //Size of pixel data in bytes (LSB)
   4.175 -    memset(iOutputReportBuffer+10, aValue, KFutabaMaxHidReportSize);
   4.176 -    //iOutputReportBuffer[10]=aValue; //Pixel data
   4.177 -    int res = hid_write(connected_device, iOutputReportBuffer, KFutabaMaxHidReportSize);
   4.178 -    }
   4.179 -*/
   4.180 -
   4.181 -
   4.182  /**
   4.183  */
   4.184  long MainWindow::onFutabaSetPixel(FXObject *sender, FXSelector sel, void *ptr)
   4.185 @@ -698,29 +608,6 @@
   4.186  long MainWindow::onFutabaSetAllPixels(FXObject *sender, FXSelector sel, void *ptr)
   4.187  	{
   4.188      iVfd01.SetAllPixels(true);
   4.189 -
   4.190 -	//One pixel at a time
   4.191 -	/*
   4.192 -	for (int i=0;i<256;i++)
   4.193 -		{
   4.194 -		for (int j=0;j<64;j++)
   4.195 -			{
   4.196 -			SetPixel(i,j,0x01);
   4.197 -			}
   4.198 -		}
   4.199 -	*/
   4.200 -	//16x16=256 pixels at a time goes much faster
   4.201 -    /*
   4.202 -	for (int i=0;i<256;i+=16)
   4.203 -		{
   4.204 -		for (int j=0;j<64;j+=16)
   4.205 -			{
   4.206 -			SetPixelBlock(i,j,15,32,0xFF);
   4.207 -			//FXThread::sleep(1000000000);
   4.208 -			}
   4.209 -		}
   4.210 -    */
   4.211 -
   4.212      return 1;
   4.213  	}
   4.214  
   4.215 @@ -734,9 +621,7 @@
   4.216      int y=0;
   4.217      iTextFieldX->getText().scan("%d",&x);
   4.218      iTextFieldY->getText().scan("%d",&y);
   4.219 -    //Set both positions for now until we understand how to use that stuff
   4.220 -    iVfd01.SetDisplayPosition(GP1212A01A::DW1,x,y);
   4.221 -    iVfd01.SetDisplayPosition(GP1212A01A::DW2,x,y);
   4.222 +    iVfd01.SetDisplayPosition(x,y);
   4.223      return 1;
   4.224      }
   4.225  
   4.226 @@ -744,62 +629,21 @@
   4.227  long
   4.228  MainWindow::onFutabaReadId(FXObject *sender, FXSelector sel, void *ptr)
   4.229  {
   4.230 -	//1BH,5BH,63H,49H,44H
   4.231 -    /*
   4.232 -	memset(iOutputReportBuffer, 0x0, KFutabaMaxHidReportSize);
   4.233 -	iOutputReportBuffer[0]=0x00; //Report ID
   4.234 -	iOutputReportBuffer[1]=0x05; //Report length
   4.235 -	iOutputReportBuffer[2]=0x1B; //
   4.236 -	iOutputReportBuffer[3]=0x5B; //
   4.237 -	iOutputReportBuffer[4]=0x63; //
   4.238 -	iOutputReportBuffer[5]=0x49; //
   4.239 -	iOutputReportBuffer[6]=0x44; //
   4.240 -	int res = hid_write(connected_device, iOutputReportBuffer, KFutabaMaxHidReportSize);
   4.241 -    */
   4.242 -
   4.243      iVfd01.RequestId();
   4.244 -
   4.245  	return 1;
   4.246  }
   4.247  
   4.248  long
   4.249  MainWindow::onFutabaReadFirmwareRevision(FXObject *sender, FXSelector sel, void *ptr)
   4.250  {
   4.251 -	//1BH,5BH,63H,46H,52H
   4.252 -    /*
   4.253 -	memset(iOutputReportBuffer, 0x0, KFutabaMaxHidReportSize);
   4.254 -	iOutputReportBuffer[0]=0x00; //Report ID
   4.255 -	iOutputReportBuffer[1]=0x05; //Report length
   4.256 -	iOutputReportBuffer[2]=0x1B; //
   4.257 -	iOutputReportBuffer[3]=0x5B; //
   4.258 -	iOutputReportBuffer[4]=0x63; //
   4.259 -	iOutputReportBuffer[5]=0x46; //
   4.260 -	iOutputReportBuffer[6]=0x52; //
   4.261 -	int res = hid_write(connected_device, iOutputReportBuffer, KFutabaMaxHidReportSize);
   4.262 -    */
   4.263      iVfd01.RequestFirmwareRevision();
   4.264 -
   4.265  	return 1;
   4.266  }
   4.267  
   4.268  long
   4.269  MainWindow::onFutabaPowerSupplyMonitor(FXObject *sender, FXSelector sel, void *ptr)
   4.270  {
   4.271 -	//1BH,5BH,63H,50H,4DH
   4.272 -    /*
   4.273 -	memset(iOutputReportBuffer, 0x0, KFutabaMaxHidReportSize);
   4.274 -	iOutputReportBuffer[0]=0x00; //Report ID
   4.275 -	iOutputReportBuffer[1]=0x05; //Report length
   4.276 -	iOutputReportBuffer[2]=0x1B; //
   4.277 -	iOutputReportBuffer[3]=0x5B; //
   4.278 -	iOutputReportBuffer[4]=0x63; //
   4.279 -	iOutputReportBuffer[5]=0x50; //
   4.280 -	iOutputReportBuffer[6]=0x4D; //
   4.281 -	int res = hid_write(connected_device, iOutputReportBuffer, KFutabaMaxHidReportSize);
   4.282 -    */
   4.283 -
   4.284      iVfd01.RequestPowerSupplyStatus();
   4.285 -
   4.286  	return 1;
   4.287  }
   4.288