Пример #1
0
//----------------------------------------------------------------------------
// 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 
Пример #2
0
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];
}
Пример #3
0
/* 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);
}
Пример #4
0
/* 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);
}
Пример #5
0
/* 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);
}
Пример #6
0
//----------------------------------------------------------------------------
// 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
Пример #7
0
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;
}
Пример #8
0
/* 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> ");
}
Пример #9
0
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;
	}
}
Пример #10
0
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);
	}
}
Пример #11
0
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;
}
Пример #12
0
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;
		}
	}
}
Пример #13
0
/* 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);
}
Пример #14
0
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;
}
Пример #15
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);
}
Пример #16
0
/* 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);
}