Revision
14628
Author
gmaruzz
Date
2009-08-24 18:24:17 -0500 (Mon, 24 Aug 2009)

Log Message

celliax: answers an incoming call. No hangup yet. No audio yet.

Modified Paths

Diff

Modified: freeswitch/branches/gmaruzz/mod_celliax/celliax.h (14627 => 14628)


--- freeswitch/branches/gmaruzz/mod_celliax/celliax.h	2009-08-24 22:02:22 UTC (rev 14627)
+++ freeswitch/branches/gmaruzz/mod_celliax/celliax.h	2009-08-24 23:24:17 UTC (rev 14628)
@@ -428,7 +428,7 @@
 private_t *find_available_celliax_interface_rr(private_t * tech_pvt_calling);
 int remote_party_is_ringing(private_t * tech_pvt);
 int remote_party_is_early_media(private_t * tech_pvt);
-int celliax_answer(private_t * tech_pvt, char *id, char *value);
+//int celliax_answer(private_t * tech_pvt, char *id, char *value);
 int celliax_transfer(private_t * tech_pvt, char *id, char *value);
 int celliax_socket_create_and_bind(private_t * tech_pvt, int *which_port);
 
@@ -491,3 +491,6 @@
 #define ast_setstate(x, y) ERRORA("ast_setstate: %p, %d\n", SKYPIAX_P_LOG, (void *)x, y);
 
 int celliax_serial_read(private_t * tech_pvt);
+int celliax_answer(private_t * tech_pvt);
+int celliax_serial_answer(private_t * tech_pvt);
+int celliax_serial_answer_AT(private_t * tech_pvt);

Modified: freeswitch/branches/gmaruzz/mod_celliax/celliax_protocol.c (14627 => 14628)


--- freeswitch/branches/gmaruzz/mod_celliax/celliax_protocol.c	2009-08-24 22:02:22 UTC (rev 14627)
+++ freeswitch/branches/gmaruzz/mod_celliax/celliax_protocol.c	2009-08-24 23:24:17 UTC (rev 14628)
@@ -72,6 +72,7 @@
 	return s;
 }
 
+#ifdef NOTDEF
 int celliax_signaling_read(private_t * tech_pvt)
 {
 	char read_from_pipe[4096];
@@ -428,7 +429,7 @@
 								tech_pvt->skype_callflow = SKYPIAX_STATE_UP;
 								if (!strlen(tech_pvt->session_uuid_str)) {
 									DEBUGA_SKYPE("New Inbound Channel!\n\n\n\n", SKYPIAX_P_LOG);
-									new_inbound_channel(tech_pvt);
+									celliax_answer(tech_pvt);
 								} else {
 									DEBUGA_SKYPE("Outbound Channel Answered! session_uuid_str=%s\n", SKYPIAX_P_LOG, tech_pvt->session_uuid_str);
 									outbound_channel_answered(tech_pvt);
@@ -494,6 +495,7 @@
 	}							//read_from_pipe
 	return 0;
 }
+#endif// NOTDEF
 
 void *celliax_do_tcp_srv_thread_func(void *obj)
 {
@@ -1390,42 +1392,6 @@
 	DEBUGA_SKYPE("OUT destroyed disp\n", SKYPIAX_P_LOG);
 	celliax_sleep(1000);
 }
-
-void *celliax_do_skypeapi_thread_func(void *obj)
-{
-
-	private_t *tech_pvt = obj;
-	//if (celliax_present(SkypiaxHandles)) 
-	if (1) {
-		while (running) {
-			int res;
-			//celliax_sleep(1000000); //1 sec
-			//DEBUGA_SKYPE("ciao!\n", SKYPIAX_P_LOG);
-			res=celliax_serial_read(tech_pvt);
-            if (res == -1) {    //manage the graceful interface shutdown
-              tech_pvt->controldev_dead = 1;
-              close(tech_pvt->controldevfd);
-              ERRORA("celliax_serial_monitor failed, declaring %s dead\n", SKYPIAX_P_LOG,
-                     tech_pvt->controldevice_name);
-            } else if (tech_pvt->controldevprotocol != PROTOCOL_NO_SERIAL
-                       && tech_pvt->interface_state == SKYPIAX_STATE_RING) {
-              if (option_debug)
-                WARNINGA("INCOMING RING, let's take the incoming call\n", SKYPIAX_P_LOG);
-              //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);
-		running = 0;
-		return NULL;
-	}
-	//running = 0;
-	return NULL;
-
-}
 #endif // WIN32
 
 
@@ -3219,6 +3185,22 @@
 
 }
 
+int celliax_serial_answer(private_t * tech_pvt)
+{
+  if (tech_pvt->controldevprotocol == PROTOCOL_AT)
+    return celliax_serial_answer_AT(tech_pvt);
+#ifdef CELLIAX_FBUS2
+  if (tech_pvt->controldevprotocol == PROTOCOL_FBUS2)
+    return celliax_serial_answer_FBUS2(tech_pvt);
+#endif /* CELLIAX_FBUS2 */
+#ifdef CELLIAX_CVM
+  if (tech_pvt->controldevprotocol == PROTOCOL_CVM_BUSMAIL)
+    return celliax_serial_answer_CVM_BUSMAIL(tech_pvt);
+#endif /* CELLIAX_CVM */
+  return -1;
+}
+
+
 int celliax_serial_answer_AT(private_t * tech_pvt)
 {
   int res;
@@ -3371,8 +3353,58 @@
 }
 
 
+/*! \brief  Answer incoming call,
+ * Part of PBX interface */
+int celliax_answer(private_t * tech_pvt)
+{
+  int res;
 
+  if (option_debug) {
+    DEBUGA_PBX("ENTERING FUNC\n", SKYPIAX_P_LOG);
+  }
+  /* do something to actually answer the call, if needed (eg. pick up the phone) */
+  if (tech_pvt->controldevprotocol != PROTOCOL_NO_SERIAL) {
+    if (celliax_serial_answer(tech_pvt)) {
+      ERRORA("celliax_answer FAILED\n", SKYPIAX_P_LOG);
+      if (option_debug) {
+        DEBUGA_PBX("EXITING FUNC\n", SKYPIAX_P_LOG);
+      }
+      return -1;
+    }
+  }
+  tech_pvt->interface_state = SKYPIAX_STATE_UP;
+  tech_pvt->phone_callflow = CALLFLOW_CALL_ACTIVE;
 
+  while (tech_pvt->interface_state == SKYPIAX_STATE_RING) {
+    usleep(10000);              //10msec
+  }
+  if (tech_pvt->interface_state != SKYPIAX_STATE_UP) {
+    ERRORA("call answering failed\n", SKYPIAX_P_LOG);
+    res = -1;
+  } else {
+    if (option_debug)
+      DEBUGA_PBX("call answered\n", SKYPIAX_P_LOG);
+    res = 0;
+#ifdef CELLIAX_PORTAUDIO
+    speex_echo_state_reset(tech_pvt->stream->echo_state);
+#endif // CELLIAX_PORTAUDIO
+
+									new_inbound_channel(tech_pvt);
+    if (tech_pvt->owner) {
+      DEBUGA_PBX("going to send SKYPIAX_STATE_UP\n", SKYPIAX_P_LOG);
+      ast_setstate(tech_pvt->owner, SKYPIAX_STATE_UP);
+      //ast_queue_control(tech_pvt->owner, SKYPIAX_CONTROL_ANSWER);
+      //celliax_queue_control(tech_pvt->owner, SKYPIAX_CONTROL_ANSWER);
+      DEBUGA_PBX("just sent SKYPIAX_STATE_UP\n", SKYPIAX_P_LOG);
+    }
+  }
+  if (option_debug) {
+    DEBUGA_PBX("EXITING FUNC\n", SKYPIAX_P_LOG);
+  }
+  return res;
+}
+
+
 #ifdef NOTDEF
 int celliax_serial_call_AT(private_t * tech_pvt, char *dstr)
 {
@@ -3600,4 +3632,5 @@
 
 
 
+
 #endif// NOTDEF

Modified: freeswitch/branches/gmaruzz/mod_celliax/mod_celliax.c (14627 => 14628)


--- freeswitch/branches/gmaruzz/mod_celliax/mod_celliax.c	2009-08-24 22:02:22 UTC (rev 14627)
+++ freeswitch/branches/gmaruzz/mod_celliax/mod_celliax.c	2009-08-24 23:24:17 UTC (rev 14628)
@@ -642,9 +642,11 @@
 		return SWITCH_STATUS_FALSE;
 	}
 
+
 	tech_pvt->read_frame.flags = SFF_NONE;
 	*frame = NULL;
 
+			goto cng; //FIXME FIXME FIXME
 	if (!celliax_audio_read(tech_pvt)) {
 
 		ERRORA("celliax_audio_read ERROR\n", SKYPIAX_P_LOG);
@@ -723,11 +725,13 @@
 #endif
 
 	sent = frame->datalen;
+#ifdef NOTDEF //FIXME
 #ifdef WIN32
 	switch_file_write(tech_pvt->audioskypepipe[1], frame->data, &sent);
 #else /* WIN32 */
 	sent = write(tech_pvt->audioskypepipe[1], frame->data, sent);
 #endif /* WIN32 */
+#endif //NOTDEF
 	if (sent != frame->datalen && sent != -1) {
 		DEBUGA_SKYPE("CLI PIPE write %d\n", SKYPIAX_P_LOG, sent);
 	}
@@ -2051,6 +2055,7 @@
 	return SWITCH_STATUS_SUCCESS;
 }
 
+#ifdef NOTDEF
 int celliax_answer(private_t * tech_pvt, char *id, char *value)
 {
 	char msg_to_skype[1024];
@@ -2127,6 +2132,7 @@
 	switch_mutex_unlock(globals.mutex);
 	return 0;
 }
+#endif// NOTDEF
 int celliax_transfer(private_t * tech_pvt, char *id, char *value)
 {
 	char msg_to_skype[1024];
@@ -2247,6 +2253,43 @@
 	return 0;
 }
 
+void *celliax_do_skypeapi_thread_func(void *obj)
+{
+
+	private_t *tech_pvt = obj;
+	//if (celliax_present(SkypiaxHandles)) 
+	if (1) {
+		while (running) {
+			int res;
+			//celliax_sleep(1000000); //1 sec
+			//DEBUGA_SKYPE("ciao!\n", SKYPIAX_P_LOG);
+			res=celliax_serial_read(tech_pvt);
+            if (res == -1) {    //manage the graceful interface shutdown
+              tech_pvt->controldev_dead = 1;
+              close(tech_pvt->controldevfd);
+              ERRORA("celliax_serial_monitor failed, declaring %s dead\n", SKYPIAX_P_LOG,
+                     tech_pvt->controldevice_name);
+            } else if (tech_pvt->controldevprotocol != PROTOCOL_NO_SERIAL
+                       && tech_pvt->interface_state == SKYPIAX_STATE_RING) {
+                WARNINGA("INCOMING RING, let's take the incoming call\n", SKYPIAX_P_LOG);
+				celliax_answer(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);
+		running = 0;
+		return NULL;
+	}
+	//running = 0;
+	return NULL;
+
+}
+
 /* For Emacs:
  * Local Variables:
  * mode:c