Пример #1
0
Файл: vm.c Проект: kisom/kam
/*
 * eval is an internal function that executes operations when a DO
 * instruction is encountered.
 */
static int
eval(machine vm)
{
	uint16_t a, b;
	uint8_t	oper;

	b = pop16(vm->vals);
	a = pop16(vm->vals);
	oper = pop8(vm->opers);

	switch (oper) {
	case INSTR_ADD:
		push16(vm->vals, a + b);
		break;
	case INSTR_SUB:
		push16(vm->vals, a - b);
		break;
	case INSTR_MUL:
		push16(vm->vals, a * b);
		break;
	case INSTR_DIV:
		push16(vm->vals, a / b);
		break;
	default:
		abort(); /* illegal instruction trap ;) */
	}
	return VM_OK;
}
//===== RETI
void sngRETI()
{
	_u16 temp = pop16();
	pc = pop32();
	sr = temp; changedSP();
	cycles = 12;
}
Пример #3
0
Файл: vm.c Проект: kisom/kam
/*
 * vm_peek pops the top value off the value stack, and then pushes it
 * back. The value is returned from this function.
 */
uint16_t
vm_peek(machine vm)
{
	uint16_t val;

	if (NULL == vm)
		return 0;
	if (NULL == vm->vals)
		return 0;
	if (empty16(vm->vals))
		return 0;

	val = pop16(vm->vals);
	push16(vm->vals, val);
	return val;
}
Пример #4
0
/*
** Opcode 0xDD/0xFD
** IX/IY related instructions
*/
UBYTE Z80::indexInstructions(UWORD& I, UBYTE origOpcode)
{
  UBYTE opcode = READ_MEM(PC++);
  switch (opcode) {
  case 0x8E: ADD8(A, READ_MEM(I + READ_MEM(PC++)), F_C); return 19;
  case 0x86: ADD8(A, READ_MEM(I + READ_MEM(PC++)), 0); return 19;
  case 0x09: ADD16(I, BC); return 15;
  case 0x19: ADD16(I, DE); return 15;
  case 0x29: ADD16(I, I); return 15;
  case 0x39: ADD16(I, SP); return 15;
  case 0xA6: AND(A, READ_MEM(I + READ_MEM(PC++))); return 19;
  case 0xBE: CP(A, READ_MEM(I + READ_MEM(PC++))); return 19;
  case 0x96: SUB8(A, READ_MEM(I + READ_MEM(PC++)), 0); return 19;
  case 0xAE: XOR(A, READ_MEM(I + READ_MEM(PC++))); return 19;
  case 0x35: {
    UBYTE v = I + READ_MEM(PC++); UBYTE s = READ_MEM(v); DEC8(s); WRITE_MEM(v, s);
  } return 23;
  case 0x2B: DEC16(I); return 10;
  case 0xE3: { UWORD s = READ_MEM16(SP); EX(s, I); WRITE_MEM16(SP, s); } return 23;
  case 0x23: INC16(I); return 10;
  case 0x34: {
    UBYTE v = I + READ_MEM(PC++); UBYTE s = READ_MEM(v); INC8(s); WRITE_MEM(v, s);
  } return 23;

    /* JP */
  case 0xE9: PC = READ_MEM16(I); return 8;

    /* LD */
  case 0x7E: A = READ_MEM(I + READ_MEM(PC++)); return 19;
  case 0x46: B = READ_MEM(I + READ_MEM(PC++)); return 19;
  case 0x4E: C = READ_MEM(I + READ_MEM(PC++)); return 19;
  case 0x56: D = READ_MEM(I + READ_MEM(PC++)); return 19;
  case 0x5E: E = READ_MEM(I + READ_MEM(PC++)); return 19;
  case 0x66: H = READ_MEM(I + READ_MEM(PC++)); return 19;
  case 0x6E: L = READ_MEM(I + READ_MEM(PC++)); return 19;

  case 0xF9: SP = I; return 19;
  case 0x2A: I = READ_MEM16(READ_MEM16(PC)); PC += 2; return 20;
  case 0x21: I = READ_MEM16(PC); PC += 2; return 14;
  case 0x22: WRITE_MEM16(READ_MEM16(PC), I); PC += 2; return 20;

  case 0x70 + 7: WRITE_MEM(I + READ_MEM(PC++), A); return 19;
  case 0x70 + 0: WRITE_MEM(I + READ_MEM(PC++), B); return 19;
  case 0x70 + 1: WRITE_MEM(I + READ_MEM(PC++), C); return 19;
  case 0x70 + 2: WRITE_MEM(I + READ_MEM(PC++), D); return 19;
  case 0x70 + 3: WRITE_MEM(I + READ_MEM(PC++), E); return 19;
  case 0x70 + 4: WRITE_MEM(I + READ_MEM(PC++), H); return 19;
  case 0x70 + 5: WRITE_MEM(I + READ_MEM(PC++), L); return 19;
  case 0x36: WRITE_MEM(I + READ_MEM(PC), READ_MEM(PC + 1)); PC += 2; return 19;

  case 0xB6: OR(A, READ_MEM(I + READ_MEM(PC++))); return 19;

  case 0xE1: I = pop16(); return 14;
  case 0xE5: push16(I); return 15;

  case 0x9E: SUB8(A, READ_MEM(I + READ_MEM(PC++)), F_C); return 19;

  case 0xCB: { // DD CB
    UBYTE arg = READ_MEM(PC++);
    UBYTE extOpcode = READ_MEM(PC++);
    switch (extOpcode) {
#define RES_I(b) case 0x86 + 8 * b: { UBYTE s = READ_MEM(I + arg);    \
        RES(s, b); WRITE_MEM(I + arg, s); } return 23;
#define SET_I(b) case 0xC6 + 8 * b: { UBYTE s = READ_MEM(I + arg);    \
        SET(s, b); WRITE_MEM(I + arg, s); } return 23;
#define BIT_I(b) case 0x46 + 8 * b: { UBYTE s = READ_MEM(I + arg);    \
        BIT(s, b); WRITE_MEM(I + arg, s); } return 23;

      /* BIT b,(I+N) */
      BIT_I(0); BIT_I(1); BIT_I(2); BIT_I(3);
      BIT_I(4); BIT_I(5); BIT_I(6); BIT_I(7);

      /* RES b,(I+N) */
      RES_I(0); RES_I(1); RES_I(2); RES_I(3);
      RES_I(4); RES_I(5); RES_I(6); RES_I(7);

      /* SET b,(I+N) */
      SET_I(0); SET_I(1); SET_I(2); SET_I(3);
      SET_I(4); SET_I(5); SET_I(6); SET_I(7);

    case 0x16: { /* RL (I+N) */
      UBYTE s = READ_MEM(I + arg); RL(s); WRITE_MEM(I + arg, s);
    } return 23;
    case 0x06: { /* RLC (I+N) */
      UBYTE s = READ_MEM(I + arg); RLC(s); WRITE_MEM(I + arg, s);
    } return 23;
    case 0x1E: { /* RR (I+N) */
      UBYTE s = READ_MEM(I + arg); RR(s); WRITE_MEM(I + arg, s);
    } return 23;
    case 0x0E: { /* RRC (I+N) */
      UBYTE s = READ_MEM(I + arg); RRC(s); WRITE_MEM(I + arg, s);
    } return 23;
    case 0x26: { /* SLA (I+N) */
      UBYTE s = READ_MEM(I + arg); SLA(s); WRITE_MEM(I + arg, s);
    } return 23;
    case 0x2E: { /* SRA (I+N) */
      UBYTE s = READ_MEM(I + arg); SRA(s); WRITE_MEM(I + arg, s);
    } return 23;
    case 0x36: { /* SLL (I+N) */
      UBYTE s = READ_MEM(I + arg); SLL(s); WRITE_MEM(I + arg, s);
    } return 23;
    case 0x3E: { /* SRL (I+N) */
      UBYTE s = READ_MEM(I + arg); SRL(s); WRITE_MEM(I + arg, s);
    } return 23;

    default:
      std::cout << std::hex << "Unknown extended opcode ("
                << origOpcode << ":" << opcode << "): " << static_cast<int>(extOpcode) << std::endl;
      return 0;
    }
  } break;

  default:
    std::cout << std::hex << "Unknown extended opcode ("
              << origOpcode << "): " << static_cast<int>(opcode) << std::endl;
    break;
  }
  return 0;
}
Пример #5
0
//command 

#include "command.h"
#include "menu.h"
#include "tempature.h"
#include "motor.h"
#include "utilityScripts.h"
#include <stdio.h>
CommandState cmdMode = WAIT_ON_TOOL;

//#define Debug_Cmd
#define Debug_Data_Cmd

extern bool endStopFlagTmpDebug;

circleBuf cmdBuf;
u16 cmdSdFailCnt;
u32 cmdSdByteCnt;
bool cmdSdReset;
bool cmdPaused;
bool cmdHeatShutdown;
uint8_t currentToolIndex = 0;
Timeout cmdHomingTimeout;
Timeout cmdDelayTimeout;
Timeout cmdToolWaitTimeout;
Timeout cmdBtnWaitTimeout;
u32 sdByteCnt;
uint8_t sdByte;
u32 cmdCnt;
//不把这两个函数放到头文件里去,这样就不会被其他 地方调用了
uint8_t pop8()/*{{{*/
{
	return circleBufPop(&cmdBuf);
}/*}}}*/
int16_t pop16() /*{{{*/
{
	union {
		// AVR is little-endian
		int16_t a;
		struct {
			uint8_t data[2];
		} b;
	} shared;
	shared.b.data[0] = circleBufPop(&cmdBuf);
	shared.b.data[1] = circleBufPop(&cmdBuf);
	return shared.a;
}/*}}}*/

int32_t pop32() /*{{{*/
{
	union {
		// AVR is little-endian
		int32_t a;
		struct {
			uint8_t data[4];
		} b;
	} shared;
	shared.b.data[0] = circleBufPop(&cmdBuf);
	shared.b.data[1] = circleBufPop(&cmdBuf);
	shared.b.data[2] = circleBufPop(&cmdBuf);
	shared.b.data[3] = circleBufPop(&cmdBuf);
	return shared.a;
}/*}}}*/
bool processExtruderCommandPacket(void) /*{{{*/
{
    uint8_t	id = circleBufPop(&cmdBuf);
		uint8_t command = circleBufPop(&cmdBuf);
		uint8_t length = circleBufPop(&cmdBuf);
		
//		int32_t x = 0;
//        int32_t y = 0;
//        int32_t z = 0;
        int32_t a = 0;
        int32_t b = 0;
//        int32_t us = 1000000;
//        uint8_t relative = 0x02;
    bool enable = false;
		int32_t value;
		switch (command) 
		{
		case SLAVE_CMD_SET_TEMP:	
			value=pop16();// 注释掉下面的,但是别忘了 pop;
			setTargetTemp=value;
//			board.getExtruderBoard(id).getExtruderHeater().set_target_temperature(pop16());
//			if(board.getPlatformHeater().isHeating()){//FIXME
//				board.getExtruderBoard(id).getExtruderHeater().Pause(true);}
#ifdef Debug_Data_Cmd
			printf("SLAVE_CMD_SET_TEMP %d\n",value);
#endif
			return true;
		// can be removed in process via host query works OK
 		case SLAVE_CMD_PAUSE_UNPAUSE:
			//pause(!command::isPaused());
			if(cmdPaused)
				cmdPaused=false;
			else
				cmdPaused=true;
#ifdef Debug_Data_Cmd
			printf("SLAVE_CMD_PAUSE_UNPAUSE %d\n",value);
#endif
			return true;
		case SLAVE_CMD_TOGGLE_FAN: //FIXME
			value=circleBufPop(&cmdBuf);
			//board.getExtruderBoard(id).setFan((pop8() & 0x01) != 0);
#ifdef Debug_Data_Cmd
			printf("SLAVE_CMD_TOGGLE_FAN %d\n",value);
#endif
			return true;
		case SLAVE_CMD_TOGGLE_VALVE: //FIXME 
			value=circleBufPop(&cmdBuf);
			//board.setValve((pop8() & 0x01) != 0);
#ifdef Debug_Data_Cmd
			printf("SLAVE_CMD_TOGGLE_VALVE %d\n",value);
#endif
			return true;
		case SLAVE_CMD_SET_PLATFORM_TEMP:
			value=pop16();
			setPlatformTargetTemp=value;
			extruderSetHeatPause(true);
//			board.setUsingPlatform(true);
//			board.getPlatformHeater().set_target_temperature(pop16());
//			// pause extruder heaters if active
//			board.getExtruderBoard(0).getExtruderHeater().Pause(true);
//			board.getExtruderBoard(1).getExtruderHeater().Pause(true);
#ifdef Debug_Data_Cmd
			printf("SLAVE_CMD_SET_PLATFORM_TEMP %d\n",value);
#endif
			return true;
        // not being used with 5D
		case SLAVE_CMD_TOGGLE_MOTOR_1:
			//DEBUG_PIN1.setValue(true);
			enable = circleBufPop(&cmdBuf) & 0x01 ? true:false;
			cmdMode = MOVING;
			axisSetEnablePin(3,enable); // 应该就是放在这里 
			//steppers::enableAxis(4, enable); //这里是4 那么应该用不到 
			b = 360;
#ifdef Debug_Data_Cmd
			printf("SLAVE_CMD_TOGGLE_MOTOR_1 %d\n",value);
#endif
			return true;
        // not being used with 5D
		case SLAVE_CMD_TOGGLE_MOTOR_2: 
			//DEBUG_PIN1.setValue(true);
			enable = circleBufPop(&cmdBuf) & 0x01 ? true:false;
			//steppers::enableAxis(3, enable);
			axisSetEnablePin(3,enable); //错了,这里3,4应该对应到喷嘴了 _note ? 
			a = 160;
#ifdef Debug_Data_Cmd
			printf("SLAVE_CMD_TOGGLE_MOTOR_2 %d\n",value);
#endif
			return true;
		case SLAVE_CMD_SET_MOTOR_1_PWM:
			value=circleBufPop(&cmdBuf);
#ifdef Debug_Data_Cmd
			printf("SLAVE_CMD_SET_MOTOR_1_PWM %d\n",value);
#endif
			return true;
		case SLAVE_CMD_SET_MOTOR_2_PWM:
			value=circleBufPop(&cmdBuf);
#ifdef Debug_Data_Cmd
			printf("SLAVE_CMD_SET_MOTOR_2_PWM %d\n",value);
#endif
			return true;
		case SLAVE_CMD_SET_MOTOR_1_DIR:
			value=circleBufPop(&cmdBuf);
#ifdef Debug_Data_Cmd
			printf("SLAVE_CMD_SET_MOTOR_1_DIR %d\n",value);
#endif
			return true;
		case SLAVE_CMD_SET_MOTOR_2_DIR:
			value=circleBufPop(&cmdBuf);
#ifdef Debug_Data_Cmd
			printf("SLAVE_CMD_SET_MOTOR_2_DIR %d\n",value);
#endif
			return true;
		case SLAVE_CMD_SET_MOTOR_1_RPM:
			value=pop32();
#ifdef Debug_Data_Cmd
			printf("SLAVE_CMD_SET_MOTOR_1_RPM %d\n",value);
#endif
			return true;
		case SLAVE_CMD_SET_MOTOR_2_RPM:
			value=pop32();
#ifdef Debug_Data_Cmd
			printf("SLAVE_CMD_SET_MOTOR_2_RPM %d\n",value);
#endif
			return true;
		}
	return false;
}/*}}}*/
Пример #6
0
void runCmdSlice(void)
{
	// get command from SD card if building from SD
	if (sdCardIsPlaying) /*{{{*/
	{
		//printf("sdCardHasNextByte  %d  \r\n",sdCardHasNextByte);
		while (circleBufGetRemainCap(&cmdBuf) > 0 && sdCardHasNextByte) 
		{
			sdByteCnt++;
			//printf("sdByteCnt  %d  \r\n",sdByteCnt);
			sdByte=sdCardPlaybackNext();
			//printf("sdByte  %d \r\n",sdByte);
			circleBufPush(&cmdBuf,sdByte);
		}
		if( !sdCardHasNextByte && circleBufIsEmpty(&cmdBuf))
		{
			sdCardFinishPlayback();
			//printf("执行sdCardFinishPlayback\r\n");
		}
	}/*}}}*/
	// get command from onboard script if building from onboard 
	if(utilityIsPlaying())/*{{{*/
	{		
		while (circleBufGetRemainCap(&cmdBuf) > 0 && utilityPlaybackHasNext())
		{
			circleBufPush(&cmdBuf,utilityPlaybackNext());
		}
		if(!utilityPlaybackHasNext() && circleBufIsEmpty(&cmdBuf))
		{
			utilityFinishPlayback();
		}
	}/*}}}*/
	// don't execute commands if paused or shutdown because of heater failure
	// 如果命令暂停或者 加热失败,则直接返回
	if (cmdPaused || cmdHeatShutdown) {	return; }

	if (cmdMode == HOMING) 
	{
		if (!(motorIsRunning || motorIsHoming)) 
			cmdMode = READY;
		else if (timeoutHasElapsed(&cmdHomingTimeout)) 
		{
			motorAbort();
			cmdMode = READY;
		}
	}
	if (cmdMode == MOVING) 
	{
		if (!(motorIsRunning  || motorIsHoming))
			cmdMode = READY; 
	}
	if (cmdMode == DELAY)
	{
		// check timers
		if (timeoutHasElapsed(&cmdDelayTimeout))
		{
			cmdMode = READY;
		}
	}
	if (cmdMode == WAIT_ON_TOOL) /*{{{*/
	{
		int i;
		if(timeoutHasElapsed(&cmdToolWaitTimeout))
		{
			//Motherboard::getBoard().errorResponse("Extruder Timeout    when attempting to  heat");
			printf("Extruder Timeout    when attempting to  heat");
			showErrMsg("Extruder Timeout     when attempting to heat");
			cmdMode = READY;		
		}
		else if(extruderHasReachedTargetTemp())
		{
			cmdMode = READY;
			for(i=0;i<STEPPER_COUNT;i++)  //呃,放在这里不好 
				axisSetEnablePin(i,true);
		}
		// if platform is done heating up, unpause the extruder heaters
		else if(platformHasReachedTargetTemp())
		{
			extruderSetHeatPause(false); //平台温度达到,开始加热喷头
		}
	}/*}}}*/
	if (cmdMode == WAIT_ON_PLATFORM) /*{{{*/
	{
		if(timeoutHasElapsed(&cmdToolWaitTimeout))
		{
			//		Motherboard::getBoard().errorResponse("Platform Timeout    when attempting to  heat");
			printf("Platform Timeout    when attempting to  heat");
			cmdMode = READY;		
		}
		else if(platformHasReachedTargetTemp())
		{
			extruderSetHeatPause(false);
			cmdMode = READY;
		}
	}/*}}}*/
	if (cmdMode == WAIT_ON_BUTTON) /*{{{*/
	{
		if (timeoutHasElapsed(&cmdBtnWaitTimeout))
		{
			cmdMode = READY;
		}
		else 
		{
			//cmdMode = READY; 由msgMenu去处理button
		}
	}/*}}}*/

	if (cmdMode == READY) 
	{
		int pt[STEPPER_COUNT];//toFix
		int32_t a ; 
		int32_t b ; 
		int32_t dda; 
		uint8_t axes ;
		uint8_t i;
		// process next command on the queue.
		if (cmdBuf.length>0)
		{
			uint8_t command = *circleBufGetData(&cmdBuf,0);//command_buffer[0];
			timeoutStart(&usrInputTimeout,usrInputTime);
		cmdCnt++;
		printf("c %6d ",cmdCnt);
			if (command == HOST_CMD_QUEUE_POINT_ABS) 
			{
				// check for completion
				if (cmdBuf.length >= 17) 
				{
					circleBufPop(&cmdBuf); // remove the command code
					cmdMode = MOVING;
					pt[0] = pop32();
					pt[1] = pop32();
					pt[2] = pop32();
					dda = pop32();
					motorSetTarget(pt,dda);//steppers::setTarget(Point(x,y,z),dda);
#ifdef Debug_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_QUEUE_POINT_ABS\r\n");
#endif
#ifdef Debug_Data_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_QUEUE_POINT_ABS ");
					printf("%d %d %d %d\r\n",pt[0],pt[1],pt[2],dda);
#endif
				}
			} else if (command == HOST_CMD_QUEUE_POINT_EXT) 
			{
				// check for completion
				if (cmdBuf.length >= 25) 
				{
					circleBufPop(&cmdBuf); // remove the command code
					cmdMode = MOVING;
					pt[0] = pop32();
					pt[1]= pop32();
					pt[2]= pop32();
					pt[3]= pop32();
					b= pop32();
					dda = pop32();
					motorSetTarget(pt,dda);//toFix
					//steppers::setTarget(Point(x,y,z,a,b),dda);
#ifdef Debug_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_QUEUE_POINT_EXT\r\n");
#endif
#ifdef Debug_Data_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_QUEUE_POINT_EXT ");
					printf("%d %d %d %d %d\r\n",pt[0],pt[1],pt[2],pt[3],dda);
#endif
				}
			} else if (command == HOST_CMD_QUEUE_POINT_NEW) 
			{
				// check for completion
				if (cmdBuf.length >= 26) 
				{
					uint8_t relative ;
					int32_t us; 
					circleBufPop(&cmdBuf); // remove the command code
					cmdMode = MOVING;
					pt[0] = pop32();
					pt[1]= pop32();
					pt[2]= pop32();
//					if(pt[0]>5000)
//						pt[0]=5000;
//					if(pt[0]<-5000)
//						pt[0]=-5000;
//					if(pt[1]>2000)
//						pt[1]=2000;
//					if(pt[1]<-2000)
//						pt[1]=-2000;
#define PT2_THRESHOLD 5000
					if(pt[2]>PT2_THRESHOLD)
						pt[2]=PT2_THRESHOLD;
					if(pt[2]<-PT2_THRESHOLD)
						pt[2]=-PT2_THRESHOLD;
					pt[3]= pop32();
					b= pop32();
					us = pop32();
					relative = pop8();
					motorSetTargetNew(pt,us,relative);
					//steppers::setTargetNew(Point(x,y,z,a,b),us,relative);
#ifdef Debug_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_QUEUE_POINT_NEW ");
					printf("%d %d %d %d %d %d\r\n",pt[0],pt[1],pt[2],pt[3],us,relative);
#endif
#ifdef Debug_Data_Cmd
					if(endStopFlagTmpDebug)
						printf("x\r\n");
					LED_BLINK(1);
					printf("HOST_CMD_QUEUE_POINT_NEW ");
					printf("%d %d %d %d %d %d %d\r\n",pt[0],pt[1],pt[2],pt[3],us,relative,b);
#endif
				}
			} else if (command == HOST_CMD_CHANGE_TOOL) 
			{
				if (cmdBuf.length >= 2) 
				{
					circleBufPop(&cmdBuf); // remove the command code
					currentToolIndex = circleBufPop(&cmdBuf);
					//toFix
					//steppers::changeToolIndex(currentToolIndex);
#ifdef Debug_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_CHANGE_TOOL\r\n");
#endif
#ifdef Debug_Data_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_CHANGE_TOOL\r\n");
#endif
				}
			} else if (command == HOST_CMD_ENABLE_AXES) /*{{{*/
			{
				if (cmdBuf.length >= 2) 
				{
					bool enable;
					circleBufPop(&cmdBuf); // remove the command code
					axes = circleBufPop(&cmdBuf);
					enable = (axes & 0x80) != 0;
					for (i = 0; i < STEPPER_COUNT; i++) 
					{
						if ((axes & (1<<i)) != 0) 
							//steppers::enableAxis(i, enable);
							axisSetEnablePin(i,enable);
					}
#ifdef Debug_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_ENABLE_AXES\r\n");
#endif
#ifdef Debug_Data_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_ENABLE_AXES ");
					printf("%d\r\n",axes);
#endif
				}/*}}}*/
			} else if (command == HOST_CMD_SET_POSITION) 
			{
				// check for completion
				if (cmdBuf.length >= 13) 
				{
					circleBufPop(&cmdBuf); // remove the command code
					pt[0] = pop32();
					pt[1]= pop32();
					pt[2] = pop32();//toFix,motorDefinePosition 怎么知道pt有没有第四个参数,会怎么对pt[3]处理?
					//steppers::definePosition(Point(x,y,z));
					motorDefinePosition(pt);
#ifdef Debug_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_SET_POSITION\r\n");
#endif
#ifdef Debug_Data_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_SET_POSITION ");
					printf("%d %d %d\r\n",pt[0],pt[1],pt[2]);
#endif
				}
			} else if (command == HOST_CMD_SET_POSITION_EXT) 
			{
				// check for completion
				if (cmdBuf.length >= 21) 
				{
					circleBufPop(&cmdBuf); // remove the command code
					pt[0] = pop32();
					pt[1] = pop32();
					pt[2] = pop32();
					pt[3] = pop32();
					//a = pop32();
					b = pop32();
					motorDefinePosition(pt);//toFix
					//steppers::definePosition(Point(x,y,z,a,b));
#ifdef Debug_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_SET_POSITION_EXT\r\n");
#endif
#ifdef Debug_Data_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_SET_POSITION_EXT ");
					printf("%d %d %d %d\r\n",pt[0],pt[1],pt[2],pt[3]);
#endif
				}
			} else if (command == HOST_CMD_DELAY) 
			{
				if (cmdBuf.length >= 5) 
				{
					uint32_t microseconds ;
					cmdMode = DELAY;
					circleBufPop(&cmdBuf); // remove the command code
					// parameter is in milliseconds; timeouts need microseconds
					microseconds = pop32() * 1000;
					timeoutStart(&cmdDelayTimeout,microseconds);//delay_timeout.start(microseconds);
#ifdef Debug_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_DELAY\r\n");
#endif
#ifdef Debug_Data_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_DELAY\r\n");
#endif
				}
			} else if (command == HOST_CMD_PAUSE_FOR_BUTTON) 
			{
				if (cmdBuf.length >= 5) 
				{
					uint16_t timeout_seconds;
					uint8_t button_mask;
					uint8_t button_timeout_behavior;
					circleBufPop(&cmdBuf); // remove the command code
					button_mask = circleBufPop(&cmdBuf);
					timeout_seconds = pop16();
					button_timeout_behavior = circleBufPop(&cmdBuf);
//					cmdMode = WAIT_ON_BUTTON;//toFix
#ifdef Debug_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_PAUSE_FOR_BUTTON\r\n");
#endif
#ifdef Debug_Data_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_PAUSE_FOR_BUTTON\r\n");
#endif
				}
			} else if (command == HOST_CMD_DISPLAY_MESSAGE) 
			{
			//	MessageScreen* scr = Motherboard::getBoard().getMessageScreen();
				if (cmdBuf.length >= 6) 
				{
					uint8_t options ;
					uint8_t xpos ;
					uint8_t ypos ;
					uint8_t timeout_seconds;
					uint8_t idx=0;
					char msg[50];
					circleBufPop(&cmdBuf); // remove the command code
					options = circleBufPop(&cmdBuf);
					xpos = circleBufPop(&cmdBuf);
					ypos = circleBufPop(&cmdBuf);
					timeout_seconds = circleBufPop(&cmdBuf);
					do
					{
						msg[idx++]=circleBufPop(&cmdBuf);
					}while(msg[idx-1]!='\0');
					addMsg(msg,options,xpos,ypos);
					//timeoutStart(&cmdBtnWaitTimeout,300*1000000);
					timeoutInit(&cmdBtnWaitTimeout);
#ifdef Debug_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_DISPLAY_MESSAGE\r\n");
#endif
#ifdef Debug_Data_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_DISPLAY_MESSAGE %d %d %d %s\r\n",options,xpos,ypos,msg);
#endif
				}

			} else if (command == HOST_CMD_FIND_AXES_MINIMUM ||
					command == HOST_CMD_FIND_AXES_MAXIMUM) 
			{
				if (cmdBuf.length >= 8) 
				{
					uint8_t flags ;
					uint32_t feedrate ;
					uint16_t timeout_s ;
					bool direction ;
					circleBufPop(&cmdBuf); // remove the command
					flags = pop8();
					feedrate = pop32(); // feedrate in us per step
					timeout_s = pop16();
					direction = command == HOST_CMD_FIND_AXES_MAXIMUM;
					cmdMode = HOMING;
					timeoutStart(&cmdHomingTimeout,timeout_s*1000L*1000L);//homing_timeout.start(timeout_s * 1000L * 1000L);
//					//timeoutStart(&cmdHomingTimeout,2*1000L*1000L);//homing_timeout.start(timeout_s * 1000L * 1000L);
//					//steppers::startHoming(command==HOST_CMD_FIND_AXES_MAXIMUM,flags,feedrate);
					motorStartHoming(command==HOST_CMD_FIND_AXES_MAXIMUM,flags,feedrate);
#ifdef Debug_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_FIND_AXES_MINIMUM \r\n");
#endif
#ifdef Debug_Data_Cmd
					LED_BLINK(1);
					if(command == HOST_CMD_FIND_AXES_MINIMUM)
						printf("HOST_CMD_FIND_AXES_MINIMUM %d %d %d\r\n",command,flags,feedrate);
					else
						printf("HOST_CMD_FIND_AXES_MAXIMUM %d %d %d\r\n",command,flags,feedrate);
#endif
				}
			} else if (command == HOST_CMD_WAIT_FOR_TOOL) 
			{
				if (cmdBuf.length >= 6) 
				{
					uint16_t toolPingDelay ;
					uint16_t toolTimeout ;
					cmdMode = WAIT_ON_TOOL;
					circleBufPop(&cmdBuf);
					currentToolIndex = circleBufPop(&cmdBuf);
					toolPingDelay = (uint16_t)pop16();
					toolTimeout = (uint16_t)pop16();
					//tool_wait_timeout.start(toolTimeout*1000000L);//toFix
#ifdef Debug_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_WAIT_FOR_TOOL\r\n");
#endif
#ifdef Debug_Data_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_WAIT_FOR_TOOL\r\n");
#endif
				}
			} else if (command == HOST_CMD_WAIT_FOR_PLATFORM) 
			{
				// FIXME: Almost equivalent to WAIT_FOR_TOOL
				if (cmdBuf.length >= 6) 
				{
					uint8_t currentToolIndex ;
					uint16_t toolPingDelay ;
					uint16_t toolTimeout ;
					cmdMode = WAIT_ON_PLATFORM;
					circleBufPop(&cmdBuf);
					currentToolIndex = circleBufPop(&cmdBuf);
					toolPingDelay = (uint16_t)pop16();
					toolTimeout = (uint16_t)pop16();
					//tool_wait_timeout.start(toolTimeout*1000000L);//toFix
#ifdef Debug_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_WAIT_FOR_PLATFORM\r\n");
#endif
#ifdef Debug_Data_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_WAIT_FOR_PLATFORM\r\n");
#endif
				}
			} else if (command == HOST_CMD_STORE_HOME_POSITION) 
			{

				// check for completion
				if (cmdBuf.length >= 2) 
				{
//					uint16_t offset ;
//					uint32_t position ;
					circleBufPop(&cmdBuf);
					axes = pop8();
					// Go through each axis, and if that axis is specified, read it's value,
					// then record it to the eeprom.
//					for (i = 0; i < STEPPER_COUNT; i++) 
//					{
//						if ( axes & (1 << i) ) 
//						{
//							offset = eeprom_offsets::AXIS_HOME_POSITIONS + 4*i;
//							position = steppers::getPosition()[i];
//							cli();
//							eeprom_write_block(&position, (void*) offset, 4);
//							sei();
//						}
//					}
#ifdef Debug_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_STORE_HOME_POSITION\r\n");
#endif
#ifdef Debug_Data_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_STORE_HOME_POSITION\r\n");
#endif
				}
			} 
			else if (command == HOST_CMD_RECALL_HOME_POSITION) 
			{
				// check for completion
				if (cmdBuf.length >= 2) 
				{
					//uint16_t offset ;
					circleBufPop(&cmdBuf);
					axes = pop8();

					//pt[0]=0;
					//pt[1]=3000;
					//pt[2]=0;
					//pt[3]=0;
//					pt[0]=12000;
//					pt[1]=9000;
					pt[0]=9000;
					pt[1]=6000;
					pt[2]=0;
					pt[3]=0;
					motorDefinePosition(pt);
#ifdef Debug_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_RECALL_HOME_POSITION\r\n");
#endif
#ifdef Debug_Data_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_RECALL_HOME_POSITION\r\n");
#endif
				}

			}else if (command == HOST_CMD_SET_POT_VALUE)
			{
				if (cmdBuf.length >= 2) 
				{
					uint8_t axis ;
					uint8_t value ;
					circleBufPop(&cmdBuf); // remove the command code
					axis = pop8();
					value = pop8();
//					steppers::setAxisPotValue(axis, value);
//					steppers::setAxisPotValue(axis, value);
#ifdef Debug_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_SET_POT_VALUE\r\n");
#endif
#ifdef Debug_Data_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_SET_POT_VALUE\r\n");
#endif
				}
			}else if (command == HOST_CMD_SET_RGB_LED)
			{
				if (cmdBuf.length >= 2) 
				{
					uint8_t red  ;
					uint8_t green ;
					uint8_t blue ;
					uint8_t blink_rate ;
					uint8_t effect;
					circleBufPop(&cmdBuf); // remove the command code

					red = pop8();
					green = pop8();
					blue = pop8();
					blink_rate = pop8();

					effect = pop8();

					//RGB_LED::setLEDBlink(blink_rate);
					//RGB_LED::setCustomColor(red, green, blue);
#ifdef Debug_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_SET_RGB_LED\r\n");
#endif
#ifdef Debug_Data_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_SET_RGB_LED\r\n");
#endif

				}
			}else if (command == HOST_CMD_SET_BEEP)
			{
				if (cmdBuf.length >= 2)
				{
					uint8_t frequency;
					uint8_t beep_length ;
					uint8_t effect ;
					circleBufPop(&cmdBuf); // remove the command code
					frequency= pop16();
					beep_length = pop16();
					effect = pop8();
					//Piezo::setTone(frequency, beep_length);
#ifdef Debug_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_SET_BEEP\r\n");
#endif
#ifdef Debug_Data_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_SET_BEEP\r\n");
#endif
				}			
			}else if (command == HOST_CMD_TOOL_COMMAND) 
			{
				if (cmdBuf.length >= 4) 
				{ // needs a payload
					uint8_t payload_length =*circleBufGetData(&cmdBuf,3);// command_buffer[3];
					if (cmdBuf.length >= 4+payload_length) 
					{
						circleBufPop(&cmdBuf); // remove the command code
						processExtruderCommandPacket(); 
#ifdef Debug_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_TOOL_COMMAND\r\n");
#endif
#ifdef Debug_Data_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_TOOL_COMMAND\r\n");
#endif
					}
				}
			}
			else if (command == HOST_CMD_SET_BUILD_PERCENT)
			{
				if (cmdBuf.length >= 2)
				{
					uint8_t percent ;
					uint8_t ignore ;
					circleBufPop(&cmdBuf); // remove the command code
					percent = pop8();
					ignore = pop8(); // remove the reserved byte
					//interface::setBuildPercentage(percent);
#ifdef Debug_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_SET_BUILD_PERCENT\r\n");
#endif
#ifdef Debug_Data_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_SET_BUILD_PERCENT\r\n");
#endif
				}
			} else if (command == HOST_CMD_QUEUE_SONG ) //queue a song for playing
			{
				/// Error tone is 0,
				/// End tone is 1,
				/// all other tones user-defined (defaults to end-tone)
				if (cmdBuf.length >= 2)
				{
					uint8_t songId;
					circleBufPop(&cmdBuf); // remove the command code
					songId = pop8();
//					if(songId == 0)
//						Piezo::errorTone(4);
//					else if (songId == 1 )
//						Piezo::doneTone();
//					else
//						Piezo::errorTone(2);
#ifdef Debug_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_QUEUE_SONG \r\n");
#endif
#ifdef Debug_Data_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_QUEUE_SONG \r\n");
#endif
				}

			} else if ( command == HOST_CMD_RESET_TO_FACTORY) 
			{
				/// reset EEPROM settings to the factory value. Reboot bot.
				if (cmdBuf.length >= 1)
				{
					uint8_t options ;
					circleBufPop(&cmdBuf); // remove the command code
					options = pop8();
					//eeprom::factoryResetEEPROM();
					//Motherboard::getBoard().reset(false);
#ifdef Debug_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_RESET_TO_FACTORY\r\n");
#endif
#ifdef Debug_Data_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_RESET_TO_FACTORY\r\n");
#endif
				}
			} else if ( command == HOST_CMD_BUILD_START_NOTIFICATION) 
			{
				if (cmdBuf.length >= 1)
				{
					int buildSteps ;
					circleBufPop(&cmdBuf); // remove the command code
					buildSteps = pop32();
					hostHandleBuildStartNotification(&cmdBuf);
#ifdef Debug_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_BUILD_START_NOTIFICATION\r\n");
#endif
#ifdef Debug_Data_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_BUILD_START_NOTIFICATION\r\n");
#endif
				}
			} else if ( command == HOST_CMD_BUILD_END_NOTIFICATION) 
			{
				if (cmdBuf.length >= 1)
				{
					uint8_t flags ;
					circleBufPop(&cmdBuf); // remove the command code
					flags = circleBufPop(&cmdBuf);
					hostHandleBuildStopNotification(flags);
#ifdef Debug_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_BUILD_END_NOTIFICATION\r\n");
#endif
#ifdef Debug_Data_Cmd
					LED_BLINK(1);
					printf("HOST_CMD_BUILD_END_NOTIFICATION\r\n");
#endif
				}

			} else 
			{
				//错误指令,或者指令 已经乱了,或未知指令,直接pop?
				printf("error instruct; %d\r\n",command);
				circleBufPop(&cmdBuf); // remove the command code
					LED_BLINK(1);
			}
		}
		else
			cmdPaused=true;
		//printf("current cmd count:  %d\r\n",cmdCnt);
		//printf("%d %d %d %d\r\n",LastCntIntr2OnceStepTmp[0],LastCntIntr2OnceStepTmp[1],LastCntIntr2OnceStepTmp[2],LastCntIntr2OnceStepTmp[3]);
	}

}
//===== POP SR
void sngPOPSR()
{
	sr = pop16();	changedSP();
	cycles = 6;
}