// © RiceMotion ( Robert Carl Rice ) 2012-2016 - All rights reserved


// This software makes use of tools and libraries obtained from open source projects or released for

// use by relevant hardware manufactures. However, this software is NOT a part of any open source project.

// It is released only on a "need to know" basis for beta testers of the "RiceCNC Interpolation Engine".

// Recipents of this source code must respect the confidential nature of this software and prevent any

// distribution that could result in counterfeit copies of the "RiceCNC Interpolation Engine".


// © RiceMotion ( Robert Carl Rice ) 2012-2016 - All rights reserved

#include <MachineCommands.h>

#include <Machine.h>

#include <Command.h>

#include <InterpolationTimer.h>



void

     Machine::processCommand(

          char*     commandPtr,

          String* msgPtr ) {


     char* data     = commandPtr + 1;

     switch ( *commandPtr ) {


          // out-of-band commands

          case FEEDRATE_CONTROL :

          feedrateControl(

               data,

               msgPtr );

          break;


          case SPINDLE_CONTROL :

          spindleControl(

               data,

               msgPtr );

          break;


          case AUXILARY_CONTROL :

          auxilaryControl(

               data,

               msgPtr );

          break;


          case AXIS_CONTROL :

          axisControl(

               data,

               msgPtr );

          break;


          case HANDSHAKE_CONTROL :

          handshakeControl(

               data,

               msgPtr );

          break;


          case INTERPOLATION_CONTROL :

          interpolationControl(

               data,

               msgPtr );

          break;


          case TORCH_CONTROL :

          torchControl(

               data,

               msgPtr );

          break;


          case POSITION_CONTROL :

          positionControl(

               data,

               msgPtr );

          break;


          default :

          *msgPtr  +=

               *commandPtr +

               "E Invalid Machine Command - Ignored"; }; };



void

     Machine::queueCommand(

          Command* newCommand ) {


/*     DEBUG

     Serial.print( "E que " );

     Serial.println( newCommand->name() );

*/

     newCommand->nextCommand  = NULL;


     InterpolationTimer::disableInterpolationInterrupts();

          Command** commandPtrPtr     = &firstCommandInQueue;

          // Find end of queue

          while ( *commandPtrPtr )

               commandPtrPtr          = &(*commandPtrPtr)->nextCommand;

          // Add to end of queue

          *commandPtrPtr          = newCommand;


          if ( ! currentCommand )

               currentCommand          = firstCommandInQueue;

     InterpolationTimer::enableInterpolationInterrupts(); };