2 * AtmoDmxSerialConnection.cpp: Class for communication with a Simple DMX Dongle/Controller
3 * for hardware see also:
4 * http://www.dzionsko.de/elektronic/index.htm
5 * http://www.ulrichradig.de/ (search for dmx on his page)
7 * See the README.txt file for copyright information and how to reach the author(s).
12 #include "AtmoDmxSerialConnection.h"
15 #if !defined(_ATMO_VLC_PLUGIN_)
16 #include "DmxConfigDialog.h"
28 CAtmoDmxSerialConnection::CAtmoDmxSerialConnection(CAtmoConfig *cfg) : CAtmoConnection(cfg) {
29 m_hComport = INVALID_HANDLE_VALUE;
31 memset(&DMXout, 0, sizeof(DMXout));
32 DMXout[0] = 0x5A; // DMX Command Start Byte
33 DMXout[1] = 0xA1; // DMX Controlcommand for 256 channels
34 DMXout[258] = 0xA5; // end of block
36 m_dmx_channels_base = ConvertDmxStartChannelsToInt( cfg->getDMX_RGB_Channels(), cfg->getDMX_BaseChannels());
40 CAtmoDmxSerialConnection::~CAtmoDmxSerialConnection() {
41 delete m_dmx_channels_base;
44 ATMO_BOOL CAtmoDmxSerialConnection::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;-)
55 if(!m_dmx_channels_base)
60 #if !defined(_ATMO_VLC_PLUGIN_)
61 char serdevice[16]; // com4294967295
62 sprintf(serdevice,"com%d",portNummer);
67 m_hComport = CreateFile(serdevice, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
68 if(m_hComport == INVALID_HANDLE_VALUE) {
69 // we have a problem here can't open com port... somebody else may use it?
70 // m_dwLastWin32Error = GetLastError();
73 /* change serial settings (Speed, stopbits etc.) */
74 DCB dcb; // für comport-parameter
75 dcb.DCBlength = sizeof(DCB);
76 GetCommState (m_hComport, &dcb); // ger current serialport settings
77 dcb.BaudRate = 115200; // set speed
78 dcb.ByteSize = 8; // set databits
79 dcb.Parity = NOPARITY; // set parity
80 dcb.StopBits = ONESTOPBIT; // set one stop bit
81 SetCommState (m_hComport, &dcb); // apply settings
86 m_hComport = open(serdevice, O_RDWR |O_NOCTTY);
92 memset(&tio,0,sizeof(tio));
93 tio.c_cflag = (CS8 | CREAD | HUPCL | CLOCAL);
94 tio.c_iflag = (INPCK | BRKINT);
95 cfsetispeed(&tio, bconst);
96 cfsetospeed(&tio, bconst);
97 if(!tcsetattr(m_hComport, TCSANOW, &tio)) {
98 tcflush(m_hComport, TCIOFLUSH);
100 // can't change parms
111 void CAtmoDmxSerialConnection::CloseConnection() {
112 if(m_hComport!=INVALID_HANDLE_VALUE) {
114 CloseHandle(m_hComport);
118 m_hComport = INVALID_HANDLE_VALUE;
122 ATMO_BOOL CAtmoDmxSerialConnection::isOpen(void) {
123 return (m_hComport != INVALID_HANDLE_VALUE);
126 ATMO_BOOL CAtmoDmxSerialConnection::HardwareWhiteAdjust(int global_gamma,
134 ATMO_BOOL storeToEeprom) {
139 ATMO_BOOL CAtmoDmxSerialConnection::SendData(pColorPacket data) {
140 if(m_hComport == INVALID_HANDLE_VALUE)
150 for(int i=0;i<getNumChannels();i++) {
151 if(m_ChannelAssignment && (i < m_NumAssignedChannels))
152 idx = m_ChannelAssignment[i];
156 if((idx>=0) && (idx<data->numColors)) {
157 if( m_dmx_channels_base[z] >= 0 )
158 iBuffer = m_dmx_channels_base[z] + 2;
162 DMXout[iBuffer] = data->zone[ idx ].r;
163 DMXout[iBuffer+1] = data->zone[ idx ].g;
164 DMXout[iBuffer+2] = data->zone[ idx ].b;
167 if( m_dmx_channels_base[z] >= 0 )
172 WriteFile(m_hComport, DMXout, 259, &iBytesWritten, NULL); // send to COM-Port
174 iBytesWritten = write(m_hComport, DMXout, 259);
179 return (iBytesWritten == 259) ? ATMO_TRUE : ATMO_FALSE;
183 ATMO_BOOL CAtmoDmxSerialConnection::setChannelValues(int numValues,unsigned char *channel_values)
186 if((numValues & 1) || !channel_values)
187 return ATMO_FALSE; // numValues must be even!
190 the array shall contain
196 for (int i = 0; i < numValues; i+=2) {
197 dmxIndex = ((int)channel_values[i]) + 2;
198 DMXout[dmxIndex] = channel_values[i+1];
201 WriteFile(m_hComport, DMXout, 259, &iBytesWritten, NULL);
203 iBytesWritten = write(m_hComport, DMXout, 259);
209 return (iBytesWritten == 259) ? ATMO_TRUE : ATMO_FALSE;
213 ATMO_BOOL CAtmoDmxSerialConnection::setChannelColor(int channel, tRGBColor color)
219 DMXout[channel+0+2]=color.r;
220 DMXout[channel+1+2]=color.g;
221 DMXout[channel+2+2]=color.b;
224 WriteFile(m_hComport, DMXout, 259, &iBytesWritten, NULL);
226 iBytesWritten = write(m_hComport, DMXout, 259);
233 return (iBytesWritten == 259) ? ATMO_TRUE : ATMO_FALSE;
236 ATMO_BOOL CAtmoDmxSerialConnection::CreateDefaultMapping(CAtmoChannelAssignment *ca)
238 if(!ca) return ATMO_FALSE;
239 ca->setSize( getNumChannels() );
240 for(int i = 0; i < getNumChannels(); i++)
241 ca->setZoneIndex(i , i);
245 #if !defined(_ATMO_VLC_PLUGIN_)
247 char *CAtmoDmxSerialConnection::getChannelName(int ch)
249 if(ch < 0) return NULL;
254 sprintf(buf,"Summenkanal [%d]",ch);
257 sprintf(buf,"Linker Kanal [%d]",ch);
260 sprintf(buf,"Rechter Kanal [%d]",ch);
263 sprintf(buf,"Oberer Kanal [%d]",ch);
266 sprintf(buf,"Unterer Kanal [%d]",ch);
269 sprintf(buf,"Kanal [%d]",ch);
276 ATMO_BOOL CAtmoDmxSerialConnection::ShowConfigDialog(HINSTANCE hInst, HWND parent, CAtmoConfig *cfg)
278 CDmxConfigDialog *dlg = new CDmxConfigDialog(hInst, parent, cfg);
280 INT_PTR result = dlg->ShowModal();
293 int CAtmoDmxSerialConnection::getNumChannels()
295 return m_pAtmoConfig->getDMX_RGB_Channels();