]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
gsmopen: using non volatile memoty for storage (vs SIM), new reading with timeout...
authorGiovanni Maruzzelli <gmaruzz@gmail.com>
Mon, 16 Apr 2012 13:17:18 +0000 (15:17 +0200)
committerGiovanni Maruzzelli <gmaruzz@gmail.com>
Mon, 16 Apr 2012 13:18:08 +0000 (15:18 +0200)
src/mod/endpoints/mod_gsmopen/gsmopen_protocol.cpp

index c45828856eb3757c7d8e5352d47fd93ddff1a1de..f0b28e1c75dc1e1a71842c8fc79392153078947f 100644 (file)
@@ -145,8 +145,8 @@ int gsmopen_serial_config_AT(private_t *tech_pvt)
                res = gsmopen_serial_write_AT_ack(tech_pvt, "AT^CURC=0");
                if (res) {
                        DEBUGA_GSMOPEN("no response to AT^CURC=0. Continuing\n", GSMOPEN_P_LOG);
-                       return -1;
                }
+
                if (strlen(tech_pvt->at_preinit_1)) {
                        res = gsmopen_serial_write_AT_expect(tech_pvt, tech_pvt->at_preinit_1, tech_pvt->at_preinit_1_expect);
                        if (res) {
@@ -228,6 +228,16 @@ int gsmopen_serial_config_AT(private_t *tech_pvt)
                DEBUGA_GSMOPEN("ATE0 failed\n", GSMOPEN_P_LOG);
        }
 
+       res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CFUN=1");
+       if (res) {
+               DEBUGA_GSMOPEN("no response to AT+CFUN=1. Continuing\n", GSMOPEN_P_LOG);
+       }
+       res = gsmopen_serial_write_AT_ack(tech_pvt, "AT^CURC=0");
+       if (res) {
+               DEBUGA_GSMOPEN("no response to AT^CURC=0. Continuing\n", GSMOPEN_P_LOG);
+       }
+
+
        /* disable extended error reporting */
        res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CMEE=0");
        if (res) {
@@ -295,12 +305,38 @@ int gsmopen_serial_config_AT(private_t *tech_pvt)
        }
 
        /* signal incoming SMS with a +CMTI unsolicited msg */
-       res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CNMI=1,1,0,0,0");
+       //res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CNMI=1,1,0,0,0");
+       res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CNMI=2,1,0,0,0");
+       if (res) {
+               DEBUGA_GSMOPEN("AT+CNMI=2,1,0,0,0 failed, continue\n", GSMOPEN_P_LOG);
+               tech_pvt->sms_cnmi_not_supported = 1;
+               tech_pvt->gsmopen_serial_sync_period = 30;      //FIXME in config
+       }
+       res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CPMS=\"ME\",\"ME\",\"ME\"");
+       if (res) {
+               DEBUGA_GSMOPEN("no response to AT+CPMS=\"ME\",\"ME\",\"ME\". Continuing\n", GSMOPEN_P_LOG);
+       }
+       /* signal incoming SMS with a +CMTI unsolicited msg */
+       //res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CNMI=1,1,0,0,0");
+       res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CNMI=2,1,0,0,0");
+       if (res) {
+               DEBUGA_GSMOPEN("AT+CNMI=2,1,0,0,0 failed, continue\n", GSMOPEN_P_LOG);
+               tech_pvt->sms_cnmi_not_supported = 1;
+               tech_pvt->gsmopen_serial_sync_period = 30;      //FIXME in config
+       }
+       res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CPMS=\"ME\",\"ME\",\"ME\"");
+       if (res) {
+               DEBUGA_GSMOPEN("no response to AT+CPMS=\"ME\",\"ME\",\"ME\". Continuing\n", GSMOPEN_P_LOG);
+       }
+       /* signal incoming SMS with a +CMTI unsolicited msg */
+       //res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CNMI=1,1,0,0,0");
+       res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CNMI=2,1,0,0,0");
        if (res) {
-               DEBUGA_GSMOPEN("AT+CNMI=1,1,0,0,0 failed, continue\n", GSMOPEN_P_LOG);
+               DEBUGA_GSMOPEN("AT+CNMI=2,1,0,0,0 failed, continue\n", GSMOPEN_P_LOG);
                tech_pvt->sms_cnmi_not_supported = 1;
                tech_pvt->gsmopen_serial_sync_period = 30;      //FIXME in config
        }
+
        /* what is the Message Center address (number) to which the SMS has to be sent? */
        res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CSCA?");
        if (res) {
@@ -479,7 +515,6 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us
 {
        int select_err = 1;
        int res;
-       //fd_set read_fds;
        struct timeval timeout;
        char tmp_answer[AT_BUFSIZ];
        char tmp_answer2[AT_BUFSIZ];
@@ -490,20 +525,18 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us
        int la_counter = 0;
        int at_ack = -1;
        int la_read = 0;
-       int timeout1;
+       int timeout_in_msec;
+       int msecs_passed=0;
 
-       timeout1 = (timeout_sec * 1000) + (timeout_usec ? (timeout_usec / 1000) : 0);
+       timeout_in_msec = (timeout_sec * 1000) + (timeout_usec ? (timeout_usec / 1000) : 0);
 
-       if (timeout1 != 100)
-               ERRORA("TIMEOUT=%d\n", GSMOPEN_P_LOG, timeout1);
+       if (timeout_in_msec != 100)
+               ERRORA("TIMEOUT=%d\n", GSMOPEN_P_LOG, timeout_in_msec);
 
        if (!running || !tech_pvt->running) {
                return -1;
        }
-       ////FD_ZERO(&read_fds);
-       //FD_SET(tech_pvt->controldevfd, &read_fds);
 
-       //NOTICA (" INSIDE this gsmopen_serial_device %s \n", GSMOPEN_P_LOG, tech_pvt->controldevice_name);
        tmp_answer_ptr = tmp_answer;
        memset(tmp_answer, 0, sizeof(char) * AT_BUFSIZ);
 
@@ -512,20 +545,31 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us
        PUSHA_UNLOCKA(tech_pvt->controldev_lock);
        LOKKA(tech_pvt->controldev_lock);
 
-       //while ((!tech_pvt->controldev_dead) && ((select_err = select(tech_pvt->controldevfd + 1, &read_fds, NULL, NULL, &timeout)) > 0)) {
-       while ((!tech_pvt->controldev_dead)
-                  && (read_count =
-                          tech_pvt->serialPort_serial_control->Readv(tmp_answer_ptr, AT_BUFSIZ - (tmp_answer_ptr - tmp_answer),
-                                                                                                                 (timeout_sec * 1000) + (timeout_usec ? (timeout_usec / 1000) : 0)) > 0)) {
+       while ((!tech_pvt->controldev_dead) && msecs_passed <= timeout_in_msec){
                char *token_ptr;
                timeout.tv_sec = timeout_sec;   //reset the timeout, linux modify it
                timeout.tv_usec = timeout_usec; //reset the timeout, linux modify it
+
+read:
+               switch_sleep(20000);
+               msecs_passed += 20;
+
+               if (timeout_in_msec != 100){
+                       ERRORA("TIMEOUT=%d, PASSED=%d\n", GSMOPEN_P_LOG, timeout_in_msec, msecs_passed);
+               }
+               //read_count = tech_pvt->serialPort_serial_control->Readv(tmp_answer_ptr, AT_BUFSIZ - (tmp_answer_ptr - tmp_answer), (timeout_sec * 1000) + (timeout_usec ? (timeout_usec / 1000) : 0));
+               read_count = tech_pvt->serialPort_serial_control->Read(tmp_answer_ptr, AT_BUFSIZ - (tmp_answer_ptr - tmp_answer));
+
                //cicopet read_count = read(tech_pvt->controldevfd, tmp_answer_ptr, AT_BUFSIZ - (tmp_answer_ptr - tmp_answer));
-               //cicopet read_count = tech_pvt->serialPort_serial_control->Readv(tmp_answer_ptr, AT_BUFSIZ - (tmp_answer_ptr - tmp_answer), (timeout_sec * 1000) + (timeout_usec ? (timeout_usec / 1000) : 0 ) );
 
                if (read_count == 0) {
+                       if(msecs_passed <= timeout_in_msec){
+                       goto read;
+                       }
+               }
+               if (read_count == -1) {
                        ERRORA
-                               ("read 0 bytes!!! Nenormalno! Marking this gsmopen_serial_device %s as dead, andif it is owned by a channel, hanging up. Maybe the phone is stuck, switched off, power down or battery exhausted\n",
+                               ("read -1 bytes!!! Nenormalno! Marking this gsmopen_serial_device %s as dead, andif it is owned by a channel, hanging up. Maybe the phone is stuck, switched off, power down or battery exhausted\n",
                                 GSMOPEN_P_LOG, tech_pvt->controldevice_name);
                        tech_pvt->controldev_dead = 1;
                        //cicopet close(tech_pvt->controldevfd);
@@ -720,11 +764,17 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us
                                                           tech_pvt->line_array.result[i], tech_pvt->callid_name, tech_pvt->callid_number);
                        }
 
+                       if ((strncmp(tech_pvt->line_array.result[i], "+CMS ERROR:", 11) == 0)) {
+                               ERRORA("Received: \"%s\", what was this error about?\n", GSMOPEN_P_LOG);
+                       }
+                       if ((strcmp(tech_pvt->line_array.result[i], "+CMS ERROR: 500") == 0)) {
+                               ERRORA("Received: \"%s\", maybe this account ran OUT OF CREDIT?\n", GSMOPEN_P_LOG);
+                       }
                        if ((strcmp(tech_pvt->line_array.result[i], "BUSY") == 0)) {
                                tech_pvt->phone_callflow = CALLFLOW_CALL_LINEBUSY;
                                if (option_debug > 1)
                                        DEBUGA_GSMOPEN("|%s| CALLFLOW_CALL_LINEBUSY\n", GSMOPEN_P_LOG, tech_pvt->line_array.result[i]);
-                               //if (tech_pvt->interface_state != GSMOPEN_STATE_DOWN && tech_pvt->owner && tech_pvt->phone_callflow != CALLFLOW_CALL_DOWN) {
+                               //if (tech_pvt->interface_state != GSMOPEN_STATE_DOWN && tech_pvt->owner && tech_pvt->phone_callflow != CALLFLOW_CALL_DOWN) 
                                if (tech_pvt->interface_state != GSMOPEN_STATE_DOWN && tech_pvt->phone_callflow != CALLFLOW_CALL_DOWN) {
                                        //ast_setstate(tech_pvt->owner, GSMOPEN_STATE_BUSY);
                                        //gsmopen_queue_control(tech_pvt->owner, GSMOPEN_CONTROL_BUSY);
@@ -1082,54 +1132,6 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us
 
                                                res = sms_incoming(tech_pvt);
 
-#if 0
-                                               if (strlen(tech_pvt->sms_message)) {
-                                                       //FIXME manager_event(EVENT_FLAG_SYSTEM, "GSMOPENincomingsms",
-                                                       //FIXME "Interface: %s\r\nSMS_Message: %s\r\n", tech_pvt->name,
-                                                       //FIXME tech_pvt->sms_message);
-
-                                                       res = sms_incoming(tech_pvt, tech_pvt->sms_message);
-
-                                                       if (strlen(tech_pvt->sms_receiving_program)) {
-                                                               int fd1[2];
-                                                               pid_t pid1;
-                                                               char *arg1[] = { tech_pvt->sms_receiving_program, (char *) NULL };
-                                                               int i;
-
-                                                               DEBUGA_GSMOPEN("incoming SMS message:>>>%s<<<\n", GSMOPEN_P_LOG, tech_pvt->sms_message);
-                                                               res = pipe(fd1);
-                                                               pid1 = fork();
-
-                                                               if (pid1 == 0) {        //child
-                                                                       int err;
-
-                                                                       dup2(fd1[0], 0);        // Connect stdin to pipe output
-                                                                       close(fd1[1]);  // close input pipe side
-                                                                       close(tech_pvt->controldevfd);
-                                                                       setsid();       //session id
-                                                                       err = execvp(arg1[0], arg1);    //exec our program, with stdin connected to pipe output
-                                                                       if (err) {
-                                                                               ERRORA
-                                                                                       ("'sms_receiving_program' is set in config file to '%s', and it gave us back this error: %d, (%s). SMS received was:---%s---\n",
-                                                                                        GSMOPEN_P_LOG, tech_pvt->sms_receiving_program, err, strerror(errno), tech_pvt->sms_message);
-                                                                       }
-                                                                       close(fd1[0]);  // close output pipe side
-                                                               }
-//starting here continue the parent
-                                                               close(fd1[0]);  // close output pipe side
-                                                               // write the msg on the pipe input
-                                                               for (i = 0; i < strlen(tech_pvt->sms_message); i++) {
-                                                                       res = write(fd1[1], &tech_pvt->sms_message[i], 1);
-                                                               }
-                                                               close(fd1[1]);  // close pipe input, let our program know we've finished
-                                                       } else {
-                                                               ERRORA
-                                                                       ("got SMS incoming message, but 'sms_receiving_program' is not set in config file. SMS received was:---%s---\n",
-                                                                        GSMOPEN_P_LOG, tech_pvt->sms_message);
-                                                       }
-                                               }
-#endif //0
-#if 1                                                  //is this one needed? maybe it can interrupt an incoming call that is just to announce itself
                                                if (tech_pvt->phone_callflow == CALLFLOW_CALL_IDLE && tech_pvt->interface_state == GSMOPEN_STATE_DOWN && tech_pvt->owner == NULL) {
                                                        /* we're not in a call, neither calling */
                                                        res = gsmopen_serial_write_AT_ack(tech_pvt, "AT+CKPD=\"EEE\"");
@@ -1137,7 +1139,6 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us
                                                                ERRORA("AT+CKPD=\"EEE\" (cellphone screen back to user) do not got OK from the phone\n", GSMOPEN_P_LOG);
                                                        }
                                                }
-#endif
                                        }                       //unread_msg_id
 
                                }                               //CMTI well formatted
@@ -1511,7 +1512,6 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us
                                memset(sms_body, '\0', sizeof(sms_body));
 
                                if (strncmp(tech_pvt->line_array.result[i], "+CMGR", 5) == 0) { /* we are reading the "header" of an SMS */
-#if 1
                                        char content[512];
                                        char content2[512];
                                        int inside_comma = 0;
@@ -1542,16 +1542,10 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us
                                                                                           &tech_pvt->line_array.result[i][c]);
                                                                DEBUGA_GSMOPEN("%d content=%s\n", GSMOPEN_P_LOG, which_field, content);
 
-                                                               //strncat(tech_pvt->sms_message, "---", ((sizeof(tech_pvt->sms_message) - strlen(tech_pvt->sms_message)) - 1));
-                                                               //strncat(tech_pvt->sms_message, content, ((sizeof(tech_pvt->sms_message) - strlen(tech_pvt->sms_message)) - 1));
-                                                               //strncat(tech_pvt->sms_message, "|||", ((sizeof(tech_pvt->sms_message) - strlen(tech_pvt->sms_message)) - 1));
-
                                                                memset(content2, '\0', sizeof(content2));
                                                                if (which_field == 1) {
                                                                        //FIXME why this? err = ucs2_to_utf8(tech_pvt, content, content2, sizeof(content2));
                                                                        err = ucs2_to_utf8(tech_pvt, content, content2, sizeof(content2));
-                                                                       //err = 0;
-                                                                       //strncpy(content2, content, sizeof(content2));
                                                                } else {
                                                                        err = 0;
                                                                        strncpy(content2, content, sizeof(content2));
@@ -1559,10 +1553,6 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us
                                                                DEBUGA_GSMOPEN("%d content2=%s\n", GSMOPEN_P_LOG, which_field, content2);
                                                                DEBUGA_GSMOPEN("%d content=%s\n", GSMOPEN_P_LOG, which_field, content2);
 
-                                                               //strncat(tech_pvt->sms_message, "---", ((sizeof(tech_pvt->sms_message) - strlen(tech_pvt->sms_message)) - 1));
-                                                               //if (!err)
-                                                               //strncat(tech_pvt->sms_message, content2, ((sizeof(tech_pvt->sms_message) - strlen(tech_pvt->sms_message)) - 1));
-                                                               //strncat(tech_pvt->sms_message, "|||", ((sizeof(tech_pvt->sms_message) - strlen(tech_pvt->sms_message)) - 1));
                                                                memset(content, '\0', sizeof(content));
                                                                d = 0;
                                                                if (which_field == 1) {
@@ -1590,7 +1580,6 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us
                                                }
 
                                        }
-#endif //1
                                }                               //it was the +CMGR answer from the cellphone
                                else {
                                        DEBUGA_GSMOPEN("body=%s\n", GSMOPEN_P_LOG, sms_body);
@@ -1599,15 +1588,12 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us
                                                char content3[1000];
                                                strncpy(tech_pvt->sms_message, tech_pvt->line_array.result[i], sizeof(tech_pvt->sms_message));
 
-                                               //int howmanyleft;
 
                                                memset(content3, '\0', sizeof(content3));
                                                DEBUGA_GSMOPEN("sms_message=%s\n", GSMOPEN_P_LOG, tech_pvt->sms_message);
                                                ucs2_to_utf8(tech_pvt, tech_pvt->sms_message, content3, sizeof(content3));
                                                DEBUGA_GSMOPEN("content3=%s\n", GSMOPEN_P_LOG, content3);
                                                strncpy(tech_pvt->sms_body, content3, sizeof(tech_pvt->sms_body));
-                                               //sleep(10);
-                                               //cicopet
                                                if (tech_pvt->sms_cnmi_not_supported) {
                                                        sms_incoming(tech_pvt);
                                                        DEBUGA_GSMOPEN("2 content3=%s\n", GSMOPEN_P_LOG, content3);
@@ -1615,23 +1601,6 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us
                                        } else {
                                        }
 
-#if 0
-                                       //strncat(tech_pvt->sms_message, "---", ((sizeof(tech_pvt->sms_message) - strlen(tech_pvt->sms_message)) - 1));
-                                       //strncat(tech_pvt->sms_message, tech_pvt->line_array.result[i], ((sizeof(tech_pvt->sms_message) - strlen(tech_pvt->sms_message)) - 1));
-                                       //strncat(tech_pvt->sms_message, "|||", ((sizeof(tech_pvt->sms_message) - strlen(tech_pvt->sms_message)) - 1));
-
-                                       memset(sms_body, '\0', sizeof(sms_body));
-                                       err = ucs2_to_utf8(tech_pvt, tech_pvt->line_array.result[i], sms_body, sizeof(sms_body));
-                                       DEBUGA_GSMOPEN("body=%s\n", GSMOPEN_P_LOG, sms_body);
-                                       strncpy(tech_pvt->sms_body, sms_body, sizeof(tech_pvt->sms_body));
-
-                                       //strncat(tech_pvt->sms_message, "---", ((sizeof(tech_pvt->sms_message) - strlen(tech_pvt->sms_message)) - 1));
-                                       //if (!err)
-                                       //strncat(tech_pvt->sms_message, sms_body, ((sizeof(tech_pvt->sms_message) - strlen(tech_pvt->sms_message)) - 1));
-                                       //strncat(tech_pvt->sms_message, "|||", ((sizeof(tech_pvt->sms_message) - strlen(tech_pvt->sms_message)) - 1));
-
-                                       //DEBUGA_GSMOPEN("sms_message=%s\n", GSMOPEN_P_LOG, tech_pvt->sms_message);
-#endif //0
                                }                               //it was the UCS2 from cellphone
 
                        }                                       //we were reading the SMS
@@ -1655,7 +1624,6 @@ int gsmopen_serial_read_AT(private_t *tech_pvt, int look_for_ack, int timeout_us
        if (select_err == -1) {
                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;
-               //cicopet close(tech_pvt->controldevfd);
 
                tech_pvt->running = 0;
                alarm_event(tech_pvt, ALARM_FAILED_INTERFACE, "select returned -1 on interface, setting controldev_dead");
@@ -1757,6 +1725,30 @@ int gsmopen_serial_write_AT(private_t *tech_pvt, const char *data)
                        }
                        if (res != 1) {
                                ERRORA("Error RE-sending (%.1s): %d %d (%s)\n", GSMOPEN_P_LOG, &Data[i], count, res, strerror(errno));
+
+
+
+                               ERRORA
+                                       ("wrote -1 bytes!!! Nenormalno! Marking this gsmopen_serial_device %s as dead, andif it is owned by a channel, hanging up. Maybe the phone is stuck, switched off, power down or battery exhausted\n",
+                                        GSMOPEN_P_LOG, tech_pvt->controldevice_name);
+                               tech_pvt->controldev_dead = 1;
+                               //cicopet 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;
                        }
                }
@@ -1785,6 +1777,26 @@ int gsmopen_serial_write_AT(private_t *tech_pvt, const char *data)
                }
                if (res != 1) {
                        ERRORA("Error RE-sending (carriage return): %d %d (%s)\n", GSMOPEN_P_LOG, count, res, strerror(errno));
+
+                               ERRORA
+                                       ("wrote -1 bytes!!! Nenormalno! Marking this gsmopen_serial_device %s as dead, andif it is owned by a channel, hanging up. Maybe the phone is stuck, switched off, power down or battery exhausted\n",
+                                        GSMOPEN_P_LOG, tech_pvt->controldevice_name);
+                               tech_pvt->controldev_dead = 1;
+                               //cicopet 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;
                }
        }
@@ -1824,6 +1836,26 @@ int gsmopen_serial_write_AT_nocr(private_t *tech_pvt, const char *data)
                        }
                        if (res != 1) {
                                ERRORA("Error RE-sending (%.1s): %d %d (%s)\n", GSMOPEN_P_LOG, &Data[i], count, res, strerror(errno));
+
+                               ERRORA
+                                       ("wrote -1 bytes!!! Nenormalno! Marking this gsmopen_serial_device %s as dead, andif it is owned by a channel, hanging up. Maybe the phone is stuck, switched off, power down or battery exhausted\n",
+                                        GSMOPEN_P_LOG, tech_pvt->controldevice_name);
+                               tech_pvt->controldev_dead = 1;
+                               //cicopet 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;
                        }
                }
@@ -1849,6 +1881,26 @@ int gsmopen_serial_write_AT_noack(private_t *tech_pvt, const char *data)
 
                ERRORA("Error sending data... (%s)\n", GSMOPEN_P_LOG, strerror(errno));
                UNLOCKA(tech_pvt->controldev_lock);
+
+                               ERRORA
+                                       ("wrote -1 bytes!!! Nenormalno! Marking this gsmopen_serial_device %s as dead, andif it is owned by a channel, hanging up. Maybe the phone is stuck, switched off, power down or battery exhausted\n",
+                                        GSMOPEN_P_LOG, tech_pvt->controldevice_name);
+                               tech_pvt->controldev_dead = 1;
+                               //cicopet 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;
        }
        UNLOCKA(tech_pvt->controldev_lock);
@@ -1868,6 +1920,26 @@ int gsmopen_serial_write_AT_ack(private_t *tech_pvt, const char *data)
        if (gsmopen_serial_write_AT(tech_pvt, data) != strlen(data)) {
                ERRORA("Error sending data... (%s) \n", GSMOPEN_P_LOG, strerror(errno));
                UNLOCKA(tech_pvt->controldev_lock);
+
+                               ERRORA
+                                       ("wrote -1 bytes!!! Nenormalno! Marking this gsmopen_serial_device %s as dead, andif it is owned by a channel, hanging up. Maybe the phone is stuck, switched off, power down or battery exhausted\n",
+                                        GSMOPEN_P_LOG, tech_pvt->controldevice_name);
+                               tech_pvt->controldev_dead = 1;
+                               //cicopet 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;
        }
        //cicopet at_result = gsmopen_serial_read_AT(tech_pvt, 1, 500000, 2, NULL, 1);  // 2.5 sec timeout
@@ -1890,11 +1962,30 @@ int gsmopen_serial_write_AT_ack_nocr_longtime(private_t *tech_pvt, const char *d
        if (gsmopen_serial_write_AT_nocr(tech_pvt, data) != strlen(data)) {
                ERRORA("Error sending data... (%s) \n", GSMOPEN_P_LOG, strerror(errno));
                UNLOCKA(tech_pvt->controldev_lock);
+
+                               ERRORA
+                                       ("wrote -1 bytes!!! Nenormalno! Marking this gsmopen_serial_device %s as dead, andif it is owned by a channel, hanging up. Maybe the phone is stuck, switched off, power down or battery exhausted\n",
+                                        GSMOPEN_P_LOG, tech_pvt->controldevice_name);
+                               tech_pvt->controldev_dead = 1;
+                               //cicopet 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;
        }
 
-       //at_result = gsmopen_serial_read_AT(tech_pvt, 1, 500000, 20, NULL, 1); // 20.5 sec timeout
-       at_result = gsmopen_serial_read_AT(tech_pvt, 1, 500000, 3, NULL, 1);    // 3.5 sec timeout
+       at_result = gsmopen_serial_read_AT(tech_pvt, 1, 500000, 5, NULL, 1);    // 5.5 sec timeout
        UNLOCKA(tech_pvt->controldev_lock);
        POPPA_UNLOCKA(tech_pvt->controldev_lock);
 
@@ -1913,6 +2004,26 @@ int gsmopen_serial_write_AT_expect1(private_t *tech_pvt, const char *data, const
        if (gsmopen_serial_write_AT(tech_pvt, data) != strlen(data)) {
                ERRORA("Error sending data... (%s) \n", GSMOPEN_P_LOG, strerror(errno));
                UNLOCKA(tech_pvt->controldev_lock);
+
+                               ERRORA
+                                       ("wrote -1 bytes!!! Nenormalno! Marking this gsmopen_serial_device %s as dead, andif it is owned by a channel, hanging up. Maybe the phone is stuck, switched off, power down or battery exhausted\n",
+                                        GSMOPEN_P_LOG, tech_pvt->controldevice_name);
+                               tech_pvt->controldev_dead = 1;
+                               //cicopet 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;
        }