//---------------------------------------------------------------------------- // convert bitmask into string // 0x000300F1 -> 0,4-7,16-17 //---------------------------------------------------------------------------- tCChar* xstrBitMask2Str(tChar* pOut, tUint32 cbOut, tUint32 dwMask) { tInt32 n, nRanges = 0, nFrom = -1, nTo = -1; tChar str[32]; for (*pOut = '\0', n = 0; n < 31; n++) { if ((nFrom < 0) && (dwMask & (0x1 << n))) { nFrom = nTo = n; continue; } // if if (dwMask & (0x1 << n)) { nTo = n; continue; } if (nFrom >= 0) { // append range if (nFrom == nTo) gsprintf(str, nRanges ? ",%d" : "%d", nFrom); else gsprintf(str, nRanges ? ",%d-%d" : "%d-%d", nFrom, nTo); xstrcatn(pOut, cbOut, str, 0); nFrom = nTo = -1; nRanges++; } // if } // for return pOut; } // xstrBitMask2Str
void gcode_arc_make (gcode_block_t *block) { gcode_arc_t *arc; gcode_vec2d_t p0, origin, center; gfloat_t arc_radius_offset, start_angle; char string[256]; GCODE_CLEAR(block); if (block->flags & GCODE_FLAGS_SUPPRESS) return; arc = (gcode_arc_t *) block->pdata; sprintf (string, "ARC: %s", block->comment); GCODE_COMMENT (block, string); gcode_arc_with_offset (block, origin, center, p0, &arc_radius_offset, &start_angle); /* * Do not proceed if arc_radius is <= GCODE_PRECISION */ if (arc_radius_offset <= GCODE_PRECISION) return; gsprintf (string, block->gcode->decimal, "G01 X%z Y%z\n", origin[0], origin[1]); GCODE_APPEND(block, string); if (arc->sweep < 0.0) { /* Clockwise */ if (fabs (block->offset->z[0] - block->offset->z[1]) < GCODE_PRECISION) { gsprintf (string, block->gcode->decimal, "G02 X%z Y%z I%z J%z\n", p0[0], p0[1], center[0]-origin[0], center[1]-origin[1]); } else { gsprintf (string, block->gcode->decimal, "G02 X%z Y%z Z%z I%z J%z\n", p0[0], p0[1], block->offset->z[1], center[0]-origin[0], center[1]-origin[1]); } GCODE_APPEND(block, string); } else { /* Counter-Clockwise */ if (fabs (block->offset->z[0] - block->offset->z[1]) < GCODE_PRECISION) { gsprintf (string, block->gcode->decimal, "G03 X%z Y%z I%z J%z\n", p0[0], p0[1], center[0]-origin[0], center[1]-origin[1]); } else { gsprintf (string, block->gcode->decimal, "G03 X%z Y%z Z%z I%z J%z\n", p0[0], p0[1], block->offset->z[1], center[0]-origin[0], center[1]-origin[1]); } GCODE_APPEND(block, string); } /* Update block->offset->endmill_pos */ block->offset->endmill_pos[0] = p0[0]; block->offset->endmill_pos[1] = p0[1]; }
/* Handle AT% commands, this is a quick hack together at this stage. */ bool gn_atem_command_percent(char **buf) { char buffer[MAX_LINE_LENGTH]; /* This command is undocumented. */ if (!strncasecmp(*buf, "CSQ", 3)) { buf[0] += 3; switch (**buf) { case '=': buf[0]++; switch (**buf) { case '0': buf[0]++; data.csq = 0; break; case '1': buf[0]++; data.csq = 1; data.signal_quality_notification = gn_atem_signal_quality; break; case '?': break; default: return (true); } gsprintf(buffer, MAX_LINE_LENGTH, "%%CSQ: %i\r\n", data.csq); break; case '?': buf[0]++; gsprintf(buffer, MAX_LINE_LENGTH, "%%CSQ: (0-31,99),(0-7,99)\r\n"); gn_atem_string_out(buffer); break; default: return (true); } return (false); } /* AT%BAND is Frequency Band Information */ if (!strncasecmp(*buf, "BAND", 4)) { buf[0] += 4; return gn_atem_parse_option(buf, &gn_atem_op_band, data.band); } /* AT%CPI is Call Progress Information */ if (!strncasecmp(*buf, "CPI", 3)) { buf[0] += 3; return gn_atem_parse_option(buf, &gn_atem_op_cpi, data.cpi); } return (true); }
/* AT+G commands. Some of these responses are a bit tongue in cheek... */ bool gn_atem_command_plusg(char **buf) { char buffer[MAX_LINE_LENGTH]; /* AT+GMI is Manufacturer information for the TA (Terminal Adaptor) */ if (strncasecmp(*buf, "MI", 3) == 0) { buf[0] += 2; gn_atem_string_out(_("Hugh Blemings, Pavel Janik ml. and others...\r\n")); return (false); } /* AT+GMR is Revision information for the TA (Terminal Adaptor) */ if (strncasecmp(*buf, "MR", 3) == 0) { buf[0] += 2; gsprintf(buffer, MAX_LINE_LENGTH, "%s %s %s\r\n", VERSION, __TIME__, __DATE__); gn_atem_string_out(buffer); return (false); } /* AT+GMM is Model information for the TA (Terminal Adaptor) */ if (strncasecmp(*buf, "MM", 3) == 0) { buf[0] += 2; gsprintf(buffer, MAX_LINE_LENGTH, _("gnokii configured on %s for models %s\r\n"), sm->config.port_device, sm->driver.phone.models); gn_atem_string_out(buffer); return (false); } /* AT+GSN is Serial number for the TA (Terminal Adaptor) */ if (strncasecmp(*buf, "SN", 3) == 0) { buf[0] += 2; gsprintf(buffer, MAX_LINE_LENGTH, _("none built in, choose your own\r\n")); gn_atem_string_out(buffer); return (false); } /* AT+GCAP is overall capabilities of TA */ if (strncasecmp(*buf, "CAP", 4) == 0) { buf[0] += 3; gsprintf(buffer, MAX_LINE_LENGTH, "+GCAP:+CGSM,+FCLASS\r\n"); gn_atem_string_out(buffer); return (false); } return (true); }
/* Handle AT# commands */ bool gn_atem_command_diesis(char **buf) { int number; char buffer[MAX_LINE_LENGTH]; if (strncasecmp(*buf, "CID", 3) == 0) { buf[0] += 3; switch (**buf) { case '?': buf[0]++; gsprintf(buffer, MAX_LINE_LENGTH, "%d\r\n", CallerIDMode); gn_atem_string_out(buffer); return (false); case '=': buf[0]++; if (**buf == '?') { buf[0]++; gn_atem_string_out("0,1\r\n"); return (false); } else { number = gn_atem_num_get(buf); if ( number == 0 || number == 1 ) { CallerIDMode = number; return (false); } } } } return (true); }
//---------------------------------------------------------------------------- // convert tUint8 array to hex string //---------------------------------------------------------------------------- tChar* xstrUint8ToHex(tChar* pOut, tUint8* pIn, tUint32 cbIn) { tChar *pstr = pOut; for (; cbIn--; pstr += 2) gsprintf(pstr, "%02X", *pIn++); return pOut; } // xstrUint8ToHex
char_t *websCalcUrlDigest(webs_t wp) { char_t *digest, *a1, *a1prime, *a2, *a2prime, *preDigest, *method; a_assert(wp); digest = NULL; /* * Calculate first portion of digest H(A1) */ a1 = NULL; fmtAlloc(&a1, 255, T("%s:%s:%s"), wp->userName, wp->realm, wp->password); a_assert(a1); a1prime = websMD5(a1); bfreeSafe(B_L, a1); /* * Calculate second portion of digest H(A2) */ method = websGetVar(wp, T("REQUEST_METHOD"), NULL); a_assert(method); /* Fixes by Richard Laing, 2003/7/15 */ a2 = balloc(B_L, (gstrlen(method) +2 + gstrlen(wp->url) ) * sizeof(char_t)); a_assert(a2); gsprintf(a2, T("%s:%s"), method, wp->url); a2prime = websMD5(a2); bfreeSafe(B_L, a2); /* * Construct final digest KD(H(A1):nonce:H(A2)) */ a_assert(a1prime); a_assert(a2prime); a_assert(wp->nonce); preDigest = NULL; if (!wp->qop) { fmtAlloc(&preDigest, 255, T("%s:%s:%s"), a1prime, wp->nonce, a2prime); } else { fmtAlloc(&preDigest, 255, T("%s:%s:%s:%s:%s:%s"), a1prime, wp->nonce, wp->nc, wp->cnonce, wp->qop, a2prime); } a_assert(preDigest); digest = websMD5(preDigest); /* * Now clean up */ bfreeSafe(B_L, a1prime); bfreeSafe(B_L, a2prime); bfreeSafe(B_L, preDigest); return digest; }
/* Parser for entering message content (+CMGS) */ void gn_atem_sms_parseText(char *buff) { static int index = 0; int i, length; char buffer[MAX_LINE_LENGTH]; gn_error error; length = strlen(buff); sms.user_data[0].type = GN_SMS_DATA_Text; for (i = 0; i < length; i++) { if (buff[i] == ModemRegisters[REG_CTRLZ]) { /* Exit SMS text mode with sending */ sms.user_data[0].u.text[index] = 0; sms.user_data[0].length = index; index = 0; Parser = gn_atem_at_parse; dprintf("Sending SMS to %s (text: %s)\n", data.sms->remote.number, data.sms->user_data[0].u.text); /* FIXME: set more SMS fields before sending */ error = gn_sms_send(&data, sm); if (error == GN_ERR_NONE) { gsprintf(buffer, MAX_LINE_LENGTH, "+CMGS: %d\r\n", data.sms->number); gn_atem_string_out(buffer); gn_atem_modem_result(MR_OK); } else { gn_atem_string_out(gn_atem_cme(0)); gn_atem_string_out("\r\n"); } return; } else if (buff[i] == ModemRegisters[REG_ESCAPE]) { /* Exit SMS text mode without sending */ sms.user_data[0].u.text[index] = 0; sms.user_data[0].length = index; index = 0; Parser = gn_atem_at_parse; gn_atem_modem_result(MR_OK); return; } else { /* Appent next char to message text */ sms.user_data[0].u.text[index++] = buff[i]; } } /* reached the end of line so insert \n and wait for more */ sms.user_data[0].u.text[index++] = '\n'; gn_atem_string_out("\r\n> "); }
static void gn_atem_sms_print(char *line, gn_sms *message, int mode) { switch (mode) { case INTERACT_MODE: gsprintf(line, MAX_LINE_LENGTH, _("\r\nDate/time: %d/%d/%d %d:%02d:%02d Sender: %s Msg Center: %s\r\nText: %s\r\n"), message->smsc_time.day, message->smsc_time.month, message->smsc_time.year, message->smsc_time.hour, message->smsc_time.minute, message->smsc_time.second, message->remote.number, message->smsc.number, message->user_data[0].u.text); break; case TEXT_MODE: if ((message->dcs.type == GN_SMS_DCS_GeneralDataCoding) && (message->dcs.u.general.alphabet == GN_SMS_DCS_8bit)) gsprintf(line, MAX_LINE_LENGTH, _("\"%s\",\"%s\",,\"%02d/%02d/%02d,%02d:%02d:%02d+%02d\"\r\n%s"), (message->status ? _("REC READ") : _("REC UNREAD")), message->remote.number, message->smsc_time.year, message->smsc_time.month, message->smsc_time.day, message->smsc_time.hour, message->smsc_time.minute, message->smsc_time.second, message->time.timezone, _("<Not implemented>")); else gsprintf(line, MAX_LINE_LENGTH, _("\"%s\",\"%s\",,\"%02d/%02d/%02d,%02d:%02d:%02d+%02d\"\r\n%s"), (message->status ? _("REC READ") : _("REC UNREAD")), message->remote.number, message->smsc_time.year, message->smsc_time.month, message->smsc_time.day, message->smsc_time.hour, message->smsc_time.minute, message->smsc_time.second, message->time.timezone, message->user_data[0].u.text); break; case PDU_MODE: gsprintf(line, MAX_LINE_LENGTH, _("0,<Not implemented>")); break; default: gsprintf(line, MAX_LINE_LENGTH, _("<Unknown mode>")); break; } }
static void gn_atem_signal_quality(struct gn_statemachine *state) { float rflevel = -1; gn_rf_unit rfunits = GN_RF_CSQ; char buffer[MAX_LINE_LENGTH]; if (!data.csq) return; 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: %.f, 99, 2\r\n", *(data.rf_level)); gn_atem_string_out(buffer); } }
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; }
static void bStatsAlloc(B_ARGS_DEC, void *ptr, int q, int size) { int memSize; bStatsFileType *fp; bStatsBlkType *bp; char_t name[FNAMESIZE + 10]; gsprintf(name, T("%s:%d"), B_ARGS); bStats[q].alloc++; bStats[q].inuse++; bStatsMemInUse += size; if (bStatsMemInUse > bStatsMemMax) { bStatsMemMax = bStatsMemInUse; } memSize = (1 << (B_SHIFT + q)) + sizeof(bType); bStatsBallocInUse += memSize; if (bStatsBallocInUse > bStatsBallocMax) { bStatsBallocMax = bStatsBallocInUse; } /* * Track maximum stack usage. Assumes a stack growth down. Approximate as * we only measure this on block allocation. */ if ((void*) &file < bStackMin) { bStackMin = (void*) &file; } /* * Find the file and adjust the stats for this file */ for (fp = bStatsFiles; fp < &bStatsFiles[bStatsFilesMax]; fp++) { if (fp->file[0] == file[0] && gstrcmp(fp->file, name) == 0) { fp->allocated += size; fp->count++; fp->times++; if (fp->largest < size) { fp->largest = size; fp->q = q; } break; } } /* * New entry: find the first free slot and create a new entry */ if (fp >= &bStatsFiles[bStatsFilesMax]) { for (fp = bStatsFiles; fp < &bStatsFiles[B_MAX_FILES]; fp++) { if (fp->file[0] == '\0') { gstrncpy(fp->file, name, TSZ(fp->file)); fp->allocated += size; fp->count++; fp->times++; fp->largest = size; fp->q = q; if ((fp - bStatsFiles) >= bStatsFilesMax) { bStatsFilesMax = (fp - bStatsFiles) + 1; } break; } } } /* * Update the per block stats. Allocate a new slot. */ for (bp = bStatsBlks; bp < &bStatsBlks[B_MAX_BLOCKS]; bp++) { if (bp->ptr == NULL) { bp->ptr = ptr; bp->who = fp; if ((bp - bStatsBlks) >= bStatsBlksMax) { bStatsBlksMax = (bp - bStatsBlks) + 1; } break; } } }
/* 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); }
static int initWebs() { struct hostent* hp; struct in_addr intaddr; char* cp; char host[64], dir[128]; char_t dir_t[128]; char_t wbuf[256]; /* * Initialize the socket subsystem */ socketOpen(); /* * Initialize the User Management database */ #ifdef USER_MANAGEMENT_SUPPORT umOpen(); umRestore( T( "umconfig.txt" ) ); #endif /* * Define the local Ip address, host name, default home page and the * root web directory. */ if ( gethostname( host, sizeof( host ) ) < 0 ) { error( E_L, E_LOG, T( "Can't get hostname" ) ); return -1; } if ( ( hp = gethostbyname( host ) ) == NULL ) { error( E_L, E_LOG, T( "Can't get host address" ) ); return -1; } memcpy( ( void* ) &intaddr, ( void* ) hp->h_addr_list[0], ( size_t ) hp->h_length ); /* * Set ../web as the root web. Modify this to suit your needs */ getcwd( dir, sizeof( dir ) ); for ( cp = dir; *cp; cp++ ) { if ( *cp == '\\' ) { *cp = '/'; } } if ( cp = strrchr( dir, '/' ) ) { *cp = '\0'; } ascToUni( dir_t, dir, sizeof( dir_t ) ); gsprintf( wbuf, T( "%s/%s" ), dir_t, rootWeb ); websSetDefaultDir( wbuf ); cp = inet_ntoa( intaddr ); ascToUni( wbuf, cp, min( strlen( cp ) + 1, sizeof( wbuf ) ) ); websSetIpaddr( wbuf ); ascToUni( wbuf, hp->h_name, min( strlen( hp->h_name ) + 1, sizeof( wbuf ) ) ); websSetHost( wbuf ); /* * Configure the web server options before opening the web server */ websSetDefaultPage( T( "default.asp" ) ); websSetPassword( password ); /* * Open the web server on the given port. If that port is taken, try * the next sequential port for up to "retries" attempts. */ websOpenServer( port, retries ); /* * First create the URL handlers. Note: handlers are called in sorted order * with the longest path handler examined first. Here we define the security * handler, forms handler and the default web page handler. */ websUrlHandlerDefine( T( "" ), NULL, 0, websSecurityHandler, WEBS_HANDLER_FIRST ); websUrlHandlerDefine( T( "/goform" ), NULL, 0, websFormHandler, 0 ); websUrlHandlerDefine( T( "/cgi-bin" ), NULL, 0, websCgiHandler, 0 ); websUrlHandlerDefine( T( "" ), NULL, 0, websDefaultHandler, WEBS_HANDLER_LAST ); /* * Now define two test procedures. Replace these with your application * relevant ASP script procedures and form functions. */ websAspDefine( T( "aspTest" ), aspTest ); websFormDefine( T( "formTest" ), formTest ); /* * Create the Form handlers for the User Management pages */ #ifdef USER_MANAGEMENT_SUPPORT formDefineUserMgmt(); #endif /* * Create a handler for the default home page */ websUrlHandlerDefine( T( "/" ), NULL, 0, websHomePageHandler, 0 ); /* * Set the socket service timeout to the default */ sockServiceTime = SOCK_DFT_SVC_TIME; return 0; }
bool gn_atem_parse_option(char **buf, struct gn_atem_op *op, char *val) { char buffer[MAX_LINE_LENGTH], **strval; int len; if (*val == 0) strcpy(val, op->default_val); if ((*buf)[0] == 0 || ((*buf)[0] == '?' && (*buf)[1] == 0)) { *buf += strlen(*buf); gsprintf(buffer, MAX_LINE_LENGTH, "%s: %s\r\n", op->op, val); gn_atem_string_out(buffer); return (false); } if (*(*buf) ++ != '=') return (true); if (!strcasecmp(*buf, "?")) { (*buf) ++; len = gsprintf(buffer, MAX_LINE_LENGTH, "%s: ", op->op); switch (op->type) { case gn_var_string: strval = op->string_val; len += gsprintf(buffer + len, MAX_LINE_LENGTH - len, "\"%s\"", *strval++); while (*strval) len += gsprintf(buffer + len, MAX_LINE_LENGTH - len, ",\"%s\"", *strval++); break; case gn_var_numbers: strval = op->string_val; len += gsprintf(buffer + len, MAX_LINE_LENGTH - len, "\"%s\"", *strval++); /* TODO */ break; case gn_var_bool: len += gsprintf(buffer + len, MAX_LINE_LENGTH - len, "(0,1)"); break; } gsprintf(buffer + len, MAX_LINE_LENGTH - len, "\r\n"); return (false); } if (!op->writable) return (true); if (op->set_val) return op->set_val(buf, op, val); switch (op->type) { case gn_var_string: for (strval = op->string_val; *strval; strval++) if (!strcasecmp(*buf, *strval)) { gsprintf(val, MAX_LINE_LENGTH, "\"%s\"", *strval); *buf += strlen(*buf); return (false); } break; case gn_var_bool: switch (gn_atem_num_get(buf)) { case 0: strcpy(val, "0"); return (false); case 1: strcpy(val, "1"); return (false); } break; default: break; } 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); }