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).
17 #include "AtmoDmxSerialConnection.h"
20 #if !defined(_ATMO_VLC_PLUGIN_)
21 #include "DmxConfigDialog.h"
33 CAtmoDmxSerialConnection::CAtmoDmxSerialConnection(CAtmoConfig *cfg) : CAtmoConnection(cfg) {
34 m_hComport = INVALID_HANDLE_VALUE;
36 memset(&DMXout, 0, sizeof(DMXout));
37 DMXout[0] = 0x5A; // DMX Command Start Byte
38 DMXout[1] = 0xA1; // DMX Controlcommand for 256 channels
39 DMXout[258] = 0xA5; // end of block
41 m_dmx_channels_base = ConvertDmxStartChannelsToInt( cfg->getDMX_RGB_Channels(), cfg->getDMX_BaseChannels());
45 CAtmoDmxSerialConnection::~CAtmoDmxSerialConnection() {
46 delete m_dmx_channels_base;
49 ATMO_BOOL CAtmoDmxSerialConnection::OpenConnection() {
50 #if defined(_ATMO_VLC_PLUGIN_)
51 char *serdevice = m_pAtmoConfig->getSerialDevice();
55 int portNummer = m_pAtmoConfig->getComport();
56 m_dwLastWin32Error = 0;
57 if(portNummer < 1) return ATMO_FALSE; // make no real sense;-)
60 if(!m_dmx_channels_base)
65 #if !defined(_ATMO_VLC_PLUGIN_)
66 char serdevice[16]; // com4294967295
67 sprintf(serdevice,"com%d",portNummer);
72 m_hComport = CreateFileA(serdevice, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
73 if(m_hComport == INVALID_HANDLE_VALUE) {
74 // we have a problem here can't open com port... somebody else may use it?
75 // m_dwLastWin32Error = GetLastError();
78 /* change serial settings (Speed, stopbits etc.) */
79 DCB dcb; // für comport-parameter
80 dcb.DCBlength = sizeof(DCB);
81 GetCommState (m_hComport, &dcb); // ger current serialport settings
82 dcb.BaudRate = 115200; // set speed
83 dcb.ByteSize = 8; // set databits
84 dcb.Parity = NOPARITY; // set parity
85 dcb.StopBits = ONESTOPBIT; // set one stop bit
86 SetCommState (m_hComport, &dcb); // apply settings
91 m_hComport = open(serdevice, 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 CAtmoDmxSerialConnection::CloseConnection() {
117 if(m_hComport!=INVALID_HANDLE_VALUE) {
119 CloseHandle(m_hComport);
123 m_hComport = INVALID_HANDLE_VALUE;
127 ATMO_BOOL CAtmoDmxSerialConnection::isOpen(void) {
128 return (m_hComport != INVALID_HANDLE_VALUE);
131 ATMO_BOOL CAtmoDmxSerialConnection::SendData(pColorPacket data) {
132 if(m_hComport == INVALID_HANDLE_VALUE)
142 for(int i=0;i<getNumChannels();i++) {
143 if(m_ChannelAssignment && (i < m_NumAssignedChannels))
144 idx = m_ChannelAssignment[i];
148 if((idx>=0) && (idx<data->numColors)) {
149 if( m_dmx_channels_base[z] >= 0 )
150 iBuffer = m_dmx_channels_base[z] + 2;
154 DMXout[iBuffer] = data->zone[ idx ].r;
155 DMXout[iBuffer+1] = data->zone[ idx ].g;
156 DMXout[iBuffer+2] = data->zone[ idx ].b;
159 if( m_dmx_channels_base[z] >= 0 )
164 WriteFile(m_hComport, DMXout, 259, &iBytesWritten, NULL); // send to COM-Port
166 iBytesWritten = write(m_hComport, DMXout, 259);
171 return (iBytesWritten == 259) ? ATMO_TRUE : ATMO_FALSE;
175 ATMO_BOOL CAtmoDmxSerialConnection::setChannelValues(int numValues,unsigned char *channel_values)
178 if((numValues & 1) || !channel_values)
179 return ATMO_FALSE; // numValues must be even!
182 the array shall contain
188 for (int i = 0; i < numValues; i+=2) {
189 dmxIndex = ((int)channel_values[i]) + 2;
190 DMXout[dmxIndex] = channel_values[i+1];
193 WriteFile(m_hComport, DMXout, 259, &iBytesWritten, NULL);
195 iBytesWritten = write(m_hComport, DMXout, 259);
201 return (iBytesWritten == 259) ? ATMO_TRUE : ATMO_FALSE;
205 ATMO_BOOL CAtmoDmxSerialConnection::setChannelColor(int channel, tRGBColor color)
211 DMXout[channel+0+2]=color.r;
212 DMXout[channel+1+2]=color.g;
213 DMXout[channel+2+2]=color.b;
216 WriteFile(m_hComport, DMXout, 259, &iBytesWritten, NULL);
218 iBytesWritten = write(m_hComport, DMXout, 259);
225 return (iBytesWritten == 259) ? ATMO_TRUE : ATMO_FALSE;
228 ATMO_BOOL CAtmoDmxSerialConnection::CreateDefaultMapping(CAtmoChannelAssignment *ca)
230 if(!ca) return ATMO_FALSE;
231 ca->setSize( getNumChannels() );
232 for(int i = 0; i < getNumChannels(); i++)
233 ca->setZoneIndex(i , i);
237 #if !defined(_ATMO_VLC_PLUGIN_)
239 char *CAtmoDmxSerialConnection::getChannelName(int ch)
241 if(ch < 0) return NULL;
246 sprintf(buf,"Summenkanal [%d]",ch);
249 sprintf(buf,"Linker Kanal [%d]",ch);
252 sprintf(buf,"Rechter Kanal [%d]",ch);
255 sprintf(buf,"Oberer Kanal [%d]",ch);
258 sprintf(buf,"Unterer Kanal [%d]",ch);
261 sprintf(buf,"Kanal [%d]",ch);
268 ATMO_BOOL CAtmoDmxSerialConnection::ShowConfigDialog(HINSTANCE hInst, HWND parent, CAtmoConfig *cfg)
270 CDmxConfigDialog *dlg = new CDmxConfigDialog(hInst, parent, cfg);
272 INT_PTR result = dlg->ShowModal();
285 int CAtmoDmxSerialConnection::getNumChannels()
287 return m_pAtmoConfig->getDMX_RGB_Channels();