diff options
| author | Comment <tim@gray.(none)> | 2012-11-29 19:13:19 +0000 |
|---|---|---|
| committer | Comment <tim@gray.(none)> | 2012-11-29 19:13:19 +0000 |
| commit | 7ae1f870faebb65e9ee3a064fc43ef2fc6955a84 (patch) | |
| tree | 461ad1daea435954a994a2aac0157972d5d51e74 /ofAsterisk/src/Asterisk.cpp | |
| parent | 8ccec15ca16cc78c625d02a56e73ff3b84858197 (diff) | |
work on asterisk plugin
Diffstat (limited to 'ofAsterisk/src/Asterisk.cpp')
| -rwxr-xr-x | ofAsterisk/src/Asterisk.cpp | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/ofAsterisk/src/Asterisk.cpp b/ofAsterisk/src/Asterisk.cpp new file mode 100755 index 0000000..ae85269 --- /dev/null +++ b/ofAsterisk/src/Asterisk.cpp @@ -0,0 +1,86 @@ +#include "Asterisk.h"
+
+
+//there is no notification that there is someone in the queue
+//but there is a status message you can check periodically...
+
+Asterisk::Asterisk()
+{
+ udpConnection.Create();
+ udpConnection.Bind(5000);
+ udpConnection.SetNonBlocking(true);
+ cmd("ssh 80.93.22.22 'sudo /usr/sbin/asterisk -rx \"database put GAME passcode 1234\"'");
+ state=WAITING;
+ printf("Asterisk: created socket and connected to server\n");
+}
+
+void Asterisk::startGame(){
+ if (state!=PLAYING) {
+ 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;
+ }
+}
+void Asterisk::endGame(string score){
+ if (state==PLAYING) {
+ 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;
+ }
+}
+void Asterisk::cmd(string s) {
+ file = popen(s.c_str(), "r");
+ int filenum=fileno(file);
+ //fcntl(filenum, F_SETFL, O_NONBLOCK); //doesn't seem to work, still pauses
+ //pclose(file); //discard the pipe THIS IS BLOCKING
+}
+
+int Asterisk::update(){
+ //how to capture stdin response from popen
+ /*
+ if (state==WAITING||state==STARTING) {
+ char buf[100];
+ ssize_t r = read(filenum, buf, 100);
+ //if (r == -1 && errno == EAGAIN)
+ //no data yet
+ //else
+ if (r > 0)
+ //received data
+ printf("%s\n",buf);
+ pclose(file);
+ state=IDLE;
+ ///else
+ //pipe closed
+ }
+ */
+ //check messages and pipes, returns new keypresses
+ char udpMessage[10000];
+ udpConnection.Receive(udpMessage,10000);
+ string msg=udpMessage;
+ if(msg!=""){
+ printf("Asterisk: %s\n",msg.c_str());
+ if (msg.length()>3) {
+ //printf("status msg: %s\n",msg.c_str());
+ if (msg.substr(0,5)=="Local") {
+ state=PLAYING;
+ playerCode=msg.substr(0,msg.length()-1);
+ printf("Asterisk: game started: code %s\n",playerCode.c_str());
+ return 1000;
+ }
+ return 0;
+ }
+ else {
+ return ofToInt(msg);
+ }
+ }
+ else return 0;
+}
+
+Asterisk::~Asterisk()
+{
+ pclose(file);
+ //dtor
+}
|
