fix filename self-references
[vlc.git] / modules / video_filter / atmo / MoMoConnection.cpp
1 /*
2  * MoMoConnection.cpp: Class for communication with the serial hardware of
3  * Atmo Light, opens and configures the serial port
4  *
5  * See the README.txt file for copyright information and how to reach the author(s).
6  *
7  * $Id$
8  */
9
10 #ifdef HAVE_CONFIG_H
11 # include "config.h"
12 #endif
13
14 #include "AtmoDefs.h"
15 #include "MoMoConnection.h"
16
17 #if !defined(_ATMO_VLC_PLUGIN_)
18 # include "MoMoConfigDialog.h"
19 #endif
20
21 #include <stdio.h>
22 #include <fcntl.h>
23
24 #if !defined(WIN32)
25 #include <termios.h>
26 #include <unistd.h>
27 #endif
28
29
30 CMoMoConnection::CMoMoConnection(CAtmoConfig *cfg) : CAtmoConnection(cfg) {
31     m_hComport = INVALID_HANDLE_VALUE;
32 }
33
34 CMoMoConnection::~CMoMoConnection() {
35 }
36
37 ATMO_BOOL CMoMoConnection::OpenConnection() {
38 #if defined(_ATMO_VLC_PLUGIN_)
39      char *serdevice = m_pAtmoConfig->getSerialDevice();
40      if(!serdevice)
41         return ATMO_FALSE;
42 #else
43      int portNummer = m_pAtmoConfig->getComport();
44      m_dwLastWin32Error = 0;
45          if(portNummer < 1) return ATMO_FALSE; // make no real sense;-)
46 #endif
47
48          CloseConnection();
49
50 #if !defined(_ATMO_VLC_PLUGIN_)
51      char serdevice[16];  // com4294967295
52      sprintf(serdevice,"com%d",portNummer);
53 #endif
54
55 #if defined(WIN32)
56
57      m_hComport = CreateFile(serdevice, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
58      if(m_hComport == INVALID_HANDLE_VALUE) {
59 //      we have a problem here can't open com port... somebody else may use it?
60 //          m_dwLastWin32Error = GetLastError();
61             return ATMO_FALSE;
62      }
63      /* change serial settings (Speed, stopbits etc.) */
64      DCB dcb; // für comport-parameter
65      dcb.DCBlength = sizeof(DCB);
66      GetCommState (m_hComport, &dcb); // ger current serialport settings
67      dcb.BaudRate  = 9600;        // set speed
68      dcb.ByteSize  = 8;            // set databits
69      dcb.Parity    = NOPARITY;     // set parity
70      dcb.StopBits  = ONESTOPBIT;   // set one stop bit
71      SetCommState (m_hComport, &dcb);    // apply settings
72
73 #else
74
75      int bconst = B9600;
76      m_hComport = open(serdevice,O_RDWR |O_NOCTTY);
77      if(m_hComport < 0) {
78             return ATMO_FALSE;
79      }
80
81      struct termios tio;
82      memset(&tio,0,sizeof(tio));
83      tio.c_cflag = (CS8 | CREAD | HUPCL | CLOCAL);
84      tio.c_iflag = (INPCK | BRKINT);
85      cfsetispeed(&tio, bconst);
86      cfsetospeed(&tio, bconst);
87      if(!tcsetattr(m_hComport, TCSANOW, &tio)) {
88          tcflush(m_hComport, TCIOFLUSH);
89      } else {
90          // can't change parms
91         close(m_hComport);
92         m_hComport = -1;
93         return false;
94      }
95
96 #endif
97
98      return true;
99 }
100
101 void CMoMoConnection::CloseConnection() {
102   if(m_hComport!=INVALID_HANDLE_VALUE) {
103 #if defined(WIN32)
104      CloseHandle(m_hComport);
105 #else
106      close(m_hComport);
107 #endif
108          m_hComport = INVALID_HANDLE_VALUE;
109   }
110 }
111
112 ATMO_BOOL CMoMoConnection::isOpen(void) {
113          return (m_hComport != INVALID_HANDLE_VALUE);
114 }
115
116 ATMO_BOOL CMoMoConnection::SendData(pColorPacket data) {
117    if(m_hComport == INVALID_HANDLE_VALUE)
118           return ATMO_FALSE;
119
120    int channels = getNumChannels();
121    DWORD bufSize = channels * 3;
122    unsigned char *buffer = new unsigned char[ bufSize ];
123    DWORD iBytesWritten;
124
125    Lock();
126    int i_red   = 0;
127    int i_green = channels;
128    int i_blue  = channels * 2;
129    int idx;
130    /*
131      3 ch
132      i_red = 0, i_green = 3, i_blue = 6
133      4 ch
134      i_red = 0, i_green = 4, i_blue = 8
135    */
136
137    for(int i=0; i < channels ; i++) {
138        if(m_ChannelAssignment && (i < m_NumAssignedChannels))
139           idx = m_ChannelAssignment[i];
140        else
141           idx = -1;
142        if((idx>=0) && (idx<data->numColors)) {
143           buffer[i_red++]   = data->zone[idx].r;
144           buffer[i_green++] = data->zone[idx].g;
145           buffer[i_blue++]  = data->zone[idx].b;
146        } else {
147           buffer[i_red++]   = 0;
148           buffer[i_green++] = 0;
149           buffer[i_blue++]  = 0;
150        }
151    }
152
153 #if defined(WIN32)
154    WriteFile(m_hComport, buffer, bufSize, &iBytesWritten, NULL); // send to COM-Port
155 #else
156    iBytesWritten = write(m_hComport, buffer, bufSize);
157    tcdrain(m_hComport);
158 #endif
159    delete []buffer;
160
161    Unlock();
162
163    return (iBytesWritten == bufSize) ? ATMO_TRUE : ATMO_FALSE;
164 }
165
166
167 ATMO_BOOL CMoMoConnection::CreateDefaultMapping(CAtmoChannelAssignment *ca)
168 {
169    if(!ca) return ATMO_FALSE;
170    ca->setSize( getNumChannels() );  // oder 4 ? depending on config!
171    ca->setZoneIndex(0, 0); // Zone 5
172    ca->setZoneIndex(1, 1);
173    ca->setZoneIndex(2, 2);
174    ca->setZoneIndex(3, 3);
175    return ATMO_TRUE;
176 }
177
178 int CMoMoConnection::getNumChannels()
179 {
180    return m_pAtmoConfig->getMoMo_Channels();
181 }
182
183
184 #if !defined(_ATMO_VLC_PLUGIN_)
185
186 char *CMoMoConnection::getChannelName(int ch)
187 {
188   if(ch < 0) return NULL;
189   char buf[30];
190
191   switch(ch) {
192       case 0:
193           sprintf(buf,"Channel [%d]",ch);
194           break;
195       case 1:
196           sprintf(buf,"Channel [%d]",ch);
197           break;
198       case 2:
199           sprintf(buf,"Channel [%d]",ch);
200           break;
201       case 3:
202           sprintf(buf,"Channel [%d]",ch);
203           break;
204       default:
205           sprintf(buf,"Channel [%d]",ch);
206           break;
207   }
208
209   return strdup(buf);
210 }
211
212 ATMO_BOOL CMoMoConnection::ShowConfigDialog(HINSTANCE hInst, HWND parent, CAtmoConfig *cfg)
213 {
214     CMoMoConfigDialog *dlg = new CMoMoConfigDialog(hInst, parent, cfg);
215
216     INT_PTR result = dlg->ShowModal();
217
218     delete dlg;
219
220     if(result == IDOK)
221       return ATMO_TRUE;
222     else
223       return ATMO_FALSE;
224 }
225
226 #endif