AtmoSerialConnection.cpp
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:7k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*
  2.  * AtmoSerialConnection.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: 3d1975a814a7605cb1c3f7225ada17aca95d082d $
  8.  */
  9. #include "AtmoDefs.h"
  10. #include "AtmoSerialConnection.h"
  11. #include <stdio.h>
  12. #include <fcntl.h>
  13. #include <sys/stat.h>
  14. #if !defined(WIN32)
  15. #include <termios.h>
  16. #include <unistd.h>
  17. #endif
  18. /*
  19. #include <sys/types.h>
  20. #include <sys/stat.h>
  21. #include <fcntl.h>
  22. #include <string.h>
  23. #include <termios.h>
  24. #include <unistd.h>
  25. #include <vdr/tools.h>
  26. */
  27. CAtmoSerialConnection::CAtmoSerialConnection(CAtmoConfig *cfg) : CAtmoConnection(cfg) {
  28.     m_hComport = INVALID_HANDLE_VALUE;
  29. }
  30. CAtmoSerialConnection::~CAtmoSerialConnection() {
  31.    CloseConnection();
  32. }
  33. ATMO_BOOL CAtmoSerialConnection::OpenConnection() {
  34. #if defined(_ATMO_VLC_PLUGIN_)
  35.      char *serdevice = m_pAtmoConfig->getSerialDevice();
  36.      if(!serdevice)
  37.         return ATMO_FALSE;
  38. #else
  39.      int portNummer = m_pAtmoConfig->getComport();
  40.      m_dwLastWin32Error = 0;
  41.  if(portNummer < 1) return ATMO_FALSE; // make no real sense;-)
  42. #endif
  43.  CloseConnection();
  44. #if !defined(_ATMO_VLC_PLUGIN_)
  45.      char comport[16];  // com4294967295
  46.      sprintf(comport,"com%d",portNummer);
  47. #endif
  48. #if defined(WIN32)
  49. #  if defined(_ATMO_VLC_PLUGIN_)
  50.      m_hComport = CreateFile(serdevice, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
  51. #  else
  52.      m_hComport = CreateFile(comport, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
  53. #  endif
  54.      if(m_hComport == INVALID_HANDLE_VALUE) {
  55. //      we have a problem here can't open com port... somebody else may use it?
  56. //     m_dwLastWin32Error = GetLastError();
  57.     return ATMO_FALSE;
  58.      }
  59.      /* change serial settings (Speed, stopbits etc.) */
  60.      DCB dcb; // für comport-parameter
  61.      dcb.DCBlength = sizeof(DCB);
  62.      GetCommState (m_hComport, &dcb); // ger current serialport settings
  63.      dcb.BaudRate  = 38400;        // set speed
  64.      dcb.ByteSize  = 8;            // set databits
  65.      dcb.Parity    = NOPARITY;     // set parity
  66.      dcb.StopBits  = ONESTOPBIT;   // set one stop bit
  67.      SetCommState (m_hComport, &dcb);    // apply settings
  68. #else
  69.      int bconst = B38400;
  70. #  if defined(_ATMO_VLC_PLUGIN_)
  71.      m_hComport = open(serdevice,O_RDWR |O_NOCTTY);
  72. #  else
  73.      m_hComport = open(comport,O_RDWR | O_NOCTTY);
  74. #  endif
  75.      if(m_hComport < 0) {
  76.     return ATMO_FALSE;
  77.      }
  78.      struct termios tio;
  79.      memset(&tio,0,sizeof(tio));
  80.      tio.c_cflag = (CS8 | CREAD | HUPCL | CLOCAL);
  81.      tio.c_iflag = (INPCK | BRKINT);
  82.      cfsetispeed(&tio, bconst);
  83.      cfsetospeed(&tio, bconst);
  84.      if(!tcsetattr(m_hComport, TCSANOW, &tio)) {
  85.          tcflush(m_hComport, TCIOFLUSH);
  86.      } else {
  87.          // can't change parms
  88.         close(m_hComport);
  89.         m_hComport = -1;
  90.         return false;
  91.      }
  92. #endif
  93.      return true;
  94. }
  95. void CAtmoSerialConnection::CloseConnection() {
  96.   if(m_hComport!=INVALID_HANDLE_VALUE) {
  97. #if defined(WIN32)
  98.      CloseHandle(m_hComport);
  99. #else
  100.      close(m_hComport);
  101. #endif
  102.  m_hComport = INVALID_HANDLE_VALUE;
  103.   }
  104. }
  105. ATMO_BOOL CAtmoSerialConnection::isOpen(void) {
  106.  return (m_hComport != INVALID_HANDLE_VALUE);
  107. }
  108. ATMO_BOOL CAtmoSerialConnection::HardwareWhiteAdjust(int global_gamma,
  109.                                                      int global_contrast,
  110.                                                      int contrast_red,
  111.                                                      int contrast_green,
  112.                                                      int contrast_blue,
  113.                                                      int gamma_red,
  114.                                                      int gamma_green,
  115.                                                      int gamma_blue,
  116.                                                      ATMO_BOOL storeToEeprom) {
  117.      if(m_hComport == INVALID_HANDLE_VALUE)
  118.         return ATMO_FALSE;
  119.      DWORD iBytesWritten;
  120. /*
  121. [0] = 255
  122. [1] = 00
  123. [2] = 00
  124. [3] = 101
  125. [4]  brightness  0..255 ?
  126. [5]  Contrast Red     11 .. 100
  127. [6]  Contrast  Green  11 .. 100
  128. [7]  Contrast  Blue   11 .. 100
  129. [8]   Gamma Red    11 .. 35
  130. [9]   Gamma Red    11 .. 35
  131. [10]  Gamma Red    11 .. 35
  132. [11]  Globale Contrast  11 .. 100
  133. [12]  Store Data: 199 (else 0)
  134. */
  135.      unsigned char sendBuffer[16];
  136.      sendBuffer[0] = 0xFF;
  137.      sendBuffer[1] = 0x00;
  138.      sendBuffer[2] = 0x00;
  139.      sendBuffer[3] = 101;
  140.      sendBuffer[4] = (global_gamma & 255);
  141.      sendBuffer[5] = (contrast_red & 255);
  142.      sendBuffer[6] = (contrast_green & 255);
  143.      sendBuffer[7] = (contrast_blue & 255);
  144.      sendBuffer[8]  = (gamma_red & 255);
  145.      sendBuffer[9]  = (gamma_green & 255);
  146.      sendBuffer[10] = (gamma_blue & 255);
  147.      sendBuffer[11] = (global_contrast & 255);
  148.      if(storeToEeprom == ATMO_TRUE)
  149.         sendBuffer[12] = 199; // store to eeprom!
  150.      else
  151.         sendBuffer[12] = 0;
  152. #if defined(WIN32)
  153.      WriteFile(m_hComport, sendBuffer, 13, &iBytesWritten, NULL); // send to COM-Port
  154. #else
  155.      iBytesWritten = write(m_hComport, sendBuffer, 13);
  156.      tcdrain(m_hComport);
  157. #endif
  158.      return (iBytesWritten == 13) ? ATMO_TRUE : ATMO_FALSE;
  159. }
  160. ATMO_BOOL CAtmoSerialConnection::SendData(tColorPacket data) {
  161.    if(m_hComport == INVALID_HANDLE_VALUE)
  162.   return ATMO_FALSE;
  163.    unsigned char buffer[19];
  164.    DWORD iBytesWritten;
  165.    buffer[0] = 0xFF;  // Start Byte
  166.    buffer[1] = 0x00;  // Start channel 0
  167.    buffer[2] = 0x00;  // Start channel 0
  168.    buffer[3] = 15; //
  169.    int iBuffer = 4;
  170.    for(int i=0;i<5;i++) {
  171.        if(m_ChannelAssignment[i]>=0) {
  172.           buffer[iBuffer++] = data.channel[m_ChannelAssignment[i]].r;
  173.           buffer[iBuffer++] = data.channel[m_ChannelAssignment[i]].g;
  174.           buffer[iBuffer++] = data.channel[m_ChannelAssignment[i]].b;
  175.        } else {
  176.           buffer[iBuffer++] = 0;
  177.           buffer[iBuffer++] = 0;
  178.           buffer[iBuffer++] = 0;
  179.        }
  180.    }
  181. #if defined(WIN32)
  182.    WriteFile(m_hComport, buffer, 19, &iBytesWritten, NULL); // send to COM-Port
  183. #else
  184.    iBytesWritten = write(m_hComport, buffer, 19);
  185.    tcdrain(m_hComport);
  186. #endif
  187.    return (iBytesWritten == 19) ? ATMO_TRUE : ATMO_FALSE;
  188. }
  189. ATMO_BOOL CAtmoSerialConnection::SendData(unsigned char numChannels,
  190.                                           int red[],
  191.                                           int green[],
  192.                                           int blue[])
  193. {
  194.    if(m_hComport == INVALID_HANDLE_VALUE)
  195.   return ATMO_FALSE;
  196.    DWORD bufSize = 4 + numChannels*3;
  197.    unsigned char *buffer = new unsigned char[bufSize];
  198.    DWORD iBytesWritten;
  199.    buffer[0] = 0xFF;  // Start Byte
  200.    buffer[1] = 0x00;  // Start Kanal 0
  201.    buffer[2] = 0x00;  // Start Kanal 0
  202.    buffer[3] = numChannels * 3; //
  203.    int iBuffer = 4;
  204.    for(int i=0;i<numChannels;i++) {
  205.        if(m_ChannelAssignment[i]>=0) {
  206.           buffer[iBuffer++] = red[m_ChannelAssignment[i]] & 255;
  207.           buffer[iBuffer++] = green[m_ChannelAssignment[i]] & 255;
  208.           buffer[iBuffer++] = blue[m_ChannelAssignment[i]] & 255;
  209.        } else {
  210.           buffer[iBuffer++] = 0;
  211.           buffer[iBuffer++] = 0;
  212.           buffer[iBuffer++] = 0;
  213.        }
  214.    }
  215. #if defined(WIN32)
  216.    WriteFile(m_hComport, buffer, bufSize, &iBytesWritten, NULL);
  217. #else
  218.    iBytesWritten = write(m_hComport, buffer, bufSize);
  219.    tcdrain(m_hComport);
  220. #endif
  221.    delete[] buffer;
  222.    return (iBytesWritten == bufSize) ? ATMO_TRUE : ATMO_FALSE;
  223. }