From 8fe8572729f186269b02ac2bb149fe9a25671cae Mon Sep 17 00:00:00 2001 From: Comment Date: Wed, 5 Dec 2012 22:10:04 +0000 Subject: asterisk with thread --- ofAsterisk/src/Asterisk.cpp | 103 +++++++++++++++++++++++++++----------------- ofAsterisk/src/Asterisk.h | 22 ++++++++-- ofAsterisk/src/testApp.cpp | 10 ++--- 3 files changed, 84 insertions(+), 51 deletions(-) (limited to 'ofAsterisk') diff --git a/ofAsterisk/src/Asterisk.cpp b/ofAsterisk/src/Asterisk.cpp index 7c4f050..b78678e 100755 --- a/ofAsterisk/src/Asterisk.cpp +++ b/ofAsterisk/src/Asterisk.cpp @@ -14,89 +14,117 @@ std::vector &split(const std::string &s, char delim, std::vector lines; + split(msg,'\n',lines); + queued=0; + for (int i=4;i0) startThread(true, false); // blocking, verbose } - void Asterisk::startGame(){ - if (state==IDLE) { + if (!isPlaying&&queued) { cmd("ssh 80.93.22.22 'sudo /usr/sbin/asterisk -rx \"devstate change Custom:GAME NOT_INUSE\"'"); printf("Asterisk: attempting to dequeue\n"); - state=STARTING; + state=WAITING; } } void Asterisk::endGame(string score){ - if (state==PLAYING) { + printf("Asterisk: request hangup %s\n",playerCode.c_str()); + if (isPlaying) { cmd("ssh 80.93.22.22 'sudo /usr/sbin/asterisk -rx \"database put GAME statuscode "+score+"\"'"); string emsg="ssh 80.93.22.22 'sudo /usr/sbin/asterisk -rx \"hangup request "+playerCode+"\"'"; - printf("%s\n",emsg.c_str()); cmd(emsg); printf("Asterisk: hanging up %s\n",playerCode.c_str()); state=WAITING; + isPlaying=false; } } void Asterisk::cmd(string s) { + //non blocking command for anync messages file = popen(s.c_str(), "re"); filenum=fileno(file); - fcntl(filenum, F_SETFL, O_NONBLOCK); -} - -/* -gameQ has 1 calls (max unlimited) in 'rrmemory' strategy (8s holdtime, 50s talktime), W:0, C:38, A:26, SL:36.8% within 0s - Members: - Game AGI (Local/9999@default) with penalty 1 (In use) has taken 31 calls (last was 5333 secs ago) - Callers: - 1. SIP/sip_proxy-00000045 (wait: 0:06, prio: 0) -*/ - -void Asterisk::requestStatus(){ - cmd("ssh 80.93.22.22 'sudo /usr/sbin/asterisk -rx \"queue show gameQ\"'"); - state=WAITING; + fcntl(filenum, F_SETFL, O_NONBLOCK); } int Asterisk::update(){ //capture stdin response from popen if (state==WAITING||state==STARTING) { - char buf[1000]; + char buf[100]; ssize_t r = read(filenum, buf, 1000); //if (r == -1 && errno == EAGAIN) //no data yet - //else + //else if (r > 0) { pclose(file); string msg=string(buf); + state=IDLE; //received data is always a command ACKNOWLEDGEMENT - if (msg.compare("Changing GAME to NOT_INUSE")==0) { + //can never issue a new one until last one returns? + if (msg.compare(0,8,"Changing")==0) { printf("player dequeued\n"); - state=PLAYING; - } - else if (msg.compare(0,5,"gameQ")==0) { - vector lines; - split(msg,'\n',lines); - queued=0; - for (int i=4;i3) { //printf("status msg: %s\n",msg.c_str()); if (msg.substr(0,5)=="Local") { @@ -114,8 +142,3 @@ int Asterisk::update(){ else return 0; } -Asterisk::~Asterisk() -{ - pclose(file); - //dtor -} diff --git a/ofAsterisk/src/Asterisk.h b/ofAsterisk/src/Asterisk.h index d3e3786..5033a5c 100755 --- a/ofAsterisk/src/Asterisk.h +++ b/ofAsterisk/src/Asterisk.h @@ -10,26 +10,40 @@ #define PLAYING 3 -class Asterisk +class Asterisk: public ofThread { public: - Asterisk(string passcode="1111"); + Asterisk(){ + } + + void start(){ + + } + void stop(){ + stopThread(); + } + + //-------------------------- + + void setup(string passcode="1111",int millis=1000); virtual ~Asterisk(); void startGame(); void endGame(string score); int update(); - void requestStatus(); int state; + bool isPlaying; int queued; protected: - void cmd(string s); + void cmd(string s); + void threadedFunction(); private: int startTime; FILE *file; int filenum; ofxUDPManager udpConnection; string playerCode; + int statusPollMillis; }; diff --git a/ofAsterisk/src/testApp.cpp b/ofAsterisk/src/testApp.cpp index 1a172ee..772a9b6 100755 --- a/ofAsterisk/src/testApp.cpp +++ b/ofAsterisk/src/testApp.cpp @@ -2,16 +2,12 @@ //-------------------------------------------------------------- void testApp::setup(){ - queuecheck=0; + game.setup("1122",2000); } //-------------------------------------------------------------- void testApp::update(){ int ret=game.update(); - if (ofGetElapsedTimeMillis()-queuecheck>5000) { - game.requestStatus(); - queuecheck=ofGetElapsedTimeMillis(); - } } //-------------------------------------------------------------- @@ -70,6 +66,6 @@ void testApp::gotMessage(ofMessage msg){ } //-------------------------------------------------------------- -void testApp::dragEvent(ofDragInfo dragInfo){ +void testApp::dragEvent(ofDragInfo dragInfo){ -} \ No newline at end of file +} -- cgit v1.2.3