GP1212A02: Adding select font size command.
5 #include "FutabaGP1212A02.h"
10 const unsigned short KMaxDataMemoryAddress = 0x4FFF;
11 const unsigned short KFrameSizeInBytes = 0x800;
14 void sleep(unsigned int mseconds)
16 clock_t goal = mseconds + clock();
17 while (goal > clock());
24 GP1212A02A::GP1212A02A():
25 iDisplayPositionX(0),iDisplayPositionY(0),
27 iUseFrameDifferencing(true),
34 iNeedFullFrameUpdate(0),
38 iFirmwareRevision[0]=0;
44 GP1212A02A::~GP1212A02A()
59 iNeedFullFrameUpdate=0;
64 int GP1212A02A::Open()
66 int success = HidDevice::Open(KFutabaVendorId,KFutabaProductIdGP1212A02A,NULL);
69 //Allocate both frames
72 iFrameAlpha=new BitArrayLow(KGP12xFrameBufferPixelCount);
76 iFrameBeta=new BitArrayLow(KGP12xFrameBufferPixelCount);
80 iFrameGamma=new BitArrayLow(KGP12xFrameBufferPixelCount);
82 iFrameNext=iFrameAlpha;
83 iFrameCurrent=iFrameBeta;
84 iFramePrevious=iFrameGamma;
87 //To make sure it is synced properly
88 iNeedFullFrameUpdate=0;
96 //BMP box setup could be removed if we don't use it anymore
98 BmpBoxSetting(EBmpBoxIdOne,0x0000,256,64);
99 //Select current BMP box
100 BmpBoxSelect(EBmpBoxIdOne);
102 iNextFrameAddress = 0x0000;
106 SendCommandFontAction(EFontDelete);
108 //SendCommandSelectFontSize(EFontLarge);
109 //SendCommandReset();
113 unsigned char charPixels[]={ 0xFF,0xFF,0xFF,0xFF,
128 0xFF,0xFF,0xFF,0xFF};
131 //SendCommandFontAction(EFontStore);
132 for (unsigned short i=0;i<16;i++)
134 //SendCommandFontAction(EFontDelete);
136 SendCommandDefineCharacter(EFont16x32,0x0030+i,charPixels);
137 //SendCommandFontAction(EFontStore);
143 //SendCommandFontAction(EFontTransfer);
146 //SendCommandDefineCharacter(EFont16x32,0x0031,charPixels);
147 //SendCommandFontAction(EFontStore);
160 [Code] 1BH,5CH,42H,Pn,aL,aH,Pw,Ph
161 [Function] Setting the BMP box. BMP box can be defined the 3 area to DW. The position of BMP
162 box is set based on the address of DW.
163 * To write data in BMP box, BMP box select is necessary.
164 * Specifiable horizontal size is 256dot (100H) MAX. If horizontal size specify 256dot, Pw = 00H
165 Pn = Number of a BMP box
166 aL = Lower byte of address
167 aH = Upper byte of address
175 0000H <= aL + aH * 100 <= 07FFH
176 01H <= Pw <= 00H (=100H)
179 void GP1212A02A::BmpBoxSetting(TBmpBoxId aBoxId, unsigned short aAddress, int aWidth, int aHeight)
181 //TODO: check parameters validity
182 //1BH,5CH,42H,Pn,aL,aH,Pw,Ph
183 FutabaVfdReport report;
184 report[0]=0x00; //Report ID
185 report[1]=0x08; //Report length.
186 report[2]=0x1B; //Command ID
187 report[3]=0x5C; //Command ID
188 report[4]=0x42; //Command ID
190 report[6]=(unsigned char)aAddress; //aL = DM lower byte
191 report[7]=aAddress>>8; //aH = DM upper byte
192 report[8]=(aWidth==256?0x00:aWidth); //Pw = BMP box width 00==256
193 report[9]=aHeight/8; //Ph = BMP box height.
199 [Function]Select of BMP box
200 * Execution "BMP box select" is necessary before "Setting the Text box".
201 * In case of writing by the specified dot writing, it is necessary to cancel this command.
203 Pn = 30H - Remove the BMP box
208 void GP1212A02A::BmpBoxSelect(TBmpBoxId aBoxId)
210 //TODO: check parameters validity
211 FutabaVfdReport report;
212 report[0]=0x00; //Report ID
213 report[1]=0x04; //Report length.
214 report[2]=0x1B; //Command ID
215 report[3]=0x5C; //Command ID
216 report[4]=0x48; //Command ID
217 report[5]=aBoxId; //BMP box ID
224 void GP1212A02A::SetPixel(unsigned char aX, unsigned char aY, bool aOn)
227 //int byteOffset=(aX*HeightInPixels()+aY)/8;
228 //int bitOffset=(aX*HeightInPixels()+aY)%8;
229 //iNextFrame[byteOffset] |= ( (aOn?0x01:0x00) << bitOffset );
235 iFrameNext->SetBit(aX*HeightInPixels()+aY);
239 iFrameNext->ClearBit(aX*HeightInPixels()+aY);
244 //Just specify a one pixel block
252 void GP1212A02A::BitBlit(const BitArray& aBitmap, int aSrcWidth, int aSrcHeight, int aTargetX, int aTargetY) const
254 //TODO: amend loop values so that we don't keep on looping past our frame buffer dimensions.
255 for (int i=0;i<aSrcWidth;i++)
257 for (int j=0;j<aSrcHeight;j++)
259 iFrameNext->SetBitValue((aTargetX+i)*HeightInPixels()+aTargetY+j,aBitmap[+i*aSrcHeight+j]);
266 Clear our client side back buffer.
267 Call to SwapBuffers must follow to actually clear the display.
269 void GP1212A02A::Clear()
271 //memset(iNextFrame->Ptr(),0x00,FrameBufferSizeInBytes());
274 iFrameNext->ClearAll();
284 Must be followed by a SwapBuffers call.
286 void GP1212A02A::Fill()
292 Set all pixels on our screen to the desired value.
293 This operation is performed off screen to avoid tearing.
294 @param 8 pixels pattern
296 void GP1212A02A::SetAllPixels(unsigned char aPattern)
298 //With a single buffer
299 //unsigned char screen[2048]; //One screen worth of pixels
300 //memset(screen,0xFF,sizeof(screen));
301 //SetPixelBlock(0,0,63,sizeof(screen),screen);
306 memset(iFrameNext->Ptr(),aPattern,FrameBufferSizeInBytes());
310 //Using pattern SetPixelBlock variant.
321 [Code] 1BH,4AH,Pm,aL,aH,Ps,nL,nH,Pd...Pd
322 [Function] The BMP data is written in the DW(Display Window) or the Data memory.
323 Pm= DW or Data memory
326 Ps = Direction of writing
327 nL = number of BMP data length lower byte
328 nH = number of BMP data length upper byte
330 * If X direction is selected as Ps and data is written in the last address, the data in the last address is
331 overwritten with the remaining data.
332 [Definable area] Pm = 30H : DW
333 Pm = 31H: Data memory
334 0000H <= aL + aH * 100 <= 07FFH (DW)
335 0000H <= aL + aH * 100 <= 4FFFH (Data memory)
336 Ps = 30H: Y direction
337 Ps = 31H: X direction
338 0001H <= nL + nH * 100 <= 0100H(DW: X direction)
339 0001H <= nL + nH * 100 <= 0800H(DW: Y direction)
340 0001H <= nL + nH * 100 <= 0A00H(Data memory: X direction)
341 0001H <= nL + nH * 100 <= 5000H(Data memory: Y direction)
343 void GP1212A02A::BmpDataInput(TTarget aTarget, unsigned short aAddress, TDirection aDirection, unsigned short aSize, unsigned char* aPixels)
345 FutabaVfdReport report;
346 report[0]=0x00; //Report ID
347 report[1]=(aSize<=report.Size()-10?aSize+0x08:64); //Report length. -10 is for our header first 10 bytes. +8 is for our Futaba header size
348 report[2]=0x1B; //Command ID
349 report[3]=0x4A; //Command ID
350 report[4]=aTarget; //Display Window or Data Memory
351 report[5]=(unsigned char)aAddress; //aL = DW lower byte
352 report[6]=aAddress>>8; //aH = DW upper byte
353 report[7]=aDirection; //Direction of writing: Y or X
354 report[8]=(unsigned char)aSize; //Size of pixel data in bytes (LSB)
355 report[9]=aSize>>8; //Size of pixel data in bytes (MSB)
356 int sizeWritten=MIN(aSize,report.Size()-10);
357 memcpy(report.Buffer()+10, aPixels, sizeWritten);
360 int remainingSize=aSize;
361 //We need to keep on sending our pixel data until we are done
362 while (report[1]==64)
365 remainingSize-=sizeWritten;
366 report[0]=0x00; //Report ID
367 report[1]=(remainingSize<=report.Size()-2?remainingSize:64); //Report length, should be 64 or the remaining size
368 sizeWritten=(report[1]==64?63:report[1]);
369 memcpy(report.Buffer()+2, aPixels+(aSize-remainingSize), sizeWritten);
377 [Code] 1BH,5CH,44H,aL,aH
378 [Function] BMP data transfer from Data memory to DW.
379 Although source data is updated, data in BMP box is not updated. To reflect the update,
380 re-executing this command is necessary.
381 aL = Lower byte of address
382 aH = Upper byte of address
384 0000H <= aL + aH * 100 <= 4FFFH
386 void GP1212A02A::BmpBoxDataMemoryTransfer(unsigned short aAddress)
388 FutabaVfdReport report;
389 report[0]=0x00; //Report ID
390 report[1]=0x05; //Report length.
391 report[2]=0x1B; //Command ID
392 report[3]=0x5C; //Command ID
393 report[4]=0x44; //Command ID
394 report[5]=(unsigned char)aAddress; //aL = DM lower byte
395 report[6]=aAddress>>8; //aH = DM upper byte
400 Input BMP data in the BMP box
401 [Code] 1BH,5CH,5DH,nL,nH,Pd...Pd
402 [Function] BMP data is written the BMP box
403 * Number of definable data is due to BMP box size. If the data is over range, the over range data is
404 rewritten the final address.
405 nL = Lower byte of number of definition byte
406 nH = Upper byte of number of definition byte
408 [Definable area] Pn : BMP box size (Pw * Ph)
410 void GP1212A02A::BmpBoxDataInput(unsigned short aSize, unsigned char* aPixels)
412 FutabaVfdReport report;
413 report[0]=0x00; //Report ID
414 report[1]=(aSize<=report.Size()-7?aSize+0x05:64); //Report length. -7 is for our header first 10 bytes. +5 is for our Futaba header size
415 report[2]=0x1B; //Command ID
416 report[3]=0x5C; //Command ID
417 report[4]=0x5D; //Display Window or Data Memory
418 report[5]=(unsigned char)aSize; //Size of pixel data in bytes (LSB)
419 report[6]=aSize>>8; //Size of pixel data in bytes (MSB)
420 int sizeWritten=MIN(aSize,report.Size()-7);
421 memcpy(report.Buffer()+7, aPixels, sizeWritten);
424 int remainingSize=aSize;
425 //We need to keep on sending our pixel data until we are done
426 while (report[1]==64)
429 remainingSize-=sizeWritten;
430 report[0]=0x00; //Report ID
431 report[1]=(remainingSize<=report.Size()-2?remainingSize:64); //Report length, should be 64 or the remaining size
432 sizeWritten=(report[1]==64?63:report[1]);
433 memcpy(report.Buffer()+2, aPixels+(aSize-remainingSize), sizeWritten);
439 Using this function is advised against as is causes tearing.
442 void GP1212A02A::SendCommandClear()
445 //Send Clear Display Command
446 FutabaVfdReport report;
447 report[0]=0x00; //Report ID
448 report[1]=0x04; //Report length
449 report[2]=0x1B; //Command ID
450 report[3]=0x4A; //Command ID
451 report[4]=0x43; //Command ID
452 report[5]=0x44; //Command ID
458 Returns to default setting.
459 * The other command is not receive until this command complete. Please don’t send the any data
460 from a host during “BUSY”
461 * Delete the User definable font to the RAM.
462 * If the VFD Power Off, VFD Power turn ON after the RESET command.
464 void GP1212A02A::SendCommandReset()
467 //Send Clear Display Command
468 FutabaVfdReport report;
469 report[0]=0x00; //Report ID
470 report[1]=0x04; //Report length
471 report[2]=0x1B; //Command ID
472 report[3]=0x4A; //Command ID
473 report[4]=0x52; //Command ID
474 report[5]=0x53; //Command ID
476 //Wait until reset is done. Is that needed?
483 Provide Y coordinate of our off screen buffer.
485 unsigned char GP1212A02A::OffScreenY() const
487 //Overflowing is fine this is just what we want
488 return iDisplayPositionY+HeightInPixels();
492 Put our off screen buffer on screen.
493 On screen buffer goes off screen.
495 void GP1212A02A::SwapBuffers()
497 //Only perform buffer swapping if off screen mode is enabled
500 //Send pixel directly into BMP box
501 //BmpBoxDataInput(FrameBufferSizeInBytes(),iFrameNext->Ptr());
502 //Send pixel data directly into the display window
503 //BmpDataInput(ETargetDisplayWindow,0x0000,EDirectionY, FrameBufferSizeInBytes(),iFrameNext->Ptr());
504 //Send pixel data first to Data Memory then copy into the selected BMP box
505 //BmpDataInput(ETargetDataMemory,0x0000,EDirectionY, FrameBufferSizeInBytes(),iFrameNext->Ptr());
506 //BmpBoxDataMemoryTransfer(0x0000);
507 //Send pixel data first to Data Memory then copy into the selected BMP box, cycling through our Data Memory frmae
508 BmpDataInput(ETargetDataMemory,iNextFrameAddress,EDirectionY, FrameBufferSizeInBytes(),iFrameNext->Ptr());
509 BmpBoxDataMemoryTransfer(iNextFrameAddress);
510 iNextFrameAddress+=KFrameSizeInBytes;
511 if (iNextFrameAddress>KMaxDataMemoryAddress)
513 iNextFrameAddress=0x0000;
516 //Cycle through our frame buffers
517 //We keep track of previous frame which is in fact our device back buffer.
518 //We can then compare previous and next frame and send only the differences to our device.
519 //This mechanism allows us to reduce traffic over our USB bus thus improving our frame rate from 14 FPS to 30 FPS.
520 //Keep our previous frame pointer
521 BitArrayLow* previousFrame=iFramePrevious;
522 //Current frame becomes the previous one
523 iFramePrevious = iFrameCurrent;
524 //Next frame becomes the current one
525 iFrameCurrent = iFrameNext;
526 //Next frame is now our former previous
527 iFrameNext = previousFrame;
532 //Define the edge of our pixel block
533 //Pixel blocks of 32x32 seems to run almost as fast as full screen update in worse case scenarii.
534 //Though I wonder if in some situations 16 could be better. Make this an attribute at some point if need be.
535 const int KPixelBlockEdge = 32;
536 const int KPixelBlockSizeInBits = KPixelBlockEdge*KPixelBlockEdge;
537 const int KPixelBlockSizeInBytes = KPixelBlockSizeInBits/8;
541 Translate the given pixel coordinate according to our off screen mode.
543 void GP1212A02A::OffScreenTranslation(unsigned char& aX, unsigned char& aY)
547 aX+=WidthInPixels()-iDisplayPositionX;
548 aY+=HeightInPixels()-iDisplayPositionY;
555 void GP1212A02A::Request(TMiniDisplayRequest aRequest)
559 case EMiniDisplayRequestDeviceId:
562 case EMiniDisplayRequestFirmwareRevision:
563 RequestFirmwareRevision();
565 case EMiniDisplayRequestPowerSupplyStatus:
566 RequestPowerSupplyStatus();
577 void GP1212A02A::ResetBuffers()
579 //iNextFrame->ClearAll();
580 //memset(iFrameAlpha,0x00,sizeof(iFrameAlpha));
581 //memset(iFrameBeta,0x00,sizeof(iFrameBeta));
586 void GP1212A02A::RequestDeviceId()
593 [Code] 1BH,6AH,49H,44H
594 [Function] Send the ID code to the Host system. ID code is software version.
596 void GP1212A02A::RequestFirmwareRevision()
598 if (RequestPending())
600 //Abort silently for now
605 //Send Software Revision Read Command
606 FutabaVfdReport report;
607 report[0]=0x00; //Report ID
608 report[1]=0x04; //Report length
609 report[2]=0x1B; //Command ID
610 report[3]=0x6A; //Command ID
611 report[4]=0x49; //Command ID
612 report[5]=0x44; //Command ID
613 if (Write(report)==report.Size())
615 SetRequest(EMiniDisplayRequestFirmwareRevision);
622 void GP1212A02A::RequestPowerSupplyStatus()
629 This is for development purposes only.
630 Production application should stick to off-screen mode to avoid tearing.
632 void GP1212A02A::ToggleOffScreenMode()
634 SetOffScreenMode(!iOffScreenMode);
638 * @brief GP1212A02A::SetOffScreenMode
642 void GP1212A02A::SetOffScreenMode(bool aOn)
644 if (aOn==iOffScreenMode)
652 //Clean up our buffers upon switching modes
659 Tries to complete our current request if we have one pending.
661 TMiniDisplayRequest GP1212A02A::AttemptRequestCompletion()
663 if (!RequestPending())
665 return EMiniDisplayRequestNone;
668 int res=Read(iInputReport);
672 return EMiniDisplayRequestNone;
675 //Process our request
676 if (CurrentRequest()==EMiniDisplayRequestFirmwareRevision)
678 unsigned char* ptr=&iInputReport[2];
679 iInputReport[7]=0x00;
680 strcpy(iFirmwareRevision,(const char*)ptr);
683 TMiniDisplayRequest completed=CurrentRequest();
684 //Our request was completed
685 SetRequest(EMiniDisplayRequestNone);
692 Set our screen brightness.
693 @param The desired brightness level. Must be between MinBrightness and MaxBrightness.
695 void GP1212A02A::SetBrightness(int aBrightness)
697 if (aBrightness<MinBrightness()||aBrightness>MaxBrightness())
699 //Brightness out of range.
700 //Just ignore that request.
704 FutabaVfdReport report;
705 report[0]=0x00; //Report ID
706 report[1]=0x04; //Report size
707 report[2]=0x1B; //Command ID
708 report[3]=0x4A; //Command ID
709 report[4]=0x44; //Command ID
710 report[5]=0x30+aBrightness; //Brightness level
716 bool GP1212A02A::IsPowerOn()
723 char* GP1212A02A::DeviceId()
730 char* GP1212A02A::FirmwareRevision()
732 return iFirmwareRevision;
738 [Function]Control of the power supply for VFD
739 * If VFD power ON or OFF, at interval of 10s or more.
740 * When the VFD power off, VFD display is turn off, but the module can receive a data and
742 Ps = VFD Power control
744 Ps = 30H : VFD Power OFF
745 Ps = 31H : VFD Power ON (Default)
747 void GP1212A02A::SendCommandPower(TPowerStatus aPowerStatus)
749 FutabaVfdReport report;
750 report[0]=0x00; //Report ID
751 report[1]=0x04; //Report size
752 report[2]=0x1B; //Command ID
753 report[3]=0x4A; //Command ID
754 report[4]=0x42; //Command ID
755 report[5]=aPowerStatus; //ON or OFF
761 void GP1212A02A::TurnPowerOn()
763 SendCommandPower(EPowerOn);
769 void GP1212A02A::TurnPowerOff()
771 SendCommandPower(EPowerOff);
776 Provide the length of our character string for the given clock format.
777 @param The clock format to evaluate.
778 @return Number of characters for the given clock format.
780 int GP1212A02A::ClockCharCount(TClockFormat aFormat)
798 @return Clock character width in pixels.
800 int GP1212A02A::ClockCharWidthInPixels(TFontSizeLogical aSize)
818 @return Clock character height in pixels.
820 int GP1212A02A::ClockCharHeightInPixels(TFontSizeLogical aSize)
838 Return the Display Window address for centering the clock corresponding to the given parameters.
840 unsigned short GP1212A02A::ClockCenterAddress(TClockFormat aFormat, TFontSizeLogical aSize)
842 int charCount=ClockCharCount(aFormat);
843 int halfWidth=(ClockCharWidthInPixels(aSize)*charCount)/2;
844 int halfHeight=(ClockCharHeightInPixels(aSize))/2;
845 int x=(WidthInPixels()/2)-halfWidth;
846 int y=(HeightInPixels()/2)-halfHeight;
849 int xOffset=x*8; //Not sure why...
851 unsigned short address = yOffset+xOffset;
858 void GP1212A02A::ShowClock()
860 SendCommandClockDisplay(EClock24,ClockCenterAddress(EClock24,EFontLarge),EFontLarge);
865 void GP1212A02A::HideClock()
867 SendCommandClockCancel();
873 [Code]1BH,6BH,53H,Pd,Ph,Pm
874 [Function]Setting the clock data. The setting data is cleared, if the Reset command is input or power
884 * Clock setting is canceled, when Pd is input value that is larger than 07H, or Ph is input value that is
885 larger than 18H,or Pm is input value that is larger than 3CH.
887 void GP1212A02A::SendCommandClockSetting(TWeekDay aWeekDay, unsigned char aHour, unsigned char aMinute)
889 FutabaVfdReport report;
890 report[0]=0x00; //Report ID
891 report[1]=0x06; //Report size
892 report[2]=0x1B; //Command ID
893 report[3]=0x6B; //Command ID
894 report[4]=0x53; //Command ID
895 report[5]=aWeekDay; //Sunday to Saturday
904 Set display clock settings according to local system time.
905 This needs to be redone whenever we open or turn on our display.
907 void GP1212A02A::SetClockSetting()
910 struct tm * timeinfo;
913 timeinfo = localtime ( &rawtime );
915 SendCommandClockSetting((TWeekDay)timeinfo->tm_wday,timeinfo->tm_hour,timeinfo->tm_min);
921 [Code] 1BH,6BH,55H,Ps,aL,aH,Pf
922 [Function] Clock is displayed. The display position and the font size can be freely decided.
923 Ps = Display type select
925 Pf = Font size select
927 Ps = 00H : 24hour Ex.[12:34]
928 Ps = 01H : 24hour + day of the week Ex.[Wed._12:34]
929 Ps = 10H : 12hour Ex.[PM_00:34]
930 Ps = 11H : 12hour + day of the week Ex.[Wed._PM_00:34]
935 * When the clock data is not input, clock is not displayed.
936 * The clock display is maintained until Clock display cancel "Clear display" RESET command is input
937 or power is turned off.
938 The clock display area
939 Graphic can be displayed excluding the clock display area.
940 The self adjustment for the position
941 that cannot be displayed.
942 * Excluding the clock display area can be input other display commands.
944 void GP1212A02A::SendCommandClockDisplay(TClockFormat aClockFormat, unsigned short aAddress, TFontSizeLogical aSize)
946 FutabaVfdReport report;
947 report[0]=0x00; //Report ID
948 report[1]=0x07; //Report size
949 report[2]=0x1B; //Command ID
950 report[3]=0x6B; //Command ID
951 report[4]=0x55; //Command ID
952 report[5]=aClockFormat; //
953 report[6]=(unsigned char)aAddress; //aL
954 report[7]=aAddress>>8; //aH
963 [Code] 1BH,6BH,3DH,58H
964 [Function] Clock display is canceled.
966 void GP1212A02A::SendCommandClockCancel()
968 FutabaVfdReport report;
969 report[0]=0x00; //Report ID
970 report[1]=0x04; //Report size
971 report[2]=0x1B; //Command ID
972 report[3]=0x6B; //Command ID
973 report[4]=0x3D; //Command ID
981 @return Size in bytes of a character for a given font size.
983 int GP1212A02A::CharacterSizeInBytes(TFontSize aFontSize)
1007 Define the User definable font (RAM)
1008 [Code] 1BH,6AH,47H,Pf,cL,(cH),Pd...Pd
1009 [Function] Define the User definable font into RAM. A maximum 16 characters can be defined
1010 within each font size.
1011 The User definable fonts are displayed the defined code. It is a same process to normal fonts.
1012 The User definable fonts are valid until they redefined, Reset command, or the power off.
1013 If define the user definable font over 16 characters, at first defined user definable font is removed
1014 If the defined code is specified, existing data is re-written.
1015 If the 16x16, 24x24, 32x32 size define, it must specify the “cH”
1017 cL = Lower byte of User definable font code
1018 cH = Upper byte of User definable font code
1019 Pd = Definition data
1021 Pf = 30H : 6x8 dot (Pd=6 byte)
1022 Pf = 31H : 8x16 dot (Pd=16 byte)
1023 Pf = 32H : 12x24 dot (Pd=36 byte)
1024 Pf = 33H : 16x32 dot (Pd=64 byte)
1025 Pf = 34H : 16x16 dot (Pd=32 byte)
1026 Pf = 35H : 24x24 dot (Pd=72 byte)
1027 Pf = 36H : 32x32 dot (Pd=128 byte)
1028 cL = ANK code (Pf=30H~33H : 1 byte code)
1029 cL,cH = Shift-JIS code (Pf=34H~36H : 2 byte code)
1031 void GP1212A02A::SendCommandDefineCharacter(TFontSize aFontSize, unsigned short aCharacterCode, unsigned char* aPixels)
1033 unsigned char reportSize=0;
1034 unsigned char headerSize=0;
1035 unsigned char dataSize=CharacterSizeInBytes(aFontSize);
1036 FutabaVfdReport report;
1038 if (aFontSize>=EFont16x16)
1042 reportSize = (dataSize<=report.Size()-headerSize?dataSize+0x06:64); //Report length. -7 is for our header first 7 bytes. +5 is for our Futaba header size
1043 report[7] = aCharacterCode>>8;
1049 reportSize = (dataSize<=report.Size()-headerSize?dataSize+0x05:64); //Report length. -7 is for our header first 7 bytes. +5 is for our Futaba header size
1053 report[0]=0x00; //Report ID
1054 report[1]=reportSize; //Report size
1055 report[2]=0x1B; //Command ID
1056 report[3]=0x6A; //Command ID
1057 report[4]=0x47; //Command ID
1058 report[5]=aFontSize; //
1059 report[6] = (unsigned char) aCharacterCode;
1060 //7th byte was set above already
1061 int sizeWritten=MIN(dataSize,report.Size()-headerSize);
1062 memcpy(report.Buffer()+headerSize, aPixels, sizeWritten);
1065 int remainingSize=dataSize;
1066 //We need to keep on sending our pixel data until we are done
1067 while (report[1]==64)
1070 remainingSize-=sizeWritten;
1071 report[0]=0x00; //Report ID
1072 report[1]=(remainingSize<=report.Size()-2?remainingSize:64); //Report length, should be 64 or the remaining size
1073 sizeWritten=(report[1]==64?63:report[1]);
1074 memcpy(report.Buffer()+2, aPixels+(dataSize-remainingSize), sizeWritten);
1081 User definable font store / transfer / delete
1082 [Code] 1BH,6AH,45H,Ps
1083 [Function] Store, transfer, or delete the User definable font to FROM.
1084 * Define the user definable font, after the user definable font is stored
1085 * The user definable font store is stored the all defined user definable font data.
1086 * The use definable font delete is deleted the all defined to FROM and RAM user definable font data.
1087 Ps = store / transfer / delete
1093 void GP1212A02A::SendCommandFontAction(TFontAction aFontAction)
1095 FutabaVfdReport report;
1096 report[0]=0x00; //Report ID
1097 report[1]=0x04; //Report size
1098 report[2]=0x1B; //Command ID
1099 report[3]=0x6A; //Command ID
1100 report[4]=0x45; //Command ID
1101 report[5]=aFontAction; //Ps
1108 [Code]1BH,4AH,46H,Pf
1109 [Function]Setting the font size
1113 Pf = 31H?8x16dot and 16x16 dot
1114 Pf = 32H?12x24 dot and 24x24 dot
1115 Pf = 33H?16x32 dot and 32x32 dot
1117 void GP1212A02A::SendCommandSelectFontSize(TFontSizeLogical aFontSoze)
1119 FutabaVfdReport report;
1120 report[0]=0x00; //Report ID
1121 report[1]=0x04; //Report size
1122 report[2]=0x1B; //Command ID
1123 report[3]=0x4A; //Command ID
1124 report[4]=0x46; //Command ID
1125 report[5]=aFontSoze; //Pf