亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? gsm_unix_serial.c

?? Gsm手機(短信息,電話簿)開發庫C++源代碼
?? C
字號:
// *************************************************************************
// * GSM TA/ME library
// *
// * File:    gsm_unix_port.cc
// *
// * Purpose: UNIX serial port implementation
// *
// * Author:  Peter Hofmann (software@pxh.de)
// *
// * Created: 10.5.1999
// *************************************************************************

#ifdef HAVE_CONFIG_H
#include <gsm_config.h>
#endif
#include <gsmlib/gsm_nls.h>
#include <gsmlib/gsm_unix_serial.h>
#include <gsmlib/gsm_util.h>
#include <termios.h>
#include <fcntl.h>
#include <iostream>
#include <strstream>
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <signal.h>
#include <pthread.h>

using namespace std;
using namespace gsmlib;

static const int holdoff[] = {2000000, 1000000, 400000};
static const int holdoffArraySize = sizeof(holdoff)/sizeof(int);
  
// alarm handling for socket read/write
// the timerMtx is necessary since several threads cannot use the
// timer indepently of each other

static pthread_mutex_t timerMtx = PTHREAD_MUTEX_INITIALIZER;

// for non-GNU systems, define alarm()
#ifndef HAVE_ALARM
unsigned int alarm(unsigned int seconds)
{
  struct itimerval old, newt;
  newt.it_interval.tv_usec = 0;
  newt.it_interval.tv_sec = 0;
  newt.it_value.tv_usec = 0;
  newt.it_value.tv_sec = (long int)seconds;
  if (setitimer(ITIMER_REAL, &newt, &old) < 0)
    return 0;
  else
    return old.it_value.tv_sec;
}
#endif

// this routine is called in case of a timeout
static void catchAlarm(int)
{
  // do nothing
}

// start timer
static void startTimer()
{
  pthread_mutex_lock(&timerMtx);
  struct sigaction newAction;
  newAction.sa_handler = catchAlarm;
  newAction.sa_flags = 0;
  sigaction(SIGALRM, &newAction, NULL);
  alarm(1);
}

// reset timer
static void stopTimer()
{
  alarm(0);
  sigaction(SIGALRM, NULL, NULL);
  pthread_mutex_unlock(&timerMtx);
}

// UnixSerialPort members

void UnixSerialPort::throwModemException(string message) throw(GsmException)
{
  ostrstream os;
  os << message << " (errno: " << errno << "/" << strerror(errno) << ")"
     << ends;
  char *ss = os.str();
  string s(ss);
  delete[] ss;
  throw GsmException(s, OSError, errno);
}

void UnixSerialPort::putBack(char c)
{
  assert(_oldChar == -1);
  _oldChar = c;
}

int UnixSerialPort::readByte() throw(GsmException)
{
  if (_oldChar != -1)
  {
    int result = _oldChar;
    _oldChar = -1;
    return result;
  }

  unsigned char c;
  int timeElapsed = 0;
  struct timeval oneSecond;
  bool readDone = false;

  while (! readDone && timeElapsed < _timeoutVal)
  {
    if (interrupted())
      throwModemException(_("interrupted when reading from TA"));

    // setup fd_set data structure for select()
    fd_set fdSet;
    oneSecond.tv_sec = 1;
    oneSecond.tv_usec = 0;
    FD_ZERO(&fdSet);
    FD_SET(_fd, &fdSet);

    switch (select(FD_SETSIZE, &fdSet, NULL, NULL, &oneSecond))
    {
    case 1:
    {
      int res = read(_fd, &c, 1);
      if (res != 1)
        return -1;
      else
        readDone = true;
      break;
    }
    case 0:
      ++timeElapsed;
      break;
    default:
      if (errno != EINTR)
        throwModemException(_("reading from TA"));
      break;
    }
  }
  if (! readDone)
    throwModemException(_("timeout when reading from TA"));

#ifndef NDEBUG
  if (debugLevel() >= 2)
  {
    // some useful debugging code
    if (c == LF)
      cerr << "<LF>";
    else if (c == CR)
      cerr << "<CR>";
    else cerr << "<'" << (char) c << "'>";
    cerr.flush();
  }
#endif
  return c;
}

UnixSerialPort::UnixSerialPort(string device, speed_t lineSpeed,
                               string initString, bool swHandshake)
  throw(GsmException) :
  _oldChar(-1), _timeoutVal(TIMEOUT_SECS)
{
  struct termios t;

  // open device
  _fd = open(device.c_str(), O_RDWR | O_NOCTTY | O_NONBLOCK);
  if (_fd == -1)
    throwModemException(stringPrintf(_("opening device '%s'"),
                                     device.c_str()));

  // switch off non-blocking mode
  int fdFlags;
  if ((fdFlags = fcntl(_fd, F_GETFL)) == -1)
    throwModemException(_("getting file status flags failed"));
  fdFlags &= ~O_NONBLOCK;
  if (fcntl(_fd, F_SETFL, fdFlags) == -1)
    throwModemException(_("switching of non-blocking mode failed"));

  long int saveTimeoutVal = _timeoutVal;
  _timeoutVal = 3;
  int initTries = holdoffArraySize;
  while (initTries-- > 0)
  {
    // flush all pending output
    tcflush(_fd, TCOFLUSH);

    // toggle DTR to reset modem
    int mctl = TIOCM_DTR;
    if (ioctl(_fd, TIOCMBIC, &mctl) < 0)
      throwModemException(_("clearing DTR failed"));
    // the waiting time for DTR toggling is increased with each loop
    usleep(holdoff[initTries]);
    if (ioctl(_fd, TIOCMBIS, &mctl) < 0)
      throwModemException(_("setting DTR failed"));
  
    // get line modes
    if (tcgetattr(_fd, &t) < 0)
      throwModemException(stringPrintf(_("tcgetattr device '%s'"),
                                       device.c_str()));

    // set line speed
    cfsetispeed(&t, lineSpeed);
    cfsetospeed(&t, lineSpeed);

    // set the device to a sane state
    t.c_iflag |= IGNPAR | (swHandshake ? IXON | IXOFF : 0);
    t.c_iflag &= ~(INPCK | ISTRIP | IMAXBEL |
                   (swHandshake ? 0 : IXON |  IXOFF)
                   | IXANY | IGNCR | ICRNL | IMAXBEL | INLCR | IGNBRK);
    t.c_oflag &= ~(OPOST);
    // be careful, only touch "known" flags
    t.c_cflag &= ~(CSIZE | CSTOPB | PARENB | PARODD |
                  (swHandshake ? CRTSCTS : 0 ));
    t.c_cflag |= CS8 | CREAD | HUPCL | (swHandshake ? 0 : CRTSCTS) | CLOCAL;
    t.c_lflag &= ~(ECHO | ECHOE | ECHOPRT | ECHOK | ECHOKE | ECHONL |
                   ECHOCTL | ISIG | IEXTEN | TOSTOP | FLUSHO | ICANON);
    t.c_lflag |= NOFLSH;
    t.c_cc[VMIN] = 1;
    t.c_cc[VTIME] = 0;

    t.c_cc[VSUSP] = 0;

    // write back
    if(tcsetattr (_fd, TCSANOW, &t) < 0)
      throwModemException(stringPrintf(_("tcsetattr device '%s'"),
                                       device.c_str()));
    // the waiting time for writing to the ME/TA is increased with each loop
    usleep(holdoff[initTries]);

    // flush all pending input
    tcflush(_fd, TCIFLUSH);

    try
    {
      // reset modem
      putLine("ATZ");
      bool foundOK = false;
      int readTries = 5;
      while (readTries-- > 0)
      {
        // for the first call getLine() waits only 3 seconds
        // because of _timeoutVal = 3
        string s = getLine();
        if (s.find("OK") != string::npos ||
            s.find("CABLE: GSM") != string::npos)
        {
          foundOK = true;
          readTries = 0;           // found OK, exit loop
        }
      }

      // set getLine/putLine timeout back to old value
      _timeoutVal = saveTimeoutVal;

      if (foundOK)
      {
        // init modem
        readTries = 5;
        putLine("AT" + initString);
        while (readTries-- > 0)
        {
          string s = getLine();
          if (s.find("OK") != string::npos ||
              s.find("CABLE: GSM") != string::npos)
            return;                 // found OK, return
        }
      }
    }
    catch (GsmException &e)
    {
      _timeoutVal = saveTimeoutVal;
      if (initTries == 0)
        throw e;
    }
  }
  // no response after 3 tries
  throw GsmException(stringPrintf(_("reset modem failed '%s'"),
                                  device.c_str()), OtherError);
}

string UnixSerialPort::getLine() throw(GsmException)
{
  string result;
  int c;
  while ((c = readByte()) >= 0)
  {
    while (c == CR)
    {
      c = readByte();
    }
    if (c == LF)
      break;
    result += c;
  }

#ifndef NDEBUG
  if (debugLevel() >= 1)
    cerr << "<-- " << result << endl;
#endif

  return result;
}

void UnixSerialPort::putLine(string line,
                             bool carriageReturn) throw(GsmException)
{
#ifndef NDEBUG
  if (debugLevel() >= 1)
    cerr << "--> " << line << endl;
#endif

  if (carriageReturn) line += CR;
  const char *l = line.c_str();
  
  int timeElapsed = 0;
  struct timeval oneSecond;

  ssize_t bytesWritten = 0;
  while (bytesWritten < (ssize_t)line.length() && timeElapsed < _timeoutVal)
  {
    if (interrupted())
      throwModemException(_("interrupted when writing to TA"));

    // setup fd_set data structure for select()
    fd_set fdSet;
    oneSecond.tv_sec = 1;
    oneSecond.tv_usec = 0;
    FD_ZERO(&fdSet);
    FD_SET(_fd, &fdSet);

    switch (select(FD_SETSIZE, NULL, &fdSet, NULL, &oneSecond))
    {
    case 1:
    {
      ssize_t bw = write(_fd, l + bytesWritten, line.length() - bytesWritten);
      if (bw < 0)
        throwModemException(_("writing to TA"));
      bytesWritten += bw;
      break;
    }
    case 0:
      ++timeElapsed;
      break;
    default:
      if (errno != EINTR)
        throwModemException(_("writing to TA"));
      break;
    }
  }
  
  while (timeElapsed < _timeoutVal)
  {
    if (interrupted())
      throwModemException(_("interrupted when writing to TA"));
    startTimer();
    int res = tcdrain(_fd);     // wait for output to be read by TA
    stopTimer();
    if (res == 0)
      break;
    else
    {
      assert(errno == EINTR);
      ++timeElapsed;
    }
  }
  if (timeElapsed >= _timeoutVal)
    throwModemException(_("timeout when writing to TA"));

  // echo CR LF must be removed by higher layer functions in gsm_at because
  // in order to properly handle unsolicited result codes from the ME/TA
}

bool UnixSerialPort::wait(GsmTime timeout) throw(GsmException)
{
  fd_set fds;
  FD_ZERO(&fds);
  FD_SET(_fd, &fds);
  return select(FD_SETSIZE, &fds, NULL, NULL, timeout) != 0;
}

// set timeout for read or write in seconds.
void UnixSerialPort::setTimeOut(unsigned int timeout)
{
  _timeoutVal = timeout;
}

UnixSerialPort::~UnixSerialPort()
{
  if (_fd != -1)
    close(_fd);
}

speed_t gsmlib::baudRateStrToSpeed(string baudrate) throw(GsmException)
{
  if (baudrate == "300")
    return B300;
  else if (baudrate == "600")
    return B600;
  else if (baudrate == "1200")
    return B1200;
  else if (baudrate == "2400")
    return B2400;
  else if (baudrate == "4800")
    return B4800;
  else if (baudrate == "9600")
    return B9600;
  else if (baudrate == "19200")
    return B19200;
  else if (baudrate == "38400")
    return B38400;
#ifdef B57600
  else if (baudrate == "57600")
    return B57600;
#endif
#ifdef B115200
  else if (baudrate == "115200")
    return B115200;
#endif
#ifdef B230400
  else if (baudrate == "230400")
    return B230400;
#endif
#ifdef B460800
  else if (baudrate == "460800")
    return B460800;
#endif
  else
    throw GsmException(stringPrintf(_("unknown baudrate '%s'"),
                                    baudrate.c_str()), ParameterError);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
福利一区二区在线观看| 欧美三级日本三级少妇99| 色偷偷88欧美精品久久久| 欧美一区二区私人影院日本| 国产精品狼人久久影院观看方式| 五月天婷婷综合| fc2成人免费人成在线观看播放 | 欧美巨大另类极品videosbest | 99精品视频中文字幕| 日韩视频免费观看高清在线视频| 国产欧美日韩三区| 美女脱光内衣内裤视频久久网站| 色婷婷精品大视频在线蜜桃视频| 久久蜜桃av一区二区天堂| 婷婷久久综合九色综合绿巨人| 99麻豆久久久国产精品免费优播| 欧美v亚洲v综合ⅴ国产v| 亚洲一区二区av在线| 99久精品国产| 国产精品―色哟哟| 国产精品亚洲视频| 久久久久国产精品麻豆| 国内成人免费视频| 日韩欧美在线影院| 免费高清成人在线| 制服丝袜亚洲精品中文字幕| 亚洲综合视频网| 欧美性受极品xxxx喷水| 最新国产成人在线观看| 成人美女视频在线观看| 欧美激情艳妇裸体舞| 国产风韵犹存在线视精品| 久久婷婷综合激情| 国产一区二区三区观看| 2020国产精品| 国产一区二区三区高清播放| 国产亚洲综合在线| 粉嫩在线一区二区三区视频| 国产日韩精品一区二区三区在线| 国产精品一区二区久久精品爱涩| 久久综合精品国产一区二区三区| 精品一区免费av| 久久久亚洲国产美女国产盗摄| 韩国精品一区二区| 久久精品人人做人人综合 | 欧洲一区二区三区在线| 亚洲精品成人a在线观看| 色狠狠色噜噜噜综合网| 婷婷成人综合网| 精品成人一区二区| 成人免费毛片嘿嘿连载视频| 亚洲图片另类小说| 欧美日韩在线观看一区二区 | 成人性生交大片免费看视频在线| 欧美—级在线免费片| 99视频在线精品| 五月天欧美精品| 久久综合九色综合97婷婷| 99久久精品免费看| 五月婷婷综合在线| 国产视频911| 在线视频国内一区二区| 免费精品99久久国产综合精品| 久久综合久久综合亚洲| 91在线观看一区二区| 午夜影院在线观看欧美| 久久中文娱乐网| 色婷婷精品久久二区二区蜜臀av| 麻豆一区二区三区| 亚洲色图欧美激情| 26uuu久久天堂性欧美| 99精品热视频| 开心九九激情九九欧美日韩精美视频电影 | 天天综合色天天综合色h| 国产亚洲欧美一区在线观看| 色女孩综合影院| 久久电影国产免费久久电影 | 不卡的电视剧免费网站有什么| 亚洲国产成人av网| 久久精品人人做人人综合| 欧美色图激情小说| 成人成人成人在线视频| 免费成人在线网站| 一区二区成人在线视频| 久久九九久精品国产免费直播| 色狠狠色狠狠综合| 美女被吸乳得到大胸91| 一区二区欧美视频| 国产日产欧美精品一区二区三区| 欧美精品一二三| 91色在线porny| 处破女av一区二区| 黄页视频在线91| 日本美女视频一区二区| 亚洲欧美日韩中文播放| 日本一区二区综合亚洲| 久久影院电视剧免费观看| 欧美三级中文字| 一本一本大道香蕉久在线精品| 国产一区二区三区四| 美女视频黄免费的久久| 一区二区三区91| 亚洲精品中文字幕乱码三区| 国产精品少妇自拍| 精品久久久久久久久久久久久久久 | 一区二区三区美女| 中文字幕日韩av资源站| 国产精品久久久久影院色老大 | 欧美一级二级在线观看| 欧美日韩精品一区二区三区四区| 91在线你懂得| 99国内精品久久| 不卡av电影在线播放| 国产一区二区在线看| 久久电影网站中文字幕| 激情综合亚洲精品| 久久精品国产免费| 久久99精品一区二区三区三区| 日本欧美一区二区| 青青国产91久久久久久| 亚洲va在线va天堂| 美女一区二区在线观看| 麻豆国产欧美一区二区三区| 麻豆一区二区99久久久久| 久久99深爱久久99精品| 极品少妇一区二区三区精品视频 | 99久久精品国产观看| jizzjizzjizz欧美| 欧美在线观看一区二区| 欧美日韩国产另类一区| 欧美一二区视频| 久久久影视传媒| 国产精品网友自拍| 亚洲综合丁香婷婷六月香| 亚洲国产精品综合小说图片区| 五月天久久比比资源色| 韩国三级在线一区| 福利一区福利二区| 91福利在线导航| 日韩三级免费观看| 国产色一区二区| 一区二区三区在线观看欧美| 日韩不卡一区二区| 国产不卡在线播放| 91黄色激情网站| 日韩精品一区二区三区视频| 国产日产欧美一区二区视频| 亚洲免费大片在线观看| 免费成人av在线播放| 成人免费黄色在线| 中文字幕在线观看一区| 亚洲成人免费看| 国产乱码字幕精品高清av| 一本到高清视频免费精品| 884aa四虎影成人精品一区| 久久精品视频网| 亚洲高清不卡在线| 国产精品自在在线| 欧美性感一类影片在线播放| 26uuu亚洲综合色欧美| 亚洲最快最全在线视频| 极品瑜伽女神91| 欧美性猛交xxxxxx富婆| 国产亚洲成aⅴ人片在线观看| 亚洲激情欧美激情| 国产成人精品一区二区三区四区| 欧美性猛交xxxx黑人交| 国产人伦精品一区二区| 天天色天天操综合| 一本色道**综合亚洲精品蜜桃冫| 精品精品国产高清a毛片牛牛 | 欧美日韩在线播| 国产欧美在线观看一区| 婷婷成人综合网| 日本乱人伦aⅴ精品| 久久嫩草精品久久久久| 视频一区二区不卡| 91网上在线视频| 中文字幕 久热精品 视频在线| 日本人妖一区二区| 欧美日韩三级视频| 亚洲欧洲在线观看av| 国产九色精品成人porny| 日韩午夜激情电影| 亚洲电影第三页| 色综合av在线| 1000精品久久久久久久久| 国产九色精品成人porny| 欧美大胆人体bbbb| 日本三级韩国三级欧美三级| 欧美日韩国产高清一区| 亚洲国产视频直播| 欧美性欧美巨大黑白大战| 一区二区三区高清在线| 91免费精品国自产拍在线不卡| 国产欧美一区二区精品仙草咪| 麻豆精品视频在线| 欧美刺激脚交jootjob| 精品一区二区三区视频| 精品免费视频一区二区|