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)
{