2 * AtmoSerialConnection.cpp: Class for communication with the serial hardware of
3 * Atmo Light, opens and configures the serial port
5 * See the README.txt file for copyright information and how to reach the author(s).
12 #include "AtmoSerialConnection.h"
24 #include <sys/types.h>
29 #include <vdr/tools.h>
33 CAtmoSerialConnection::CAtmoSerialConnection(CAtmoConfig *cfg) : CAtmoConnection(cfg) {
34 m_hComport = INVALID_HANDLE_VALUE;
37 CAtmoSerialConnection::~CAtmoSerialConnection() {
41 ATMO_BOOL CAtmoSerialConnection::OpenConnection() {
42 #if defined(_ATMO_VLC_PLUGIN_)
43 char *serdevice = m_pAtmoConfig->getSerialDevice();
47 int portNummer = m_pAtmoConfig->getComport();
48 m_dwLastWin32Error = 0;
49 if(portNummer < 1) return ATMO_FALSE; // make no real sense;-)
54 #if !defined(_ATMO_VLC_PLUGIN_)
55 char comport[16]; // com4294967295
56 sprintf(comport,"com%d",portNummer);
61 # if defined(_ATMO_VLC_PLUGIN_)
62 m_hComport = CreateFile(serdevice, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
64 m_hComport = CreateFile(comport, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
66 if(m_hComport == INVALID_HANDLE_VALUE) {
67 // we have a problem here can't open com port... somebody else may use it?
68 // m_dwLastWin32Error = GetLastError();
71 /* change serial settings (Speed, stopbits etc.) */
72 DCB dcb; // für comport-parameter
73 dcb.DCBlength = sizeof(DCB);
74 GetCommState (m_hComport, &dcb); // ger current serialport settings
75 dcb.BaudRate = 38400; // set speed
76 dcb.ByteSize = 8; // set databits
77 dcb.Parity = NOPARITY; // set parity
78 dcb.StopBits = ONESTOPBIT; // set one stop bit
79 SetCommState (m_hComport, &dcb); // apply settings
84 # if defined(_ATMO_VLC_PLUGIN_)
85 m_hComport = open(serdevice,O_RDWR |O_NOCTTY);
87 m_hComport = open(comport,O_RDWR | O_NOCTTY);
94 memset(&tio,0,sizeof(tio));
95 tio.c_cflag = (CS8 | CREAD | HUPCL | CLOCAL);
96 tio.c_iflag = (INPCK | BRKINT);
97 cfsetispeed(&tio, bconst);
98 cfsetospeed(&tio, bconst);
99 if(!tcsetattr(m_hComport, TCSANOW, &tio)) {
100 tcflush(m_hComport, TCIOFLUSH);
102 // can't change parms
113 void CAtmoSerialConnection::CloseConnection() {
114 if(m_hComport!=INVALID_HANDLE_VALUE) {
116 CloseHandle(m_hComport);
120 m_hComport = INVALID_HANDLE_VALUE;
124 ATMO_BOOL CAtmoSerialConnection::isOpen(void) {
125 return (m_hComport != INVALID_HANDLE_VALUE);
128 ATMO_BOOL CAtmoSerialConnection::HardwareWhiteAdjust(int global_gamma,
136 ATMO_BOOL storeToEeprom) {
137 if(m_hComport == INVALID_HANDLE_VALUE)
147 [4] brightness 0..255 ?
149 [5] Contrast Red 11 .. 100
150 [6] Contrast Green 11 .. 100
151 [7] Contrast Blue 11 .. 100
153 [8] Gamma Red 11 .. 35
154 [9] Gamma Red 11 .. 35
155 [10] Gamma Red 11 .. 35
157 [11] Globale Contrast 11 .. 100
159 [12] Store Data: 199 (else 0)
162 unsigned char sendBuffer[16];
163 sendBuffer[0] = 0xFF;
164 sendBuffer[1] = 0x00;
165 sendBuffer[2] = 0x00;
168 sendBuffer[4] = (global_gamma & 255);
170 sendBuffer[5] = (contrast_red & 255);
171 sendBuffer[6] = (contrast_green & 255);
172 sendBuffer[7] = (contrast_blue & 255);
174 sendBuffer[8] = (gamma_red & 255);
175 sendBuffer[9] = (gamma_green & 255);
176 sendBuffer[10] = (gamma_blue & 255);
178 sendBuffer[11] = (global_contrast & 255);
180 if(storeToEeprom == ATMO_TRUE)
181 sendBuffer[12] = 199; // store to eeprom!
186 WriteFile(m_hComport, sendBuffer, 13, &iBytesWritten, NULL); // send to COM-Port
188 iBytesWritten = write(m_hComport, sendBuffer, 13);
192 return (iBytesWritten == 13) ? ATMO_TRUE : ATMO_FALSE;
196 ATMO_BOOL CAtmoSerialConnection::SendData(tColorPacket data) {
197 if(m_hComport == INVALID_HANDLE_VALUE)
200 unsigned char buffer[19];
203 buffer[0] = 0xFF; // Start Byte
204 buffer[1] = 0x00; // Start channel 0
205 buffer[2] = 0x00; // Start channel 0
208 for(int i=0;i<5;i++) {
209 if(m_ChannelAssignment[i]>=0) {
210 buffer[iBuffer++] = data.channel[m_ChannelAssignment[i]].r;
211 buffer[iBuffer++] = data.channel[m_ChannelAssignment[i]].g;
212 buffer[iBuffer++] = data.channel[m_ChannelAssignment[i]].b;
214 buffer[iBuffer++] = 0;
215 buffer[iBuffer++] = 0;
216 buffer[iBuffer++] = 0;
221 WriteFile(m_hComport, buffer, 19, &iBytesWritten, NULL); // send to COM-Port
223 iBytesWritten = write(m_hComport, buffer, 19);
227 return (iBytesWritten == 19) ? ATMO_TRUE : ATMO_FALSE;
230 ATMO_BOOL CAtmoSerialConnection::SendData(unsigned char numChannels,
235 if(m_hComport == INVALID_HANDLE_VALUE)
238 DWORD bufSize = 4 + numChannels*3;
239 unsigned char *buffer = new unsigned char[bufSize];
242 buffer[0] = 0xFF; // Start Byte
243 buffer[1] = 0x00; // Start Kanal 0
244 buffer[2] = 0x00; // Start Kanal 0
245 buffer[3] = numChannels * 3; //
247 for(int i=0;i<numChannels;i++) {
248 if(m_ChannelAssignment[i]>=0) {
249 buffer[iBuffer++] = red[m_ChannelAssignment[i]] & 255;
250 buffer[iBuffer++] = green[m_ChannelAssignment[i]] & 255;
251 buffer[iBuffer++] = blue[m_ChannelAssignment[i]] & 255;
253 buffer[iBuffer++] = 0;
254 buffer[iBuffer++] = 0;
255 buffer[iBuffer++] = 0;
260 WriteFile(m_hComport, buffer, bufSize, &iBytesWritten, NULL);
262 iBytesWritten = write(m_hComport, buffer, bufSize);
268 return (iBytesWritten == bufSize) ? ATMO_TRUE : ATMO_FALSE;