 				// speed control move
 				speedControl = true;
 			} else {
-				wifi.Send(chlID,F("ERROR: invalid G command code"));
+				Serial.println(F("ERROR: invalid G command code"));
 				return false;
 			}
 			// absorb spaces

** MXXX
**	XXX = 100; reset
**	XXX = 101; print free memory
**	XXX = 112; emergency stop
*/

bool parseCommandGServo(char **buf, boolean speedControl, boolean wait) {
	char *endptr;
	uint8_t pos, i, len;
	int servoSpeedLocal = servoSpeed;

	if (!speedControl)
		servoSpeedLocal = 0;

	wifi.Send(chlID,F("parseCommandGServo"));
	wifi.Send(chlID,*buf);
	wifi.Send(chlID,String(*buf[0]));

	if (*buf[0] == '\0')
		return false;

	switch(*buf[0]) {
		case 'L': case 'l':
			pos = strtoul(buf[1], &endptr, 10);
			if (buf[1] != endptr) {
				len = strlen(*buf);
				for (i = 0; i < len; ++i) {
					if (*buf[i] != ' ' && *buf[i] != '\t' && *buf[i] != '\0')
						break;
				}
				if (i == len) {
					moveServoL(defaultServoPos, servoSpeedLocal, wait, true);
				} else {
					moveServoL(defaultServoPos, servoSpeedLocal, false, false);
				}
			} else {
				wifi.Send(chlID,F("ERROR: invalid servoL position"));
			}
			return true;
		case 'R': case 'r':
			pos = strtoul(buf[1], &endptr, 10);
			if (buf[1] != endptr) {
				len = strlen(*buf);
				for (i = 0; i < len; ++i) {
					if (*buf[i] != ' ' && *buf[i] != '\t' && *buf[i] != '\0')
						break;
				}
				if (i == len) {
					moveServoR(defaultServoPos, servoSpeedLocal, wait, true);
				} else {
					moveServoR(defaultServoPos, servoSpeedLocal, false, false);
				}
			} else {
				wifi.Send(chlID,F("ERROR: invalid servoR position"));
			}
			return true;
		case 'O': case 'o':
			pos = strtoul(buf[1], &endptr, 10);
			if (buf[1] != endptr) {
				len = strlen(*buf);
				for (i = 0; i < len; ++i) {
					if (*buf[i] != ' ' && *buf[i] != '\t' && *buf[i] != '\0')
						break;
				}
				if (i == len) {
					moveServoRot(defaultServoPos, servoSpeedLocal, wait, true);
				} else {
					moveServoRot(defaultServoPos, servoSpeedLocal, false, false);
				}
			} else {
				wifi.Send(chlID,F("ERROR: invalid servoRot position"));
			}
			return true;
		case 'T': case 't':
			pos = strtoul(buf[1], &endptr, 10);
			if (buf[1] != endptr) {
				len = strlen(*buf);
				for (i = 0; i < len; ++i) {
					if (*buf[i] != ' ' && *buf[i] != '\t' && *buf[i] != '\0')
						break;
				}
				if (i == len) {
					moveServoHRot(defaultServoPos, servoSpeedLocal, wait, true);
				} else {
					moveServoHRot(defaultServoPos, servoSpeedLocal, false, false);
				}
			} else {
				wifi.Send(chlID,F("ERROR: invalid servoHRot position"));
			}
			return true;
		case 'H': case 'h':
			pos = strtoul(buf[1], &endptr, 10);
			if (buf[1] != endptr) {
				len = strlen(*buf);
				for (i = 0; i < len; ++i) {
					if (*buf[i] != ' ' && *buf[i] != '\t' && *buf[i] != '\0')
						break;
				}
				if (i == len) {
					moveServoH(defaultServoPos, servoSpeedLocal, wait, true);
				} else {
					moveServoH(defaultServoPos, servoSpeedLocal, false, false);
				}
			} else {
				wifi.Send(chlID,F("ERROR: invalid servoH position"));
			}
			return true;
		default:
			wifi.Send(chlID,F("ERROR: invalid servo identifier"));
			return false;
	};
	return false;
}

bool processCommand(char *cmd) {
	char *endptr, *buf = cmd;
	uint8_t len = strlen(buf);
	uint8_t code;
	bool speedControl = true;
	bool wait;

	if (len == 0) return false;

	wifi.Send(chlID,F("processCommand"));
	wifi.Send(chlID,cmd);

	switch (buf[0]) {
		case 'G': case 'g':
			code = strtoul(&buf[1], &endptr, 10);
			if (endptr == &buf[1]) {
				wifi.Send(chlID,F("ERROR: missing G command code"));
				return false;
			}
			if (code == 0) {

	moveServoRot(defaultServoPos, servoSpeed, false, false);
	moveServoHRot(defaultServoPos, servoSpeed, false, false);
	moveServoH(defaultServoPos, servoSpeed, true, true);
}

/*
