1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
|
/*
* GraphLCD driver library
*
* serdisp.h - include support for displays supported by serdisplib (if library is installed)
* http://serdisplib.sourceforge.net
*
* This file is released under the GNU General Public License. Refer
* to the COPYING file distributed with this package.
*
* (c) 2003-2013 Wolfgang Astleitner <mrwastl AT users.sourceforge.net>
*/
#ifndef _GLCDDRIVERS_SERDISP_H_
#define _GLCDDRIVERS_SERDISP_H_
#include "driver.h"
#include <sys/time.h>
namespace GLCD
{
/* event-type for GPIs, GPOs, and data exchange messages. min. size: 16 byte, max size: 12 + 64) */
typedef struct SDGP_event_s { /* 16 to 78 bytes */
/* byte 0 */
uint8_t type; /* one of SDGPT_* */
uint8_t cmdid; /* command-ID (one of SD_CMD_*) */
uint8_t devid; /* device ID, 0 == local */
uint8_t subid; /* gp-ID or page-ID */
/* byte 4 */
struct timeval timestamp; /* timestamp (8 bytes) */
/* byte 12 */
union {
int32_t value; /* if single value event: value */
struct { /* if streaming event or package: */
uint16_t length; /* length of stream if known or 0 if some stop tag is used */
uint8_t word_size; /* stream elements are bytes/chars (0 or 1), shorts (2), or longs (4) */
uint8_t _reserved; /* reserved for later use */
};
uint8_t data[64]; /* if data-package type: max. 64 byte payload */
};
} SDGP_event_t;
/* event-payload-type for simple touchscreen events (no multitouch or similar) */
typedef struct SDGP_evpkt_simpletouch_s { /* 16 bytes */
/* 12 bytes */
int16_t raw_x; /* raw coordinate X */
int16_t raw_y; /* raw coordinate Y */
int16_t raw_touch; /* raw touch value */
int16_t norm_x; /* normalised coordinate X (norm_x <= dd->width) */
int16_t norm_y; /* normalised coordinate Y (norm_y <= dd->height) */
int16_t norm_touch; /* normalised touch value */
} SDGP_evpkt_simpletouch_t;
/* event-payload-type for generic touchscreen events (only importat stuff is defined here, rest is ignored (read only!) */
typedef struct SDGP_evpkt_generictouch_s { /* 16 bytes */
uint8_t type; /* event type: 0: up, 1: down, 2: move */
uint8_t flags; /* 0000 000x ... 0: binary touch, 1: touch with pressure information */
/* xxxx 0000 ... 0000: union not used */
/* 0001: raw touch information included in union */
/* 0010: reserved */
/* 0011: reserved */
int16_t norm_x; /* normalised coordinate X (norm_x <= dd->width) */
int16_t norm_y; /* normalised coordinate Y (norm_y <= dd->height) */
uint16_t norm_touch; /* normalised touch value */
/* ignore all union stuff */
} SDGP_evpkt_generictouch_t;
typedef struct {
bool touchChanged;
int touchX;
int touchY;
int touchT;
} tTouchEvent;
typedef void (*fp_eventlistener_t) (void* dd, SDGP_event_t* recylce);
class cDriverConfig;
class cDriverSerDisp : public cDriver
{
private:
long serdisp_version;
int supports_options;
void* sdhnd; // serdisplib handle
void* dd; // display descriptor
void* sdcd; // serdisp connect descriptor
long (*fp_serdisp_getversioncode) ();
void* (*fp_SDCONN_open) (const char sdcdev[]);
void* (*fp_serdisp_init) (void* sdcd, const char dispname[], const char extra[]);
void (*fp_serdisp_rewrite) (void* dd);
void (*fp_serdisp_update) (void* dd);
void (*fp_serdisp_clearbuffer) (void* dd);
void (*fp_serdisp_setcolour) (void* dd, int x, int y, long colour);
int (*fp_serdisp_feature) (void* dd, int feature, int value);
int (*fp_serdisp_isoption) (void* dd, const char* optionname);
void (*fp_serdisp_setoption) (void* dd, const char* optionname, long value);
long (*fp_serdisp_getoption) (void* dd, const char* optionname, int* typesize);
int (*fp_serdisp_getwidth) (void* dd);
int (*fp_serdisp_getheight) (void* dd);
int (*fp_serdisp_getcolours) (void* dd);
int (*fp_serdisp_getdepth) (void* dd);
void (*fp_serdisp_quit) (void* dd);
void (*fp_serdisp_close) (void* dd);
uint8_t (*fp_SDGPI_search) (void* dd, const char* gpname);
int (*fp_SDGPI_isenabled) (void* dd, uint8_t gpid);
int (*fp_SDGPI_enable) (void* dd, uint8_t gpid, int enable);
int (*fp_SDEVLP_add_listener) (void* dd, uint8_t gpid, fp_eventlistener_t eventlistener );
const char*
(*fp_serdisp_defaultdevice) (const char* dispname);
int CheckSetup();
void eventListener (void* dd, SDGP_event_t* recycle);
tTouchEvent* touchEvent;
protected:
virtual bool GetDriverFeature (const std::string & Feature, int & value);
virtual uint32_t GetDefaultBackgroundColor(void);
public:
cDriverSerDisp(cDriverConfig * config);
virtual int Init();
virtual int DeInit();
virtual void Clear();
virtual void SetPixel(int x, int y, uint32_t data);
virtual void Refresh(bool refreshAll = false);
virtual void SetBrightness(unsigned int percent);
virtual bool SetFeature (const std::string & Feature, int value);
virtual cGLCDEvent * GetEvent(void);
};
} // end of namespace
#endif
|