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