// © 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

// mMachineSpline

#include "MachineSplineAxis.h"



// Initializer

MachineSplineAxis::MachineSplineAxis(

     char*          data,

     Axis*          firstAxisPtr,

     String*          msgPtr ) {


     nextSplineAxis     = NULL;

     machineType     = Invalid; // Assume invalid

     currentPoint     = 0.0;

  

     char            axisNameC;

     p4              = 0.0;

     int parsed      = sscanf( data,

          "%c%f",

          &axisNameC,

          &p4 );          // p4 is an offset in micro-steps


     // Find the axis

     if ( axisNameC >= 97 )

          axisNameC -= 32; // x->X, y->Y, z->Z, a->A, b->B, c->C


     axis            = firstAxisPtr;

     while (          axis

               &&     axis->axisNameC != axisNameC )

          axis = axis->nextAxis;


     if          ( axis == NULL )

          *msgPtr          += "\nE MachineSpline axis not Configured!";


     else if ( parsed == 2 )

          machineType          = Linear;


     else {

          snprintf( data, 40,

               "\nE %s Invalid",

               data );

          *msgPtr          += String( data ); }; };


bool

     MachineSplineAxis::valid() {

     

     return

          machineType != Invalid; };


void

     MachineSplineAxis::calculateTarget( float t ) {


     float microstepTarget     = p4 * t;

     axis->interpolationMicrostepBuffer

          +=     microstepTarget

          -     currentPoint;

     currentPoint               = microstepTarget; };