Revision
14674
Author
gmaruzz
Date
2009-08-29 07:07:23 -0500 (Sat, 29 Aug 2009)

Log Message

celliax: makes outbound calls, manage remote answer

Modified Paths

Diff

Modified: freeswitch/branches/gmaruzz/mod_celliax/celliax.h (14673 => 14674)


--- freeswitch/branches/gmaruzz/mod_celliax/celliax.h	2009-08-29 08:12:44 UTC (rev 14673)
+++ freeswitch/branches/gmaruzz/mod_celliax/celliax.h	2009-08-29 12:07:23 UTC (rev 14674)
@@ -119,7 +119,7 @@
 #define WARNINGA(...)  switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, 		"rev "SKYPIAX_SVN_VERSION "[%p|%-7lx][WARNINGA  %-5d][%-10s][%2d,%2d,%2d] " __VA_ARGS__ );
 #define NOTICA(...)  switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_NOTICE, 		"rev "SKYPIAX_SVN_VERSION "[%p|%-7lx][NOTICA  %-5d][%-10s][%2d,%2d,%2d] " __VA_ARGS__ );
 
-#define SKYPIAX_P_LOG NULL, (unsigned long)55, __LINE__, tech_pvt ? tech_pvt->name ? tech_pvt->name : "none" : "none", -1, tech_pvt ? tech_pvt->interface_state : -1, tech_pvt ? tech_pvt->skype_callflow : -1
+#define SKYPIAX_P_LOG NULL, (unsigned long)55, __LINE__, tech_pvt ? tech_pvt->name ? tech_pvt->name : "none" : "none", -1, tech_pvt ? tech_pvt->interface_state : -1, tech_pvt ? tech_pvt->phone_callflow : -1
 
 /*********************************/
 #define SKYPIAX_CAUSE_NORMAL		1
@@ -175,6 +175,7 @@
 #define 	CALLFLOW_STATUS_EARLYMEDIA			24
 #define 	CALLFLOW_INCOMING_CALLID			25
 #define 	CALLFLOW_STATUS_REMOTEHOLD			26
+#define 	CALLFLOW_CALL_REMOTEANSWER			27
 
 /*********************************/
 
@@ -544,6 +545,9 @@
 int celliax_serial_hangup(private_t * tech_pvt);
 int celliax_serial_hangup_AT(private_t * tech_pvt);
 int celliax_hangup(private_t * tech_pvt);
+int celliax_serial_call(private_t * tech_pvt, char *dstr);
+int celliax_serial_call_AT(private_t * tech_pvt, char *dstr);
+
 #ifdef CELLIAX_ALSA
 int alsa_init(private_t * tech_pvt);
 int alsa_shutdown(private_t * tech_pvt);

Modified: freeswitch/branches/gmaruzz/mod_celliax/celliax_protocol.c (14673 => 14674)


--- freeswitch/branches/gmaruzz/mod_celliax/celliax_protocol.c	2009-08-29 08:12:44 UTC (rev 14673)
+++ freeswitch/branches/gmaruzz/mod_celliax/celliax_protocol.c	2009-08-29 12:07:23 UTC (rev 14674)
@@ -2191,24 +2191,24 @@
       }
 
       if ((strcmp(tech_pvt->line_array.result[i], tech_pvt->at_call_active) == 0)) {
-        tech_pvt->phone_callflow = CALLFLOW_CALL_ACTIVE;
-        if (option_debug > 1)
-          DEBUGA_SKYPE("|%s| CALLFLOW_CALL_ACTIVE\n", SKYPIAX_P_LOG,
-                    tech_pvt->line_array.result[i]);
+	      tech_pvt->phone_callflow = CALLFLOW_CALL_ACTIVE;
+	      DEBUGA_SKYPE("|%s| CALLFLOW_CALL_ACTIVE\n", SKYPIAX_P_LOG,
+			      tech_pvt->line_array.result[i]);
 
-        if (tech_pvt->owner && tech_pvt->interface_state == CALLFLOW_CALL_DIALING) {
-          DEBUGA_PBX("just received a remote ANSWER\n", SKYPIAX_P_LOG);
-          if (tech_pvt->owner->state != SKYPIAX_STATE_UP) {
-            celliax_queue_control(tech_pvt->owner, SKYPIAX_CONTROL_RINGING);
-            DEBUGA_PBX("just sent SKYPIAX_CONTROL_RINGING\n", SKYPIAX_P_LOG);
-            DEBUGA_PBX("going to send SKYPIAX_CONTROL_ANSWER\n", SKYPIAX_P_LOG);
-            celliax_queue_control(tech_pvt->owner, SKYPIAX_CONTROL_ANSWER);
-            DEBUGA_PBX("just sent SKYPIAX_CONTROL_ANSWER\n", SKYPIAX_P_LOG);
-          }
-        } else {
-        }
-        tech_pvt->interface_state = SKYPIAX_STATE_UP;
-        DEBUGA_PBX("just interface_state UP\n", SKYPIAX_P_LOG);
+	      if (tech_pvt->interface_state == CALLFLOW_CALL_DIALING) {
+		      DEBUGA_PBX("just received a remote ANSWER\n", SKYPIAX_P_LOG);
+		      if (tech_pvt->phone_callflow == SKYPIAX_STATE_UP) {
+			      //celliax_queue_control(tech_pvt->owner, SKYPIAX_CONTROL_RINGING);
+			      DEBUGA_PBX("just sent SKYPIAX_CONTROL_RINGING\n", SKYPIAX_P_LOG);
+			      DEBUGA_PBX("going to send SKYPIAX_CONTROL_ANSWER\n", SKYPIAX_P_LOG);
+			      //celliax_queue_control(tech_pvt->owner, SKYPIAX_CONTROL_ANSWER);
+			      tech_pvt->interface_state = CALLFLOW_CALL_REMOTEANSWER;
+			      DEBUGA_PBX("just sent SKYPIAX_CONTROL_ANSWER\n", SKYPIAX_P_LOG);
+		      }
+	      } else {
+	      }
+	      //tech_pvt->interface_state = SKYPIAX_STATE_UP;
+	      //DEBUGA_PBX("just interface_state UP\n", SKYPIAX_P_LOG);
       }
 
       if ((strcmp(tech_pvt->line_array.result[i], tech_pvt->at_call_calling) == 0)) {
@@ -3236,6 +3236,59 @@
   return 0;
 }
 
+
+int celliax_serial_call(private_t * tech_pvt, char *dstr)
+{
+  if (tech_pvt->controldevprotocol == PROTOCOL_AT)
+    return celliax_serial_call_AT(tech_pvt, dstr);
+#ifdef CELLIAX_FBUS2
+  if (tech_pvt->controldevprotocol == PROTOCOL_FBUS2)
+    return celliax_serial_call_FBUS2(tech_pvt, dstr);
+#endif /* CELLIAX_FBUS2 */
+  if (tech_pvt->controldevprotocol == PROTOCOL_NO_SERIAL)
+    return 0;
+#ifdef CELLIAX_CVM
+  if (tech_pvt->controldevprotocol == PROTOCOL_CVM_BUSMAIL)
+    return celliax_serial_call_CVM_BUSMAIL(tech_pvt, dstr);
+#endif /* CELLIAX_CVM */
+  return -1;
+}
+
+int celliax_serial_call_AT(private_t * tech_pvt, char *dstr)
+{
+  int res;
+  char at_command[256];
+
+  if (option_debug)
+    DEBUGA_PBX("Dialing %s\n", SKYPIAX_P_LOG, dstr);
+  memset(at_command, 0, sizeof(at_command));
+  tech_pvt->phone_callflow = CALLFLOW_CALL_DIALING;
+  tech_pvt->interface_state = SKYPIAX_STATE_DIALING;
+  //ast_uri_decode(dstr);
+/*
+  size_t fixdstr = strspn(dstr, AST_DIGIT_ANYDIG);
+  if (fixdstr == 0) {
+    ERRORA("dial command failed because of invalid dial number. dial string was: %s\n",
+           SKYPIAX_P_LOG, dstr);
+    return -1;
+  }
+*/
+  //dstr[fixdstr] = '\0';
+  sprintf(at_command, "%s%s%s", tech_pvt->at_dial_pre_number, dstr, tech_pvt->at_dial_post_number);
+    DEBUGA_PBX("Dialstring %s\n", SKYPIAX_P_LOG, at_command);
+  res = celliax_serial_write_AT_expect(tech_pvt, at_command, tech_pvt->at_dial_expect);
+  if (res) {
+    ERRORA("dial command failed, dial string was: %s\n", SKYPIAX_P_LOG, at_command);
+    return -1;
+  }
+  // jet - early audio
+  //if (tech_pvt->at_early_audio) {
+    //ast_queue_control(tech_pvt->owner, AST_CONTROL_ANSWER);
+  //}
+
+  return 0;
+}
+
 int ucs2_to_utf8(private_t * tech_pvt, char *ucs2_in, char *utf8_out,
                  size_t outbytesleft)
 {
@@ -3405,9 +3458,7 @@
     return 0;
   }
 
-  if (option_debug) {
-    DEBUGA_PBX("ENTERING FUNC\n", SKYPIAX_P_LOG);
-  }
+    DEBUGA_SKYPE("ENTERING FUNC\n", SKYPIAX_P_LOG);
 
 #ifdef NOTDEF
   /* shutdown the serial monitoring thread */
@@ -4550,7 +4601,7 @@
 
 int celliax_call(private_t * tech_pvt, char *rdest, int timeout)
 {
-	char msg_to_skype[1024];
+	//char msg_to_skype[1024];
 
 	//celliax_sleep(5000);
 	DEBUGA_SKYPE("Calling Skype, rdest is: %s\n", SKYPIAX_P_LOG, rdest);
@@ -4559,7 +4610,8 @@
 	//celliax_signaling_write(tech_pvt, "SET AEC OFF");
 	//celliax_sleep(10000);
 
-	sprintf(msg_to_skype, "CALL %s", rdest);
+celliax_serial_call(tech_pvt, rdest);
+	//sprintf(msg_to_skype, "CALL %s", rdest);
 	//if (celliax_signaling_write(tech_pvt, msg_to_skype) < 0) {
 		//ERRORA("failed to communicate with Skype client, now exit\n", SKYPIAX_P_LOG);
 		//return -1;

Modified: freeswitch/branches/gmaruzz/mod_celliax/mod_celliax.c (14673 => 14674)


--- freeswitch/branches/gmaruzz/mod_celliax/mod_celliax.c	2009-08-29 08:12:44 UTC (rev 14673)
+++ freeswitch/branches/gmaruzz/mod_celliax/mod_celliax.c	2009-08-29 12:07:23 UTC (rev 14674)
@@ -712,7 +712,6 @@
                 teletone_dtmf_get(&tech_pvt->dtmf_detect, digit_str, sizeof(digit_str));
 
                 if (digit_str[0]) {
-                        NOTICA("DTMF DETECTED: [%s]\n", SKYPIAX_P_LOG, digit_str);
                 switch_time_t new_dtmf_timestamp = switch_time_now();
                 if((new_dtmf_timestamp - tech_pvt->old_dtmf_timestamp) > 350000) { //FIXME: make it configurable
                         char *p = digit_str;
@@ -958,6 +957,7 @@
 				tech_pvt = find_available_celliax_interface_rr(NULL);
 				if (tech_pvt)
 					found = 1;
+				DEBUGA_SKYPE("FOUND one available skype interface RR\n", SKYPIAX_P_LOG);
 			}
 
 			for (i = 0; !found && i < SKYPIAX_MAX_INTERFACES; i++) {
@@ -1941,6 +1941,8 @@
 	}
 	if (channel) {
 		switch_channel_mark_answered(channel);
+tech_pvt->phone_callflow = SKYPIAX_STATE_UP;
+tech_pvt->interface_state = SKYPIAX_STATE_UP;
 		//DEBUGA_SKYPE("skype_call: %s, answered\n", SKYPIAX_P_LOG, id);
 	} else {
 		ERRORA("No channel???\n", SKYPIAX_P_LOG);
@@ -2388,8 +2390,14 @@
               //FIXME if (!celliax_new(p, AST_STATE_RING, tech_pvt->context)) {
                 //FIXME ERRORA("celliax_new failed! BAD BAD BAD\n", CELLIAX_P_LOG);
               //FIXME }
+            } else if (tech_pvt->interface_state == CALLFLOW_CALL_REMOTEANSWER) {
+                WARNINGA("REMOTE PARTY ANSWERED\n", SKYPIAX_P_LOG);
+outbound_channel_answered(tech_pvt);
+				//new_inbound_channel(tech_pvt);
+              //FIXME if (!celliax_new(p, AST_STATE_RING, tech_pvt->context)) {
+                //FIXME ERRORA("celliax_new failed! BAD BAD BAD\n", CELLIAX_P_LOG);
+              //FIXME }
             }
-
 		}
 	} else {
 		ERRORA("Skype is not running, maybe crashed. Please run/restart Skype and relaunch Skypiax\n", SKYPIAX_P_LOG);