#include #include "TeleWrapper.h" extern "C" { #include "serial.h" } bool TeleWrapper::start() { LOG_INFO << "TeleWrapper::start" << LOG_ENDL; fd = serialOpen(PORT, BAUD); running = true; pthread_mutex_init(&mutex, NULL); // 初始化互斥对象,动态加锁 cond = PTHREAD_COND_INITIALIZER; int ret = pthread_create(&tel_thid, NULL, TeleWrapper::tel_thd, this); if(ret != 0) { LOGP(ERROR, "pthread_create: %s/n", strerror(ret)); running = false; return false; } return true; } void TeleWrapper::stop() { LOG_INFO << "TeleWrapper::stop" << LOG_ENDL; if (!running) return; running = false; pthread_join(tel_thid, NULL);//阻塞线程,等待线程 pthread_mutex_destroy(&mutex); serialClose(fd); } void TeleWrapper::popTask() { TeleTask curTask = telQueue.front(); telQueue.pop(); switch(curTask.command) { case TeleTask::CALL: //打电话 callNum(curTask.param); break; case TeleTask::HANGUP: // 挂机 hang(); break; } } void TeleWrapper::pushTask(TeleTask task) { telQueue.push(task); pthread_mutex_unlock(&mutex); //pthread_cond_signal(&cond); //pthread_mutex_lock(&mutex); //thread_resume(); //唤醒线程 } void * TeleWrapper::tel_thd(void *arg) //线程函数 { LOG_INFO << "TeleWrapper::tel_thd start" << LOG_ENDL; TeleWrapper& teleWrapper = *(TeleWrapper*)arg; while(teleWrapper.running) { if(teleWrapper.telQueue.empty()) pthread_mutex_lock(&teleWrapper.mutex); if(teleWrapper.telQueue.empty()) continue; teleWrapper.popTask(); } pthread_mutex_unlock(&teleWrapper.mutex); LOG_INFO << "TeleWrapper::tel_thd stop" << LOG_ENDL; } void TeleWrapper::callNum(char phone) { switch (phone) { case '1': serialWriteString(fd, "DA");//1 break; case '2': serialWriteString(fd, "DB");//2 break; case '3': serialWriteString(fd, "DC");//3 break; case '4': serialWriteString(fd, "DD");//4 break; case '5': serialWriteString(fd, "DE");//5 break; case '6': serialWriteString(fd, "DF");//6 break; case '7': serialWriteString(fd, "DG");//7 break; case '8': serialWriteString(fd, "DH");//8 break; case '9': serialWriteString(fd, "DI");//9 break; case '0': serialWriteString(fd, "DJ");//0 break; } } void TeleWrapper::callNum(const std::string phone) { serialWriteString(fd, "BA"); serialWriteString(fd, "AA");//摘机 sleep(1); const char* _phone = phone.c_str(); while (*_phone) { sleep(1); callNum(*(_phone++)); } } void TeleWrapper::hang() { sleep(40); serialWriteString(fd, "BA"); }