Revision
16486
Author
gmaruzz
Date
2010-01-23 13:44:22 -0600 (Sat, 23 Jan 2010)

Log Message

gsmopen: added CUSTOM gsmopen::alarm EVENT, to signal all those situation like an interface fails, no network signal, no network registration, serial port dies, etc

Modified Paths

Diff

Modified: freeswitch/branches/gmaruzz/mod_gsmopen/gsmopen.h (16485 => 16486)


--- freeswitch/branches/gmaruzz/mod_gsmopen/gsmopen.h	2010-01-23 19:09:01 UTC (rev 16485)
+++ freeswitch/branches/gmaruzz/mod_gsmopen/gsmopen.h	2010-01-23 19:44:22 UTC (rev 16486)
@@ -41,7 +41,19 @@
 
 #define MY_EVENT_INCOMING_SMS "gsmopen::incoming_sms"
 #define MY_EVENT_DUMP "gsmopen::dump_event"
+#define MY_EVENT_ALARM "gsmopen::alarm"
 
+#define ALARM_FAILED_INTERFACE 0
+#define ALARM_NO_NETWORK_REGISTRATION 1
+#define ALARM_ROAMING_NETWORK_REGISTRATION 2
+#define ALARM_NETWORK_NO_SERVICE 3
+#define ALARM_NETWORK_NO_SIGNAL 4
+#define ALARM_NETWORK_LOW_SIGNAL 5
+
+
+
+
+
 #undef GIOVA48
 
 #ifndef GIOVA48
@@ -643,3 +655,5 @@
 
 #endif // GSMOPEN_PORTAUDIO
 int dump_event(private_t *tech_pvt);
+int alarm_event(private_t * tech_pvt, int alarm_code, const char *alarm_message);
+int dump_event_full(private_t * tech_pvt, int is_alarm, int alarm_code, const char *alarm_message);

Modified: freeswitch/branches/gmaruzz/mod_gsmopen/gsmopen_protocol.cpp (16485 => 16486)


--- freeswitch/branches/gmaruzz/mod_gsmopen/gsmopen_protocol.cpp	2010-01-23 19:09:01 UTC (rev 16485)
+++ freeswitch/branches/gmaruzz/mod_gsmopen/gsmopen_protocol.cpp	2010-01-23 19:44:22 UTC (rev 16486)
@@ -1007,11 +1007,18 @@
 				 GSMOPEN_P_LOG, tech_pvt->controldevice_name);
 			tech_pvt->controldev_dead = 1;
 			close(tech_pvt->controldevfd);
+			ERRORA("gsmopen_serial_monitor failed, declaring %s dead\n", GSMOPEN_P_LOG, tech_pvt->controldevice_name);
+			tech_pvt->running=0;
+			alarm_event(tech_pvt, ALARM_FAILED_INTERFACE, "gsmopen_serial_monitor failed, declaring interface dead");
+			tech_pvt->active=0;
+			tech_pvt->name[0]='\0';
+
 			UNLOCKA(tech_pvt->controldev_lock);
 			if (tech_pvt->owner) {
 				tech_pvt->owner->hangupcause = GSMOPEN_CAUSE_FAILURE;
 				gsmopen_queue_control(tech_pvt->owner, GSMOPEN_CONTROL_HANGUP);
 			}
+			switch_sleep(1000000);
 			return -1;
 		}
 
@@ -1311,9 +1318,11 @@
 							("|%s| CELLPHONE GETS ALMOST NO SIGNAL, consider to move it or additional antenna\n",
 							 GSMOPEN_P_LOG, tech_pvt->line_array.result[i]);
 						tech_pvt->got_signal=0;
+				alarm_event(tech_pvt, ALARM_NETWORK_NO_SIGNAL, "CELLPHONE GETS ALMOST NO SIGNAL, consider to move it or additional antenna");
 					} else if (signal_quality < 15) {
 						WARNINGA("|%s| CELLPHONE GETS SIGNAL LOW\n", GSMOPEN_P_LOG, tech_pvt->line_array.result[i]);
 						tech_pvt->got_signal=1;
+				alarm_event(tech_pvt, ALARM_NETWORK_LOW_SIGNAL, "CELLPHONE GETS SIGNAL LOW");
 					} else {
 						tech_pvt->got_signal=2;
 					}
@@ -1339,16 +1348,18 @@
 						tech_pvt->not_registered=1;
 						tech_pvt->home_network_registered=0;
 						tech_pvt->roaming_registered=0;
+						alarm_event(tech_pvt, ALARM_NO_NETWORK_REGISTRATION, "CELLPHONE is not registered to network, consider to move it or additional antenna");
 					} else if (stat==1) {
 						DEBUGA_GSMOPEN("|%s| CELLPHONE is registered to the HOME network\n", GSMOPEN_P_LOG, tech_pvt->line_array.result[i]);
 						tech_pvt->not_registered=0;
 						tech_pvt->home_network_registered=1;
 						tech_pvt->roaming_registered=0;
 					} else {
-						WARNINGA("|%s| CELLPHONE is registered to a ROAMING network\n", GSMOPEN_P_LOG, tech_pvt->line_array.result[i]);
+						ERRORA("|%s| CELLPHONE is registered to a ROAMING network\n", GSMOPEN_P_LOG, tech_pvt->line_array.result[i]);
 						tech_pvt->not_registered=0;
 						tech_pvt->home_network_registered=0;
 						tech_pvt->roaming_registered=1;
+						alarm_event(tech_pvt, ALARM_ROAMING_NETWORK_REGISTRATION, "CELLPHONE is registered to a ROAMING network");
 					}
 
 				}
@@ -1864,58 +1875,50 @@
 
 			/* at_indicator_* are unsolicited messages sent by the phone to signal us that some of its visual indicators on its screen has changed, based on CIND CMER ETSI docs */
 			if ((strcmp(tech_pvt->line_array.result[i], tech_pvt->at_indicator_noservice_string) == 0)) {
-				if (option_debug > 1)
 					ERRORA("|%s| at_indicator_noservice_string\n", GSMOPEN_P_LOG, tech_pvt->line_array.result[i]);
+						alarm_event(tech_pvt, ALARM_NETWORK_NO_SERVICE, "at_indicator_noservice_string");
 			}
 
 			if ((strcmp(tech_pvt->line_array.result[i], tech_pvt->at_indicator_nosignal_string) == 0)) {
-				if (option_debug > 1)
 					ERRORA("|%s| at_indicator_nosignal_string\n", GSMOPEN_P_LOG, tech_pvt->line_array.result[i]);
+						alarm_event(tech_pvt, ALARM_NETWORK_NO_SIGNAL, "at_indicator_nosignal_string");
 			}
 
 			if ((strcmp(tech_pvt->line_array.result[i], tech_pvt->at_indicator_lowsignal_string) == 0)) {
-				if (option_debug > 1)
 					WARNINGA("|%s| at_indicator_lowsignal_string\n", GSMOPEN_P_LOG, tech_pvt->line_array.result[i]);
+						alarm_event(tech_pvt, ALARM_NETWORK_LOW_SIGNAL, "at_indicator_lowsignal_string");
 			}
 
 			if ((strcmp(tech_pvt->line_array.result[i], tech_pvt->at_indicator_lowbattchg_string) == 0)) {
-				if (option_debug > 1)
 					WARNINGA("|%s| at_indicator_lowbattchg_string\n", GSMOPEN_P_LOG, tech_pvt->line_array.result[i]);
 			}
 
 			if ((strcmp(tech_pvt->line_array.result[i], tech_pvt->at_indicator_nobattchg_string) == 0)) {
-				if (option_debug > 1)
 					ERRORA("|%s| at_indicator_nobattchg_string\n", GSMOPEN_P_LOG, tech_pvt->line_array.result[i]);
 			}
 
 			if ((strcmp(tech_pvt->line_array.result[i], tech_pvt->at_indicator_callactive_string) == 0)) {
-				if (option_debug > 1)
 					DEBUGA_GSMOPEN("|%s| at_indicator_callactive_string\n", GSMOPEN_P_LOG, tech_pvt->line_array.result[i]);
 			}
 
 			if ((strcmp(tech_pvt->line_array.result[i], tech_pvt->at_indicator_nocallactive_string) == 0)) {
-				if (option_debug > 1)
 					DEBUGA_GSMOPEN("|%s| at_indicator_nocallactive_string\n", GSMOPEN_P_LOG, tech_pvt->line_array.result[i]);
 			}
 
 			if ((strcmp(tech_pvt->line_array.result[i], tech_pvt->at_indicator_nocallsetup_string) == 0)) {
-				if (option_debug > 1)
 					DEBUGA_GSMOPEN("|%s| at_indicator_nocallsetup_string\n", GSMOPEN_P_LOG, tech_pvt->line_array.result[i]);
 			}
 
 			if ((strcmp(tech_pvt->line_array.result[i], tech_pvt->at_indicator_callsetupincoming_string) == 0)) {
-				if (option_debug > 1)
 					DEBUGA_GSMOPEN("|%s| at_indicator_callsetupincoming_string\n", GSMOPEN_P_LOG, tech_pvt->line_array.result[i]);
 			}
 
 			if ((strcmp(tech_pvt->line_array.result[i], tech_pvt->at_indicator_callsetupoutgoing_string) == 0)) {
-				if (option_debug > 1)
 					DEBUGA_GSMOPEN("|%s| at_indicator_callsetupoutgoing_string\n", GSMOPEN_P_LOG, tech_pvt->line_array.result[i]);
 			}
 
 			if ((strcmp(tech_pvt->line_array.result[i], tech_pvt->at_indicator_callsetupremoteringing_string)
 				 == 0)) {
-				if (option_debug > 1)
 					DEBUGA_GSMOPEN("|%s| at_indicator_callsetupremoteringing_string\n", GSMOPEN_P_LOG, tech_pvt->line_array.result[i]);
 			}
 
@@ -2157,8 +2160,14 @@
 		ERRORA("select returned -1 on %s, setting controldev_dead, error was: %s\n", GSMOPEN_P_LOG, tech_pvt->controldevice_name, strerror(errno));
 		tech_pvt->controldev_dead = 1;
 		close(tech_pvt->controldevfd);
+
+				tech_pvt->running=0;
+				alarm_event(tech_pvt, ALARM_FAILED_INTERFACE, "select returned -1 on interface, setting controldev_dead");
+				tech_pvt->active=0;
+				tech_pvt->name[0]='\0';
 		if (tech_pvt->owner)
 			gsmopen_queue_control(tech_pvt->owner, GSMOPEN_CONTROL_HANGUP);
+				switch_sleep(1000000);
 		return -1;
 	}
 

Modified: freeswitch/branches/gmaruzz/mod_gsmopen/mod_gsmopen.cpp (16485 => 16486)


--- freeswitch/branches/gmaruzz/mod_gsmopen/mod_gsmopen.cpp	2010-01-23 19:09:01 UTC (rev 16485)
+++ freeswitch/branches/gmaruzz/mod_gsmopen/mod_gsmopen.cpp	2010-01-23 19:44:22 UTC (rev 16486)
@@ -1884,6 +1884,7 @@
 						ERRORA("STARTING interface_id=%d FAILED\n", GSMOPEN_P_LOG, interface_id);
 						//return SWITCH_STATUS_FALSE;
 						globals.GSMOPEN_INTERFACES[interface_id].running=0;
+						alarm_event(&globals.GSMOPEN_INTERFACES[interface_id], ALARM_FAILED_INTERFACE, "gsmopen_serial_init failed");
 						globals.GSMOPEN_INTERFACES[interface_id].active=0;
 						globals.GSMOPEN_INTERFACES[interface_id].name[0]='\0';
 						continue;
@@ -1898,6 +1899,7 @@
 						ERRORA("STARTING interface_id=%d FAILED\n", GSMOPEN_P_LOG, interface_id);
 						//return SWITCH_STATUS_FALSE;
 						globals.GSMOPEN_INTERFACES[interface_id].running=0;
+						alarm_event(&globals.GSMOPEN_INTERFACES[interface_id], ALARM_FAILED_INTERFACE, "gsmopen_serial_config failed");
 						globals.GSMOPEN_INTERFACES[interface_id].active=0;
 						globals.GSMOPEN_INTERFACES[interface_id].name[0]='\0';
 						continue;
@@ -1911,6 +1913,7 @@
 						ERRORA("STARTING interface_id=%d FAILED\n", GSMOPEN_P_LOG, interface_id);
 						//return SWITCH_STATUS_FALSE;
 						globals.GSMOPEN_INTERFACES[interface_id].running=0;
+						alarm_event(&globals.GSMOPEN_INTERFACES[interface_id], ALARM_FAILED_INTERFACE, "alsa_init failed");
 						globals.GSMOPEN_INTERFACES[interface_id].active=0;
 						globals.GSMOPEN_INTERFACES[interface_id].name[0]='\0';
 						continue;
@@ -1922,6 +1925,7 @@
 						ERRORA("STARTING interface_id=%d FAILED\n", GSMOPEN_P_LOG, interface_id);
 						//return SWITCH_STATUS_FALSE;
 						globals.GSMOPEN_INTERFACES[interface_id].running=0;
+						alarm_event(&globals.GSMOPEN_INTERFACES[interface_id], ALARM_FAILED_INTERFACE, "alsa_shutdown failed");
 						globals.GSMOPEN_INTERFACES[interface_id].active=0;
 						globals.GSMOPEN_INTERFACES[interface_id].name[0]='\0';
 						continue;
@@ -1934,6 +1938,7 @@
 						ERRORA("STARTING interface_id=%d FAILED\n", GSMOPEN_P_LOG, interface_id);
 						//return SWITCH_STATUS_FALSE;
 						globals.GSMOPEN_INTERFACES[interface_id].running=0;
+						alarm_event(&globals.GSMOPEN_INTERFACES[interface_id], ALARM_FAILED_INTERFACE, "gsmopen_portaudio_init failed");
 						globals.GSMOPEN_INTERFACES[interface_id].active=0;
 						globals.GSMOPEN_INTERFACES[interface_id].name[0]='\0';
 						continue;
@@ -1945,6 +1950,7 @@
 						ERRORA("STARTING interface_id=%d FAILED\n", GSMOPEN_P_LOG, interface_id);
 						//return SWITCH_STATUS_FALSE;
 						globals.GSMOPEN_INTERFACES[interface_id].running=0;
+						alarm_event(&globals.GSMOPEN_INTERFACES[interface_id], ALARM_FAILED_INTERFACE, "gsmopen_portaudio_shutdown failed");
 						globals.GSMOPEN_INTERFACES[interface_id].active=0;
 						globals.GSMOPEN_INTERFACES[interface_id].name[0]='\0';
 						continue;
@@ -1971,6 +1977,7 @@
 
 			} else {
 				ERRORA("interface id %d is higher than GSMOPEN_MAX_INTERFACES (%d)\n", GSMOPEN_P_LOG, interface_id, GSMOPEN_MAX_INTERFACES);
+				alarm_event(&globals.GSMOPEN_INTERFACES[interface_id], ALARM_FAILED_INTERFACE, "interface id is higher than GSMOPEN_MAX_INTERFACES");
 				continue;
 			}
 
@@ -2861,6 +2868,10 @@
 				tech_pvt->controldev_dead = 1;
 				close(tech_pvt->controldevfd);
 				ERRORA("gsmopen_serial_monitor failed, declaring %s dead\n", GSMOPEN_P_LOG, tech_pvt->controldevice_name);
+				tech_pvt->running=0;
+				alarm_event(tech_pvt, ALARM_FAILED_INTERFACE, "gsmopen_serial_monitor failed, declaring interface dead");
+				tech_pvt->active=0;
+				tech_pvt->name[0]='\0';
 				switch_sleep(1000000);
 			} else if (tech_pvt->controldevprotocol != PROTOCOL_NO_SERIAL && tech_pvt->interface_state == GSMOPEN_STATE_RING
 					   && tech_pvt->phone_callflow != CALLFLOW_CALL_HANGUP_REQUESTED) {
@@ -2966,23 +2977,32 @@
 	return SWITCH_STATUS_SUCCESS;
 }
 
-int dump_event(private_t * tech_pvt)
+int dump_event_full(private_t * tech_pvt, int is_alarm, int alarm_code, const char *alarm_message)
 {
 	switch_event_t *event;
 	char value[512];
 	switch_core_session_t *session = NULL;
 	switch_channel_t *channel = NULL;
+	switch_status_t status;
 
 	session = switch_core_session_locate(tech_pvt->session_uuid_str);
 	if(session){
 		channel = switch_core_session_get_channel(session);
 	}
 
-
-
-	DEBUGA_GSMOPEN("DUMP of interface %s: \n", GSMOPEN_P_LOG, tech_pvt->name );
-
-	if (switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, MY_EVENT_DUMP) == SWITCH_STATUS_SUCCESS) {
+	if (is_alarm){
+		ERRORA("ALARM on interface %s: \n", GSMOPEN_P_LOG, tech_pvt->name );
+		status = switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, MY_EVENT_ALARM);
+	}else{
+		DEBUGA_GSMOPEN("DUMP on interface %s: \n", GSMOPEN_P_LOG, tech_pvt->name );
+		status = switch_event_create_subclass(&event, SWITCH_EVENT_CUSTOM, MY_EVENT_DUMP);
+	}
+	if (status == SWITCH_STATUS_SUCCESS) {
+		if (is_alarm){
+			snprintf(value, sizeof(value)-1, "%d", alarm_code);
+			switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm_code", value);
+			switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "alarm_message", alarm_message);
+		}
 		switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "interface_name", tech_pvt->name);
 		switch_event_add_header_string(event, SWITCH_STACK_BOTTOM, "interface_id", tech_pvt->id);
 		snprintf(value, sizeof(value)-1, "%d", tech_pvt->active);
@@ -3063,8 +3083,16 @@
 	return 0;
 }
 
+int dump_event(private_t * tech_pvt)
+{
+	return dump_event_full(tech_pvt, 0, 0, NULL);
+}
 
 
+int alarm_event(private_t * tech_pvt, int alarm_code, const char *alarm_message)
+{
+	return dump_event_full(tech_pvt, 1, alarm_code, alarm_message);
+}
 
 int sms_incoming(private_t * tech_pvt)
 {