static void client_handle_line( Client client, const char* cmd ) { const char* answer; dump_line( cmd, "<< " ); answer = amodem_send( modem, cmd ); if (answer == NULL) /* not an AT command, ignored */ { printf( "-- NO ANSWER\n" ); return; } dump_line( answer, ">> " ); client_append( client, answer, -1 ); client_append( client, "\r", 1 ); }
/* despite its name, this function is called when the device writes to the modem */ static void modem_driver_read( void* _md, const uint8_t* src, int len ) { ModemDriver* md = _md; const uint8_t* end = src + len; int nn; D( "%s: reading %d from %p bytes:", __FUNCTION__, len, src ); for (nn = 0; nn < len; nn++) { int c = src[nn]; if (c >= 32 && c < 127) D( "%c", c ); else if (c == '\n') D( "<LF>" ); else if (c == '\r') D( "<CR>" ); else D( "\\x%02x", c ); } D( "\n" ); for ( ; src < end; src++ ) { char c = src[0]; if (md->in_sms) { if (c != 26) goto AppendChar; md->in_buff[ md->in_pos ] = c; md->in_pos++; md->in_sms = 0; c = '\n'; } if (c == '\n' || c == '\r') { const char* answer; if (md->in_pos == 0) /* skip empty lines */ continue; md->in_buff[ md->in_pos ] = 0; md->in_pos = 0; D( "%s: << %s\n", __FUNCTION__, md->in_buff ); answer = amodem_send(android_modem, md->in_buff); if (answer != NULL) { D( "%s: >> %s\n", __FUNCTION__, answer ); len = strlen(answer); if (len == 2 && answer[0] == '>' && answer[1] == ' ') md->in_sms = 1; //MTK-START [mtk80950] [ALPSXXXXXXXX] [111115] porting MTK-code to ICS //YQ_TODO int templen = strlen(answer); char an[templen+1]; strcpy(an,"@"); strcat(an,answer); answer=an; if( memcmp(answer, "@+CSQ", 5)){ printf("[Emu] response %s\r\n",answer); } qemu_chr_write(md->cs, (const uint8_t*)answer, len+1); //MTK-END [mtk80950] [ALPSXXXXXXXX] [111115] porting MTK-code to ICS qemu_chr_write(md->cs, (const uint8_t*)"\r", 1); } else D( "%s: -- NO ANSWER\n", __FUNCTION__ ); continue; } AppendChar: md->in_buff[ md->in_pos++ ] = c; if (md->in_pos == sizeof(md->in_buff)) { /* input is too long !! */ md->in_pos = 0; } } D( "%s: done\n", __FUNCTION__ ); }