static void gn_atem_sms_handle() { gn_error error; char buffer[MAX_LINE_LENGTH]; data.sms->memory_type = SMSType; data.sms->number = SMSNumber; error = gn_sms_get(&data, sm); switch (error) { case GN_ERR_NONE: gn_atem_sms_print(buffer, data.sms, INTERACT_MODE); gn_atem_string_out(buffer); break; default: gsprintf(buffer, MAX_LINE_LENGTH, _("\r\nNo message under number %d\r\n"), SMSNumber); gn_atem_string_out(buffer); break; } return; }
/* Handle AT+C commands, this is a quick hack together at this stage. */ bool gn_atem_command_plusc(char **buf) { float rflevel = -1; gn_rf_unit rfunits = GN_RF_CSQ; char buffer[MAX_LINE_LENGTH], buffer2[MAX_LINE_LENGTH]; int status, index; gn_error error; if (strncasecmp(*buf, "SQ", 2) == 0) { buf[0] += 2; data.rf_unit = &rfunits; data.rf_level = &rflevel; if (gn_sm_functions(GN_OP_GetRFLevel, &data, sm) == GN_ERR_NONE) { gsprintf(buffer, MAX_LINE_LENGTH, "+CSQ: %0.0f, 99\r\n", *(data.rf_level)); gn_atem_string_out(buffer); return (false); } else { return (true); } } /* AT+CGMI is Manufacturer information for the ME (phone) so it should be Nokia rather than gnokii... */ if (strncasecmp(*buf, "GMI", 3) == 0) { buf[0] += 3; gn_atem_string_out(_("Nokia Mobile Phones\r\n")); return (false); } /* AT+CGSN is IMEI */ if (strncasecmp(*buf, "GSN", 3) == 0) { buf[0] += 3; snprintf(data.imei, GN_IMEI_MAX_LENGTH, "+CME ERROR: 0"); if (gn_sm_functions(GN_OP_GetImei, &data, sm) == GN_ERR_NONE) { gsprintf(buffer, MAX_LINE_LENGTH, "%s\r\n", data.imei); gn_atem_string_out(buffer); return (false); } else { return (true); } } /* AT+CGMR is Revision (hardware) */ if (strncasecmp(*buf, "GMR", 3) == 0) { buf[0] += 3; snprintf(data.revision, GN_REVISION_MAX_LENGTH, "+CME ERROR: 0"); if (gn_sm_functions(GN_OP_GetRevision, &data, sm) == GN_ERR_NONE) { gsprintf(buffer, MAX_LINE_LENGTH, "%s\r\n", data.revision); gn_atem_string_out(buffer); return (false); } else { return (true); } } /* AT+CGMM is Model code */ if (strncasecmp(*buf, "GMM", 3) == 0) { buf[0] += 3; snprintf(data.model, GN_MODEL_MAX_LENGTH, "+CME ERROR: 0"); if (gn_sm_functions(GN_OP_GetModel, &data, sm) == GN_ERR_NONE) { gsprintf(buffer, MAX_LINE_LENGTH, "%s\r\n", data.model); gn_atem_string_out(buffer); return (false); } else { return (true); } } /* AT+CMGD is deleting a message */ if (strncasecmp(*buf, "MGD", 3) == 0) { buf[0] += 3; switch (**buf) { case '=': buf[0]++; index = atoi(*buf); buf[0] += strlen(*buf); data.sms->memory_type = SMSType; data.sms->number = index; error = gn_sm_functions(GN_OP_DeleteSMS, &data, sm); switch (error) { case GN_ERR_NONE: break; default: gsprintf(buffer, MAX_LINE_LENGTH, "\r\n+CMS ERROR: %d\r\n", error); gn_atem_string_out(buffer); return (true); } break; default: return (true); } return (false); } /* AT+CMGF is mode selection for message format */ if (strncasecmp(*buf, "MGF", 3) == 0) { buf[0] += 3; switch (**buf) { case '=': buf[0]++; switch (**buf) { case '0': buf[0]++; MessageFormat = PDU_MODE; break; case '1': buf[0]++; MessageFormat = TEXT_MODE; break; default: return (true); } break; case '?': buf[0]++; gsprintf(buffer, MAX_LINE_LENGTH, "+CMGF: %d\r\n", MessageFormat); gn_atem_string_out(buffer); break; default: return (true); } return (false); } /* AT+CMGR is reading a message */ if (strncasecmp(*buf, "MGR", 3) == 0) { buf[0] += 3; switch (**buf) { case '=': buf[0]++; index = atoi(*buf); buf[0] += strlen(*buf); data.sms->memory_type = SMSType; data.sms->number = index; error = gn_sms_get(&data, sm); switch (error) { case GN_ERR_NONE: gn_atem_sms_print(buffer2, data.sms, MessageFormat); gsprintf(buffer, MAX_LINE_LENGTH, "+CMGR: %s\r\n", buffer2); gn_atem_string_out(buffer); break; default: gsprintf(buffer, MAX_LINE_LENGTH, "\r\n+CMS ERROR: %d\r\n", error); gn_atem_string_out(buffer); return (true); } break; default: return (true); } return (false); } /* AT+CMGS is sending a message */ if (strncasecmp(*buf, "MGS", 3) == 0) { buf[0] += 3; switch (**buf) { case '=': buf[0]++; if (sscanf(*buf, "\"%[+0-9a-zA-Z ]\"", sms.remote.number)) { Parser = gn_atem_sms_parseText; buf[0] += strlen(*buf); gn_atem_string_out("\r\n> "); } return (true); default: return (true); } return (false); } /* AT+CMGL is listing messages */ if (strncasecmp(*buf, "MGL", 3) == 0) { buf[0] += 3; status = -1; switch (**buf) { case 0: case '=': buf[0]++; /* process <stat> parameter */ if (*(*buf-1) == 0 || /* i.e. no parameter given */ strcasecmp(*buf, "1") == 0 || strcasecmp(*buf, "3") == 0 || strcasecmp(*buf, "\"REC READ\"") == 0 || strcasecmp(*buf, "\"STO SENT\"") == 0) { status = GN_SMS_Sent; } else if (strcasecmp(*buf, "0") == 0 || strcasecmp(*buf, "2") == 0 || strcasecmp(*buf, "\"REC UNREAD\"") == 0 || strcasecmp(*buf, "\"STO UNSENT\"") == 0) { status = GN_SMS_Unsent; } else if (strcasecmp(*buf, "4") == 0 || strcasecmp(*buf, "\"ALL\"") == 0) { status = 4; /* ALL */ } else { return true; } buf[0] += strlen(*buf); /* check all message storages */ for (index = 1; index <= 20; index++) { data.sms->memory_type = SMSType; data.sms->number = index; error = gn_sms_get(&data, sm); switch (error) { case GN_ERR_NONE: /* print messsage if it has the required status */ if (data.sms->status == status || status == 4 /* ALL */) { gn_atem_sms_print(buffer2, data.sms, MessageFormat); gsprintf(buffer, MAX_LINE_LENGTH, "+CMGL: %d,%s\r\n", index, buffer2); gn_atem_string_out(buffer); } break; case GN_ERR_EMPTYLOCATION: /* don't care if this storage is empty */ break; default: /* print other error codes and quit */ gsprintf(buffer, MAX_LINE_LENGTH, "\r\n+CMS ERROR: %d\r\n", error); gn_atem_string_out(buffer); return (true); } } break; default: return (true); } return (false); } return (true); }
/* Handle AT+C commands, this is a quick hack together at this stage. */ bool gn_atem_command_plusc(char **buf) { float rflevel = -1; gn_rf_unit rfunits = GN_RF_CSQ; char buffer[MAX_LINE_LENGTH], buffer2[MAX_LINE_LENGTH]; int status, index; gn_error error; if (strncasecmp(*buf, "SQ", 2) == 0) { buf[0] += 2; data.rf_unit = &rfunits; data.rf_level = &rflevel; if (gn_sm_functions(GN_OP_GetRFLevel, &data, sm) == GN_ERR_NONE) { gsprintf(buffer, MAX_LINE_LENGTH, "+CSQ: %0.0f, 99\r\n", *(data.rf_level)); gn_atem_string_out(buffer); return (false); } else { return (true); } } /* AT+CGMI is Manufacturer information for the ME (phone) so it should be Nokia rather than gnokii... */ if (strncasecmp(*buf, "GMI", 3) == 0) { buf[0] += 3; gsprintf(buffer, MAX_LINE_LENGTH, "%s\r\n", data.manufacturer); gn_atem_string_out(buffer); return (false); } /* AT+CGSN is IMEI */ if (strncasecmp(*buf, "GSN", 3) == 0) { buf[0] += 3; strcpy(data.imei, gn_atem_cme(0)); if (gn_sm_functions(GN_OP_GetImei, &data, sm) == GN_ERR_NONE) { gsprintf(buffer, MAX_LINE_LENGTH, "%s\r\n", data.imei); gn_atem_string_out(buffer); return (false); } else { return (true); } } /* AT+CGMR is Revision (hardware) */ if (strncasecmp(*buf, "GMR", 3) == 0) { buf[0] += 3; strcpy(data.revision, gn_atem_cme(0)); if (gn_sm_functions(GN_OP_GetRevision, &data, sm) == GN_ERR_NONE) { gsprintf(buffer, MAX_LINE_LENGTH, "%s\r\n", data.revision); gn_atem_string_out(buffer); return (false); } else { return (true); } } /* AT+CGMM is Model code */ if (strncasecmp(*buf, "GMM", 3) == 0) { buf[0] += 3; strcpy(data.model, gn_atem_cme(0)); if (gn_sm_functions(GN_OP_GetModel, &data, sm) == GN_ERR_NONE) { gsprintf(buffer, MAX_LINE_LENGTH, "%s\r\n", data.model); gn_atem_string_out(buffer); return (false); } else { return (true); } } /* AT+CMGD is deleting a message */ if (strncasecmp(*buf, "MGD", 3) == 0) { buf[0] += 3; switch (**buf) { case '=': buf[0]++; index = atoi(*buf); buf[0] += strlen(*buf); data.sms->memory_type = SMSType; data.sms->number = index; error = gn_sm_functions(GN_OP_DeleteSMS, &data, sm); switch (error) { case GN_ERR_NONE: break; default: gsprintf(buffer, MAX_LINE_LENGTH, "\r\n+CMS ERROR: %d\r\n", error); gn_atem_string_out(buffer); return (true); } break; default: return (true); } return (false); } /* AT+CMGF is mode selection for message format */ if (strncasecmp(*buf, "MGF", 3) == 0) { buf[0] += 3; switch (**buf) { case '=': buf[0]++; switch (**buf) { case '0': buf[0]++; MessageFormat = PDU_MODE; break; case '1': buf[0]++; MessageFormat = TEXT_MODE; break; default: return (true); } break; case '?': buf[0]++; gsprintf(buffer, MAX_LINE_LENGTH, "+CMGF: %d\r\n", MessageFormat); gn_atem_string_out(buffer); break; default: return (true); } return (false); } /* AT+CMGR is reading a message */ if (strncasecmp(*buf, "MGR", 3) == 0) { buf[0] += 3; switch (**buf) { case '=': buf[0]++; index = atoi(*buf); buf[0] += strlen(*buf); data.sms->memory_type = SMSType; data.sms->number = index; error = gn_sms_get(&data, sm); switch (error) { case GN_ERR_NONE: gn_atem_sms_print(buffer2, data.sms, MessageFormat); gsprintf(buffer, MAX_LINE_LENGTH, "+CMGR: %s\r\n", buffer2); gn_atem_string_out(buffer); break; default: gsprintf(buffer, MAX_LINE_LENGTH, "\r\n+CMS ERROR: %d\r\n", error); gn_atem_string_out(buffer); return (true); } break; default: return (true); } return (false); } /* AT+CMGS is sending a message */ if (strncasecmp(*buf, "MGS", 3) == 0) { buf[0] += 3; switch (**buf) { case '=': buf[0]++; if (sscanf(*buf, "\"%[+0-9a-zA-Z ]\"", sms.remote.number)) { Parser = gn_atem_sms_parseText; buf[0] += strlen(*buf); gn_atem_string_out("\r\n> "); } return (true); default: return (true); } return (false); } /* AT+CMGL is listing messages */ if (strncasecmp(*buf, "MGL", 3) == 0) { buf[0] += 3; status = -1; switch (**buf) { case 0: case '=': buf[0]++; /* process <stat> parameter */ if (*(*buf-1) == 0 || /* i.e. no parameter given */ strcasecmp(*buf, "1") == 0 || strcasecmp(*buf, "3") == 0 || strcasecmp(*buf, "\"REC READ\"") == 0 || strcasecmp(*buf, "\"STO SENT\"") == 0) { status = GN_SMS_Sent; } else if (strcasecmp(*buf, "0") == 0 || strcasecmp(*buf, "2") == 0 || strcasecmp(*buf, "\"REC UNREAD\"") == 0 || strcasecmp(*buf, "\"STO UNSENT\"") == 0) { status = GN_SMS_Unsent; } else if (strcasecmp(*buf, "4") == 0 || strcasecmp(*buf, "\"ALL\"") == 0) { /* TODO: in TEXT mode only "ALL" should be * accepted, and in PDU mode only the "4" * form. */ status = 4; /* ALL */ } else { return true; } buf[0] += strlen(*buf); /* check all message storages */ for (index = 1; index <= 20; index++) { data.sms->memory_type = SMSType; data.sms->number = index; error = gn_sms_get(&data, sm); switch (error) { case GN_ERR_NONE: /* print messsage if it has the required status */ if (data.sms->status == status || status == 4 /* ALL */) { gn_atem_sms_print(buffer2, data.sms, MessageFormat); gsprintf(buffer, MAX_LINE_LENGTH, "+CMGL: %d,%s\r\n", index, buffer2); gn_atem_string_out(buffer); } break; case GN_ERR_EMPTYLOCATION: /* don't care if this storage is empty */ break; default: /* print other error codes and quit */ gsprintf(buffer, MAX_LINE_LENGTH, "\r\n+CMS ERROR: %d\r\n", error); gn_atem_string_out(buffer); return (true); } } break; default: return (true); } return (false); } /* AT+CSCS is character set selection */ if (strncasecmp(*buf, "SCS", 3) == 0) { buf[0] += 3; return gn_atem_parse_option(buf, &gn_atem_op_cscs, data.cscs); } /* AT+CIMI is international mobile subscriber identity */ if (strcasecmp(*buf, "IMI") == 0) { buf[0] += 3; gn_atem_string_out("QEMU_IMSI\r\n"); return (false); } /* AT+CMUX is multiplexing mode */ if (strncasecmp(*buf, "MUX", 3) == 0) { buf[0] += 3; return gn_atem_parse_option(buf, &gn_atem_op_cmux, data.cmux); } /* AT+CMEE is Mobile Termination error reporting */ if (strncasecmp(*buf, "MEE", 3) == 0) { buf[0] += 3; return gn_atem_parse_option(buf, &gn_atem_op_cmee, data.cmee); } /* AT+CLIP is calling line identification presentation */ if (strncasecmp(*buf, "LIP", 3) == 0) { buf[0] += 3; return gn_atem_parse_option(buf, &gn_atem_op_clip, data.clip); } /* AT+COLP is connected line identification presentation */ if (strncasecmp(*buf, "OLP", 3) == 0) { buf[0] += 3; return gn_atem_parse_option(buf, &gn_atem_op_colp, data.colp); } /* AT+CSTA is address type selection */ if (strncasecmp(*buf, "STA", 3) == 0) { buf[0] += 3; return gn_atem_parse_option(buf, &gn_atem_op_csta, data.csta); } /* AT+CMOD is call mode */ if (strncasecmp(*buf, "MOD", 3) == 0) { buf[0] += 3; return gn_atem_parse_option(buf, &gn_atem_op_cmod, data.cmod); } /* AT+CBST is bearer service type */ if (strncasecmp(*buf, "BST", 3) == 0) { buf[0] += 3; return gn_atem_parse_option(buf, &gn_atem_op_cbst, data.cbst); } /* AT+CRLP is radio link protocol */ if (strncasecmp(*buf, "RLP", 3) == 0) { buf[0] += 3; return gn_atem_parse_option(buf, &gn_atem_op_crlp, data.crlp); } /* AT+CRC is cellular result codes */ if (strncasecmp(*buf, "RC", 2) == 0) { buf[0] += 2; return gn_atem_parse_option(buf, &gn_atem_op_crc, data.crc); } /* AT+CREG is network registration */ if (strncasecmp(*buf, "REG", 3) == 0) { buf[0] += 3; return gn_atem_parse_option(buf, &gn_atem_op_creg, data.creg); } /* AT+CR is reporting control */ if (strncasecmp(*buf, "R", 1) == 0) { buf[0] += 1; return gn_atem_parse_option(buf, &gn_atem_op_cr, data.cr); } /* AT+CEER is extended error report */ if (strncasecmp(*buf, "EER", 3) == 0) { buf[0] += 3; gn_atem_string_out("+CEER: 0,0,5,16,normal call clearing\r\n"); return (false); } /* AT+CSNS is single numbering scheme */ if (strncasecmp(*buf, "SNS", 3) == 0) { buf[0] += 3; return gn_atem_parse_option(buf, &gn_atem_op_csns, data.csns); } /* AT+COPS is PLMN selection */ if (strncasecmp(*buf, "OPS", 3) == 0) { buf[0] += 3; return gn_atem_parse_option(buf, &gn_atem_op_cops, data.cops); } /* AT+CPAS is phone activity status */ if (strncasecmp(*buf, "PAS", 3) == 0) { buf[0] += 3; return gn_atem_parse_option(buf, &gn_atem_op_cpas, data.cpas); } /* AT+CFUN is phone functionality */ if (strncasecmp(*buf, "FUN", 3) == 0) { buf[0] += 3; return gn_atem_parse_option(buf, &gn_atem_op_cfun, data.cfun); } /* AT+CTZR is time zone reporting */ if (strncasecmp(*buf, "TZR", 3) == 0) { buf[0] += 3; return gn_atem_parse_option(buf, &gn_atem_op_ctzr, data.ctzr); } /* AT+CBC is battery charge */ if (strncasecmp(*buf, "BC", 2) == 0) { buf[0] += 2; return gn_atem_parse_option(buf, &gn_atem_op_cbc, data.cbc); } /* AT+CSSN is supplementary service notifications */ if (strncasecmp(*buf, "CSSN", 4) == 0) { buf[0] += 4; return gn_atem_parse_option(buf, &gn_atem_op_cssn, data.cssn); } return (true); }