# HG changeset patch # User sl # Date 1409499730 -7200 # Node ID 105f2c0d3cf19edd8fe51c6e6190362ba0bf78be # Parent 86faea78ddf0a233c0a91cd85c0be3589f01c9f3 GP1212A02: Implementing DataMemory frame cycle experiment, no frame rate improvement. Adding support for firmware revision query. diff -r 86faea78ddf0 -r 105f2c0d3cf1 Display.h --- a/Display.h Sat Aug 30 18:43:54 2014 +0200 +++ b/Display.h Sun Aug 31 17:42:10 2014 +0200 @@ -5,12 +5,13 @@ #ifndef DISPLAY_H #define DISPLAY_H +#include "HidDevice.h" const int KMaxDisplayStringLength = 256; /** Define an interface to some basic display functionality */ -class DisplayBase +class DisplayBase: public HidDevice { public: DisplayBase():iRequest(EMiniDisplayRequestNone),iPowerOn(false) diff -r 86faea78ddf0 -r 105f2c0d3cf1 FutabaGP1212A02.cpp --- a/FutabaGP1212A02.cpp Sat Aug 30 18:43:54 2014 +0200 +++ b/FutabaGP1212A02.cpp Sun Aug 31 17:42:10 2014 +0200 @@ -7,6 +7,9 @@ const int KNumberOfFrameBeforeDiffAlgo = 3; +const unsigned short KMaxDataMemoryAddress = 0x4FFF; +const unsigned short KFrameSizeInBytes = 0x800; + // // class GP1212A02A // @@ -87,6 +90,7 @@ //Select current BMP box BmpBoxSelect(EBmpBoxIdOne); + iNextFrameAddress = 0x0000; } return success; @@ -410,12 +414,20 @@ if (OffScreenMode()) { //Send pixel directly into BMP box - BmpBoxDataInput(FrameBufferSizeInBytes(),iFrameNext->Ptr()); + //BmpBoxDataInput(FrameBufferSizeInBytes(),iFrameNext->Ptr()); //Send pixel data directly into the display window //BmpDataInput(ETargetDisplayWindow,0x0000,EDirectionY, FrameBufferSizeInBytes(),iFrameNext->Ptr()); //Send pixel data first to Data Memory then copy into the selected BMP box //BmpDataInput(ETargetDataMemory,0x0000,EDirectionY, FrameBufferSizeInBytes(),iFrameNext->Ptr()); //BmpBoxDataMemoryTransfer(0x0000); + //Send pixel data first to Data Memory then copy into the selected BMP box, cycling through our Data Memory frmae + BmpDataInput(ETargetDataMemory,iNextFrameAddress,EDirectionY, FrameBufferSizeInBytes(),iFrameNext->Ptr()); + BmpBoxDataMemoryTransfer(iNextFrameAddress); + iNextFrameAddress+=KFrameSizeInBytes; + if (iNextFrameAddress>KMaxDataMemoryAddress) + { + iNextFrameAddress=0x0000; + } //Cycle through our frame buffers //We keep track of previous frame which is in fact our device back buffer. @@ -456,6 +468,28 @@ /** */ +void GP1212A02A::Request(TMiniDisplayRequest aRequest) + { + switch (aRequest) + { + case EMiniDisplayRequestDeviceId: + RequestDeviceId(); + break; + case EMiniDisplayRequestFirmwareRevision: + RequestFirmwareRevision(); + break; + case EMiniDisplayRequestPowerSupplyStatus: + RequestPowerSupplyStatus(); + break; + default: + //Not supported + break; + }; + } + + +/** +*/ void GP1212A02A::ResetBuffers() { //iNextFrame->ClearAll(); @@ -471,10 +505,32 @@ } /** +ID code +[Code] 1BH,6AH,49H,44H +[Function] Send the ID code to the Host system. ID code is software version. */ void GP1212A02A::RequestFirmwareRevision() { - //Not supported + if (RequestPending()) + { + //Abort silently for now + return; + } + + //1BH,6AH,49H,44H + //Send Software Revision Read Command + FutabaVfdReport report; + report[0]=0x00; //Report ID + report[1]=0x04; //Report length + report[2]=0x1B; //Command ID + report[3]=0x6A; //Command ID + report[4]=0x49; //Command ID + report[5]=0x44; //Command ID + if (Write(report)==report.Size()) + { + SetRequest(EMiniDisplayRequestFirmwareRevision); + } + } /** @@ -520,8 +576,31 @@ */ TMiniDisplayRequest GP1212A02A::AttemptRequestCompletion() { - //That display does not support any requests - return EMiniDisplayRequestNone; + if (!RequestPending()) + { + return EMiniDisplayRequestNone; + } + + int res=Read(iInputReport); + + if (!res) + { + return EMiniDisplayRequestNone; + } + + //Process our request + if (CurrentRequest()==EMiniDisplayRequestFirmwareRevision) + { + unsigned char* ptr=&iInputReport[2]; + iInputReport[7]=0x00; + strcpy(iFirmwareRevision,(const char*)ptr); + } + + TMiniDisplayRequest completed=CurrentRequest(); + //Our request was completed + SetRequest(EMiniDisplayRequestNone); + + return completed; } diff -r 86faea78ddf0 -r 105f2c0d3cf1 FutabaGP1212A02.h --- a/FutabaGP1212A02.h Sat Aug 30 18:43:54 2014 +0200 +++ b/FutabaGP1212A02.h Sun Aug 31 17:42:10 2014 +0200 @@ -30,18 +30,13 @@ virtual void SetPixel(unsigned char aX, unsigned char aY, bool aOn); virtual void SetAllPixels(unsigned char aPattern); virtual int FrameBufferSizeInBytes() const {return KGP12xFrameBufferSizeInBytes;} - //virtual void BitBlit(const BitArray& aBitmap, int aSrcWidth, int aSrcHeight, int aTargetX, int aTargetY) const; virtual void SetBrightness(int aBrightness); virtual void Clear(); virtual void Fill(); + virtual void Request(TMiniDisplayRequest aRequest); - //Specific to GP1212A02A - - // - void RequestDeviceId(); - void RequestFirmwareRevision(); - void RequestPowerSupplyStatus(); + // void ToggleOffScreenMode(); void SetOffScreenMode(bool aOn); @@ -70,7 +65,6 @@ ETargetDataMemory=0x31 }; - enum TDirection { EDirectionY=0x30, @@ -78,6 +72,8 @@ }; +private: + //Specific to GP1212A02A //General setting command void BmpDataInput(TTarget aTarget, unsigned short aAddress, TDirection aDirection, unsigned short aSize, unsigned char* aPixels); @@ -88,6 +84,12 @@ void BmpBoxDataInput(unsigned short aSize, unsigned char* aPixels); private: + void RequestDeviceId(); + void RequestFirmwareRevision(); + void RequestPowerSupplyStatus(); + + +private: unsigned char OffScreenY() const; void SendClearCommand(); void OffScreenTranslation(unsigned char& aX, unsigned char& aY); @@ -122,6 +124,8 @@ char iDeviceId[KFutabaMaxHidReportSize]; char iFirmwareRevision[KFutabaMaxHidReportSize]; bool iPowerOn; + // + unsigned short iNextFrameAddress; }; diff -r 86faea78ddf0 -r 105f2c0d3cf1 FutabaVfd.h --- a/FutabaVfd.h Sat Aug 30 18:43:54 2014 +0200 +++ b/FutabaVfd.h Sun Aug 31 17:42:10 2014 +0200 @@ -6,7 +6,6 @@ #define FUTABA_VFD_H #include "hidapi.h" -#include "HidDevice.h" #include "BitArray.h" #include "MiniDisplay.h" #include "Display.h" @@ -71,7 +70,7 @@ /** */ -class FutabaGraphicDisplay : public GraphicDisplay, public HidDevice +class FutabaGraphicDisplay : public GraphicDisplay { public: //From DisplayBase diff -r 86faea78ddf0 -r 105f2c0d3cf1 MiniDisplay.cpp --- a/MiniDisplay.cpp Sat Aug 30 18:43:54 2014 +0200 +++ b/MiniDisplay.cpp Sun Aug 31 17:42:10 2014 +0200 @@ -141,19 +141,19 @@ //------------------------------------------------------------- wchar_t* MiniDisplayVendor(MiniDisplayDevice aDevice) { - return ((GP1212A01A*)aDevice)->Vendor(); + return ((GraphicDisplay*)aDevice)->Vendor(); } //------------------------------------------------------------- wchar_t* MiniDisplayProduct(MiniDisplayDevice aDevice) { - return ((GP1212A01A*)aDevice)->Product(); + return ((GraphicDisplay*)aDevice)->Product(); } //------------------------------------------------------------- wchar_t* MiniDisplaySerialNumber(MiniDisplayDevice aDevice) { - return ((GP1212A01A*)aDevice)->SerialNumber(); + return ((GraphicDisplay*)aDevice)->SerialNumber(); } //------------------------------------------------------------- @@ -177,7 +177,7 @@ //------------------------------------------------------------- void MiniDisplayCancelRequest(MiniDisplayDevice aDevice) { - ((GP1212A01A*)aDevice)->CancelRequest(); + ((GraphicDisplay*)aDevice)->CancelRequest(); } //-------------------------------------------------------------