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"
26 #include <sys/types.h>
32 #include <vdr/tools.h>
36 CAtmoSerialConnection::CAtmoSerialConnection(CAtmoConfig *cfg) : CAtmoConnection(cfg) {
37 m_hComport = INVALID_HANDLE_VALUE;
40 CAtmoSerialConnection::~CAtmoSerialConnection() {
44 ATMO_BOOL CAtmoSerialConnection::OpenConnection() {
45 #if defined(_ATMO_VLC_PLUGIN_)
46 char *serdevice = m_pAtmoConfig->getSerialDevice();
50 int portNummer = m_pAtmoConfig->getComport();
51 m_dwLastWin32Error = 0;
52 if(portNummer < 1) return ATMO_FALSE; // make no real sense;-)
57 #if !defined(_ATMO_VLC_PLUGIN_)
58 char comport[16]; // com4294967295
59 sprintf(comport,"com%d",portNummer);
64 # if defined(_ATMO_VLC_PLUGIN_)
65 m_hComport = CreateFile(serdevice, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
67 m_hComport = CreateFile(comport, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
69 if(m_hComport == INVALID_HANDLE_VALUE) {
70 // we have a problem here can't open com port... somebody else may use it?
71 // m_dwLastWin32Error = GetLastError();
74 /* change serial settings (Speed, stopbits etc.) */
75 DCB dcb; // für comport-parameter
76 dcb.DCBlength = sizeof(DCB);
77 GetCommState (m_hComport, &dcb); // ger current serialport settings
78 dcb.BaudRate = 38400; // set speed
79 dcb.ByteSize = 8; // set databits
80 dcb.Parity = NOPARITY; // set parity
81 dcb.StopBits = ONESTOPBIT; // set one stop bit
82 SetCommState (m_hComport, &dcb); // apply settings
87 # if defined(_ATMO_VLC_PLUGIN_)
88 m_hComport = open(serdevice,O_RDWR |O_NOCTTY);
90 m_hComport = open(comport,O_RDWR | O_NOCTTY);
97 memset(&tio,0,sizeof(tio));
98 tio.c_cflag = (CS8 | CREAD | HUPCL | CLOCAL);
99 tio.c_iflag = (INPCK | BRKINT);
100 cfsetispeed(&tio, bconst);
101 cfsetospeed(&tio, bconst);
102 if(!tcsetattr(m_hComport, TCSANOW, &tio)) {
103 tcflush(m_hComport, TCIOFLUSH);
105 // can't change parms
116 void CAtmoSerialConnection::CloseConnection() {
117 if(m_hComport!=INVALID_HANDLE_VALUE) {
119 CloseHandle(m_hComport);
123 m_hComport = INVALID_HANDLE_VALUE;
127 ATMO_BOOL CAtmoSerialConnection::isOpen(void) {
128 return (m_hComport != INVALID_HANDLE_VALUE);
131 ATMO_BOOL CAtmoSerialConnection::HardwareWhiteAdjust(int global_gamma,
139 ATMO_BOOL storeToEeprom) {
140 if(m_hComport == INVALID_HANDLE_VALUE)
150 [4] brightness 0..255 ?
152 [5] Contrast Red 11 .. 100
153 [6] Contrast Green 11 .. 100
154 [7] Contrast Blue 11 .. 100
156 [8] Gamma Red 11 .. 35
157 [9] Gamma Red 11 .. 35
158 [10] Gamma Red 11 .. 35
160 [11] Globale Contrast 11 .. 100
162 [12] Store Data: 199 (else 0)
165 unsigned char sendBuffer[16];
166 sendBuffer[0] = 0xFF;
167 sendBuffer[1] = 0x00;
168 sendBuffer[2] = 0x00;
171 sendBuffer[4] = (global_gamma & 255);
173 sendBuffer[5] = (contrast_red & 255);
174 sendBuffer[6] = (contrast_green & 255);
175 sendBuffer[7] = (contrast_blue & 255);
177 sendBuffer[8] = (gamma_red & 255);
178 sendBuffer[9] = (gamma_green & 255);
179 sendBuffer[10] = (gamma_blue & 255);
181 sendBuffer[11] = (global_contrast & 255);
183 if(storeToEeprom == ATMO_TRUE)
184 sendBuffer[12] = 199; // store to eeprom!
189 WriteFile(m_hComport, sendBuffer, 13, &iBytesWritten, NULL); // send to COM-Port
191 iBytesWritten = write(m_hComport, sendBuffer, 13);
195 return (iBytesWritten == 13) ? ATMO_TRUE : ATMO_FALSE;
199 ATMO_BOOL CAtmoSerialConnection::SendData(tColorPacket data) {
200 if(m_hComport == INVALID_HANDLE_VALUE)
203 unsigned char buffer[19];
206 buffer[0] = 0xFF; // Start Byte
207 buffer[1] = 0x00; // Start channel 0
208 buffer[2] = 0x00; // Start channel 0
211 for(int i=0;i<5;i++) {
212 if(m_ChannelAssignment[i]>=0) {
213 buffer[iBuffer++] = data.channel[m_ChannelAssignment[i]].r;
214 buffer[iBuffer++] = data.channel[m_ChannelAssignment[i]].g;
215 buffer[iBuffer++] = data.channel[m_ChannelAssignment[i]].b;
217 buffer[iBuffer++] = 0;
218 buffer[iBuffer++] = 0;
219 buffer[iBuffer++] = 0;
224 WriteFile(m_hComport, buffer, 19, &iBytesWritten, NULL); // send to COM-Port
226 iBytesWritten = write(m_hComport, buffer, 19);
230 return (iBytesWritten == 19) ? ATMO_TRUE : ATMO_FALSE;
233 ATMO_BOOL CAtmoSerialConnection::SendData(unsigned char numChannels,
238 if(m_hComport == INVALID_HANDLE_VALUE)
241 DWORD bufSize = 4 + numChannels*3;
242 unsigned char *buffer = new unsigned char[bufSize];
245 buffer[0] = 0xFF; // Start Byte
246 buffer[1] = 0x00; // Start Kanal 0
247 buffer[2] = 0x00; // Start Kanal 0
248 buffer[3] = numChannels * 3; //
250 for(int i=0;i<numChannels;i++) {
251 if(m_ChannelAssignment[i]>=0) {
252 buffer[iBuffer++] = red[m_ChannelAssignment[i]] & 255;
253 buffer[iBuffer++] = green[m_ChannelAssignment[i]] & 255;
254 buffer[iBuffer++] = blue[m_ChannelAssignment[i]] & 255;
256 buffer[iBuffer++] = 0;
257 buffer[iBuffer++] = 0;
258 buffer[iBuffer++] = 0;
263 WriteFile(m_hComport, buffer, bufSize, &iBytesWritten, NULL);
265 iBytesWritten = write(m_hComport, buffer, bufSize);
271 return (iBytesWritten == bufSize) ? ATMO_TRUE : ATMO_FALSE;