inc/FutabaVfd.h
author sl
Thu, 22 May 2014 07:30:05 +0200
changeset 13 69f1fcfdf6a5
parent 12 7268128148b8
child 14 4a5538e0ccbf
permissions -rw-r--r--
Fixing crash on stratup if no Futaba VFD connected.
     1 
     2 
     3 #ifndef FUTABA_VFD_H
     4 #define FUTABA_VFD_H
     5 
     6 #include "hidapi.h"
     7 
     8 //This was computed from our number of pixels as follow 256x64/8/64 = 32 + 1 = 33
     9 //+1 was added for our header
    10 const int KFutabaMaxCommandOutputReport = 33;
    11 //TODO: Get ride of that constant once we figure out a way to get it from hidapi
    12 const int KFutabaMaxHidReportSize = 65;
    13 
    14 const int KHidReportIdIndex=0;
    15 const int KFutabaHidReportSizeIndex=1;
    16 //Define Futaba vendor ID to filter our list of device
    17 const unsigned short KFutabaVendorId = 0x1008;
    18 const unsigned short KFutabaProductIdGP1212A01A = 0x100C;
    19 const unsigned short KFutabaProductIdGP1212A02A = 0x1013; //Or is it 0x1015
    20 
    21 
    22 //typedef struct hid_device_info HidDeviceInfo;
    23 
    24 /**
    25 TODO: move to another header
    26 */
    27 template <int S>
    28 class HidReport
    29 	{
    30 public:
    31 	HidReport(){Reset();};
    32 	void Reset();
    33 	inline unsigned char& operator[](int aIndex){return iBuffer[aIndex];}
    34 	const unsigned char* Buffer() const {return iBuffer;};
    35 	unsigned char* Buffer() {return iBuffer;};
    36 protected:
    37 	unsigned char iBuffer[S];
    38 	};
    39 
    40 template <int S>
    41 void HidReport<S>::Reset()
    42     {
    43     memset(iBuffer,0,sizeof(iBuffer));
    44     }
    45 
    46 /**
    47 TODO: move to another header
    48 */
    49 class HidDevice
    50 	{
    51 public:
    52 	int Open(const char* aPath);
    53 	int Open(unsigned short aVendorId, unsigned short aProductId, const wchar_t* aSerialNumber);
    54 	void Close();
    55     bool IsOpen();
    56 	//
    57 	int SetNonBlocking(int aNonBlocking);
    58 	//
    59 	template<int S>
    60 	int Write(const HidReport<S>& aOutputReport);
    61 	//
    62 	const wchar_t* Error();
    63 
    64 
    65 
    66 private:
    67 	///Our USB HID device
    68 	hid_device* iHidDevice;
    69 	};
    70 
    71 
    72 /**
    73 */
    74 template<int S>
    75 int HidDevice::Write(const HidReport<S>& aOutputReport)
    76 	{
    77 	return hid_write(iHidDevice,aOutputReport.Buffer(),S);
    78 	}
    79 
    80 
    81 /**
    82 */
    83 class FutabaVfdReport: public HidReport<KFutabaMaxHidReportSize>
    84 	{
    85 
    86 private:
    87 
    88 	};
    89 
    90 
    91 
    92 /**
    93 Define a generic Futaba VFD command.
    94 */
    95 class FutabaVfdCommand
    96     {
    97 public:
    98     FutabaVfdCommand();
    99     ~FutabaVfdCommand();
   100     //
   101     //void Create(int aMaxSize);
   102     //void Delete();
   103 
   104     //inline unsigned char& operator[](int aIndex){return iBuffer[aIndex];}
   105 
   106     void Reset();
   107 
   108 private:
   109     //unsigned char* iBuffer;
   110     FutabaVfdReport iReports[KFutabaMaxCommandOutputReport];
   111     int iSize;
   112     int iMaxSize;
   113     };
   114 
   115 /**
   116 */
   117 class FutabaVfd : public HidDevice
   118 	{
   119 public:
   120 	virtual int MinBrightness()=0;
   121 	virtual int MaxBrightness()=0;
   122 	virtual void SetBrightness(int aBrightness)=0;
   123 	virtual void Clear()=0;
   124 	};
   125 
   126 
   127 /**
   128 */
   129 class FutabaGraphicVfd : public FutabaVfd
   130 	{
   131 public:
   132 	virtual int WidthInPixels()=0;
   133 	virtual int HeightInPixels()=0;
   134 	virtual void SetPixel(int aX, int aY, bool aOn)=0;
   135 	virtual void SetAllPixels(bool aOn)=0;
   136 
   137 	};
   138 
   139 /**
   140 Common functionality between GP1212A01A and GP1212A02A
   141 */
   142 class GP1212XXXX : public FutabaGraphicVfd
   143 	{
   144 public:
   145 	//From FutabaVfd
   146 	virtual int MinBrightness(){return 0;};
   147 	virtual int MaxBrightness(){return 5;};
   148 	};
   149 
   150 /**
   151 GP1212A01A is a graphic display module using a FUTABA 256x64dots VFD.
   152 The module do not include character ROM, the customer will compile the character
   153 by themselves (from main system).
   154 */
   155 class GP1212A01A : public GP1212XXXX
   156 	{
   157 public:
   158 	int Open();
   159 	//From FutabaGraphicVfd
   160 	virtual int WidthInPixels(){return 256;};
   161 	virtual int HeightInPixels(){return 64;};
   162 	virtual void SetPixel(int aX, int aY, bool aOn);
   163 	virtual void SetAllPixels(bool aOn);
   164 	//From FutabaVfd
   165 	virtual void SetBrightness(int aBrightness);
   166 	virtual void Clear();
   167 	//
   168 	void SetPixelBlock(int aX, int aY, int aHeight, int aSize, unsigned char aValue);
   169 
   170 private:
   171 	///
   172 	//FutabaVfdReport iReport;
   173 	///
   174 	unsigned char iPixelBuffer[256][128];
   175 	};
   176 
   177 
   178 #endif