# HG changeset patch # User sl # Date 1400770010 -7200 # Node ID efa6ff02287c07aeba8c513ac11fb09f7b24e0dd # Parent 7d89d719583e297fe9047f11c00b2d12dc4e9dc5 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 diff -r 7d89d719583e -r efa6ff02287c inc/FutabaVfd.h --- a/inc/FutabaVfd.h Thu May 22 14:57:11 2014 +0200 +++ b/inc/FutabaVfd.h Thu May 22 16:46:50 2014 +0200 @@ -110,12 +110,6 @@ class GP1212A01A : public GP1212XXXX { public: - enum DW - { - DW1=12, - DW2=13 - }; - int Open(); //From FutabaGraphicVfd virtual int WidthInPixels(){return 256;}; @@ -130,11 +124,21 @@ void SetPixelBlock(int aX, int aY, int aHeight, int aSize, unsigned char aValue); void SetPixelBlock(int aX, int aY, int aHeight, int aSize, unsigned char* aPixels); // - void SetDisplayPosition(DW aDw,int aX, int aY); + void SetDisplayPosition(int aX, int aY); // void RequestId(); void RequestFirmwareRevision(); void RequestPowerSupplyStatus(); + +private: + enum DW + { + DW1=0xC0, + DW2=0xD0 + }; + + void SetDisplayPosition(DW aDw,int aX, int aY); + private: /// //FutabaVfdReport iReport; diff -r 7d89d719583e -r efa6ff02287c inc/MainWindow.h --- a/inc/MainWindow.h Thu May 22 14:57:11 2014 +0200 +++ b/inc/MainWindow.h Thu May 22 16:46:50 2014 +0200 @@ -78,10 +78,7 @@ // long onTimeout(FXObject *sender, FXSelector sel, void *ptr); long onMacTimeout(FXObject *sender, FXSelector sel, void *ptr); - // - void SetPixel(int aX, int aY, unsigned char aValue); - void SetPixelBlock(int aX, int aY, int aHeight, int aSize, unsigned char aValue); - + private: void SetConnectedStates(); bool IsConnected(); @@ -104,7 +101,7 @@ FXFont *title_font; //Futaba VFD control FXButton *iButtonClearDisplay; - FXButton *iButtonDimming; + FXButton *iButtonBrightness; FXButton *iButtonDisplayDataInput; FXButton *iButtonReadId; FXButton *iButtonReadFirmwareRevision; diff -r 7d89d719583e -r efa6ff02287c src/FutabaVfd.cpp --- a/src/FutabaVfd.cpp Thu May 22 14:57:11 2014 +0200 +++ b/src/FutabaVfd.cpp Thu May 22 16:46:50 2014 +0200 @@ -239,11 +239,21 @@ report[3]=0x5B; //Command ID report[4]=aDw; //Specify our DW report[5]=aX; //X coordinate of our DW top-left corner - report[5]=aY; //Y coordinate of our DW top-left corner + report[6]=aY; //Y coordinate of our DW top-left corner Write(report); } /** +Change our display position within our buffer. +*/ +void GP1212A01A::SetDisplayPosition(int aX, int aY) + { + //Specs apparently says both DW should remain the same + //Just don't ask + SetDisplayPosition(GP1212A01A::DW1,aX,aY); + SetDisplayPosition(GP1212A01A::DW2,aX,aY); + } +/** */ void GP1212A01A::RequestId() { diff -r 7d89d719583e -r efa6ff02287c src/test.cpp --- a/src/test.cpp Thu May 22 14:57:11 2014 +0200 +++ b/src/test.cpp Thu May 22 16:46:50 2014 +0200 @@ -43,6 +43,7 @@ FXMAPFUNC(SEL_COMMAND, MainWindow::ID_FUTABA_SET_PIXEL, MainWindow::onFutabaSetPixel ), FXMAPFUNC(SEL_COMMAND, MainWindow::ID_FUTABA_RESET_PIXEL, MainWindow::onFutabaResetPixel ), FXMAPFUNC(SEL_COMMAND, MainWindow::ID_FUTABA_SET_ALL_PIXELS, MainWindow::onFutabaSetAllPixels ), + FXMAPFUNC(SEL_COMMAND, MainWindow::ID_FUTABA_SET_DISPLAY_POSITION, MainWindow::onFutabaSetDisplayPosition ), FXMAPFUNC(SEL_COMMAND, MainWindow::ID_SELECT_FONT, MainWindow::onSelectFont ), FXMAPFUNC(SEL_TIMEOUT, MainWindow::ID_TIMER, MainWindow::onTimeout ), FXMAPFUNC(SEL_TIMEOUT, MainWindow::ID_MAC_TIMER, MainWindow::onMacTimeout ), @@ -106,7 +107,7 @@ gb = new FXGroupBox(vf, "Futaba GP1212A01A", FRAME_GROOVE|LAYOUT_FILL_X); matrix = new FXMatrix(gb, 3, MATRIX_BY_COLUMNS|LAYOUT_FILL_X); iButtonClearDisplay = new FXButton(matrix, "Clear Display", NULL, this, ID_FUTABA_CLEAR_DISPLAY, BUTTON_NORMAL|LAYOUT_FILL_X); - iButtonDimming = new FXButton(matrix, "Dimming", NULL, this, ID_FUTABA_DIMMING, BUTTON_NORMAL|LAYOUT_FILL_X); + iButtonBrightness = new FXButton(matrix, "Brightness", NULL, this, ID_FUTABA_DIMMING, BUTTON_NORMAL|LAYOUT_FILL_X); iButtonDisplayDataInput = new FXButton(matrix, "Display Data Input", NULL, this, ID_FUTABA_DISPLAY_DATA_INPUT, BUTTON_NORMAL|LAYOUT_FILL_X); iButtonReadId = new FXButton(matrix, "Read Id", NULL, this, ID_FUTABA_READ_ID, BUTTON_NORMAL|LAYOUT_FILL_X); iButtonReadFirmwareRevision = new FXButton(matrix, "Read Firmware Revision", NULL, this, ID_FUTABA_READ_FIRMWARE_REVISION, BUTTON_NORMAL|LAYOUT_FILL_X); @@ -120,7 +121,7 @@ iButtonResetPixel = new FXButton(matrix, "Reset Pixel", NULL, this, ID_FUTABA_RESET_PIXEL, BUTTON_NORMAL|LAYOUT_FILL_X); // iButtonSetAllPixels = new FXButton(matrix, "Set All Pixels", NULL, this, ID_FUTABA_SET_ALL_PIXELS, BUTTON_NORMAL|LAYOUT_FILL_X); - iButtonSetDisplayPosition = new FXButton(matrix, "Set Display Position", NULL, this, ID_FUTABA_SET_ALL_PIXELS, BUTTON_NORMAL|LAYOUT_FILL_X); + iButtonSetDisplayPosition = new FXButton(matrix, "Set Display Position", NULL, this, ID_FUTABA_SET_DISPLAY_POSITION, BUTTON_NORMAL|LAYOUT_FILL_X); // // Output Group Box @@ -187,8 +188,8 @@ //Try to connect to our VFD from start-up if (iVfd01.Open()) { - iVfd01.SetAllPixels(true); - iVfd01.Close(); + //iVfd01.SetAllPixels(true); + //iVfd01.Close(); SetConnectedStates(); } @@ -264,7 +265,9 @@ } else { - //TODO: Missing function on our HidDevice class + s += iVfd01.Vendor(); + s += iVfd01.Product(); + s += iVfd01.SerialNumber(); } connected_label->setText(s); output_button->enable(); @@ -278,7 +281,7 @@ { //Those widgets are specific to our VFD iButtonClearDisplay->enable(); - iButtonDimming->enable(); + iButtonBrightness->enable(); iButtonDisplayDataInput->enable(); iButtonReadId->enable(); iButtonReadFirmwareRevision->enable(); @@ -304,7 +307,7 @@ disconnect_button->disable(); iButtonClearDisplay->disable(); - iButtonDimming->disable(); + iButtonBrightness->disable(); iButtonDisplayDataInput->disable(); iButtonReadId->disable(); iButtonReadFirmwareRevision->disable(); @@ -541,41 +544,15 @@ long MainWindow::onFutabaClearDisplay(FXObject *sender, FXSelector sel, void *ptr) { - /* - memset(iOutputReportBuffer, 0x0, KFutabaMaxHidReportSize); - iOutputReportBuffer[0]=0x00; //Report ID - iOutputReportBuffer[1]=0x04; //Report length - iOutputReportBuffer[2]=0x1B; // - iOutputReportBuffer[3]=0x5B; // - iOutputReportBuffer[4]=0x32; // - iOutputReportBuffer[5]=0x4A; // - int res = hid_write(connected_device, iOutputReportBuffer, KFutabaMaxHidReportSize); - */ iVfd01.Clear(); - return 1; } long MainWindow::onFutabaDimming(FXObject *sender, FXSelector sel, void *ptr) { - /* - memset(iOutputReportBuffer, 0x0, KFutabaMaxHidReportSize); - iOutputReportBuffer[0]=0x00; //Report ID - iOutputReportBuffer[1]=0x06; //Report length - iOutputReportBuffer[2]=0x1B; // - iOutputReportBuffer[3]=0x5C; // - iOutputReportBuffer[4]=0x3F; // - iOutputReportBuffer[5]=0x4C; // - iOutputReportBuffer[6]=0x44; // - iDimming = (iDimming==0x35?0x30:++iDimming); - iOutputReportBuffer[7]=iDimming; - int res = hid_write(connected_device, iOutputReportBuffer, KFutabaMaxHidReportSize); - */ - iBrightness = (iBrightness==iVfd01.MaxBrightness()?iVfd01.MinBrightness():++iBrightness); iVfd01.SetBrightness(iBrightness); - return 1; } @@ -602,73 +579,6 @@ return 1; } - - - -/** -Set a single pixel to the specified value. -@param X coordinate of our pixel. -@param Y coordinate of our pixel. -@param The LSB defines our pixel value. -*/ -void MainWindow::SetPixel(int aX, int aY, unsigned char aValue) - { - //Just specify a one pixel block - SetPixelBlock(aX,aY,0x00,0x01,aValue); - } - -/** -Set the defined pixel block to the given value. -@param X coordinate of our pixel block starting point. -@param Y coordinate of our pixel block starting point. -@param The height of our pixel block. -@param The size of our pixel data. Number of pixels divided by 8. -@param The value set to 8 pixels. -*/ -void MainWindow::SetPixelBlock(int aX, int aY, int aHeight, int aSize, unsigned char aValue) - { - //Size must be 63 or below - memset(iOutputReportBuffer, 0x0, KFutabaMaxHidReportSize); - iOutputReportBuffer[0]=0x00; //Report ID - iOutputReportBuffer[1]=0x08+aSize; //Report length - iOutputReportBuffer[2]=0x1B; // - iOutputReportBuffer[3]=0x5B; // - iOutputReportBuffer[4]=0xF0; // - iOutputReportBuffer[5]=aX; //X - iOutputReportBuffer[6]=aY; //Y - 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. - iOutputReportBuffer[8]=0x00; //Size of pixel data in bytes (MSB) - iOutputReportBuffer[9]=aSize; //Size of pixel data in bytes (LSB) - memset(iOutputReportBuffer+10, aValue, KFutabaMaxHidReportSize); - //iOutputReportBuffer[10]=aValue; //Pixel data - int res = hid_write(connected_device, iOutputReportBuffer, KFutabaMaxHidReportSize); - } - -/** -Send an output report to a Futaba VFD device. -*/ -/* -void MainWindow::SendFutabaOutputReport(unsigned char* aReportData, unsigned char aSize) - { - // - memset(iOutputReportBuffer, 0x0, KFutabaMaxHidReportSize); - iOutputReportBuffer[0]=0x00; //Report ID is always null - iOutputReportBuffer[1]=0x08+aSize; //Report length - iOutputReportBuffer[2]=0x1B; // - iOutputReportBuffer[3]=0x5B; // - iOutputReportBuffer[4]=0xF0; // - iOutputReportBuffer[5]=aX; //X - iOutputReportBuffer[6]=aY; //Y - 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. - iOutputReportBuffer[8]=0x00; //Size of pixel data in bytes (MSB) - iOutputReportBuffer[9]=aSize; //Size of pixel data in bytes (LSB) - memset(iOutputReportBuffer+10, aValue, KFutabaMaxHidReportSize); - //iOutputReportBuffer[10]=aValue; //Pixel data - int res = hid_write(connected_device, iOutputReportBuffer, KFutabaMaxHidReportSize); - } -*/ - - /** */ long MainWindow::onFutabaSetPixel(FXObject *sender, FXSelector sel, void *ptr) @@ -698,29 +608,6 @@ long MainWindow::onFutabaSetAllPixels(FXObject *sender, FXSelector sel, void *ptr) { iVfd01.SetAllPixels(true); - - //One pixel at a time - /* - for (int i=0;i<256;i++) - { - for (int j=0;j<64;j++) - { - SetPixel(i,j,0x01); - } - } - */ - //16x16=256 pixels at a time goes much faster - /* - for (int i=0;i<256;i+=16) - { - for (int j=0;j<64;j+=16) - { - SetPixelBlock(i,j,15,32,0xFF); - //FXThread::sleep(1000000000); - } - } - */ - return 1; } @@ -734,9 +621,7 @@ int y=0; iTextFieldX->getText().scan("%d",&x); iTextFieldY->getText().scan("%d",&y); - //Set both positions for now until we understand how to use that stuff - iVfd01.SetDisplayPosition(GP1212A01A::DW1,x,y); - iVfd01.SetDisplayPosition(GP1212A01A::DW2,x,y); + iVfd01.SetDisplayPosition(x,y); return 1; } @@ -744,62 +629,21 @@ long MainWindow::onFutabaReadId(FXObject *sender, FXSelector sel, void *ptr) { - //1BH,5BH,63H,49H,44H - /* - memset(iOutputReportBuffer, 0x0, KFutabaMaxHidReportSize); - iOutputReportBuffer[0]=0x00; //Report ID - iOutputReportBuffer[1]=0x05; //Report length - iOutputReportBuffer[2]=0x1B; // - iOutputReportBuffer[3]=0x5B; // - iOutputReportBuffer[4]=0x63; // - iOutputReportBuffer[5]=0x49; // - iOutputReportBuffer[6]=0x44; // - int res = hid_write(connected_device, iOutputReportBuffer, KFutabaMaxHidReportSize); - */ - iVfd01.RequestId(); - return 1; } long MainWindow::onFutabaReadFirmwareRevision(FXObject *sender, FXSelector sel, void *ptr) { - //1BH,5BH,63H,46H,52H - /* - memset(iOutputReportBuffer, 0x0, KFutabaMaxHidReportSize); - iOutputReportBuffer[0]=0x00; //Report ID - iOutputReportBuffer[1]=0x05; //Report length - iOutputReportBuffer[2]=0x1B; // - iOutputReportBuffer[3]=0x5B; // - iOutputReportBuffer[4]=0x63; // - iOutputReportBuffer[5]=0x46; // - iOutputReportBuffer[6]=0x52; // - int res = hid_write(connected_device, iOutputReportBuffer, KFutabaMaxHidReportSize); - */ iVfd01.RequestFirmwareRevision(); - return 1; } long MainWindow::onFutabaPowerSupplyMonitor(FXObject *sender, FXSelector sel, void *ptr) { - //1BH,5BH,63H,50H,4DH - /* - memset(iOutputReportBuffer, 0x0, KFutabaMaxHidReportSize); - iOutputReportBuffer[0]=0x00; //Report ID - iOutputReportBuffer[1]=0x05; //Report length - iOutputReportBuffer[2]=0x1B; // - iOutputReportBuffer[3]=0x5B; // - iOutputReportBuffer[4]=0x63; // - iOutputReportBuffer[5]=0x50; // - iOutputReportBuffer[6]=0x4D; // - int res = hid_write(connected_device, iOutputReportBuffer, KFutabaMaxHidReportSize); - */ - iVfd01.RequestPowerSupplyStatus(); - return 1; }