// © 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 <DRV8711Axis.h>



void

     DRV8711Axis::updateAxis(

          char*          data,

          String*          msgPtr ) {


     *msgPtr                    += " Update 8711 ";

     data++;


     // Supports multiple parameter updates, but host only updates one at a time

     uint32_t  length     = 0;

     while( sscanf( data,

          " %x%ln",

          &updateRegU.updateReg,

          &length ) > 0 ) { // returns -1 at eof


          switch( updateRegU.st.param ) {

     

               case IsGain :

               ctrlRegU.st.isGain                              = updateRegU.st.datum;

               *msgPtr               += "Gain";

               break;


               case DeadTime :

               ctrlRegU.st.deadTime                         = updateRegU.st.datum;

               *msgPtr               += "DeadTime";

               break;


               case ReverseDirection :

               ctrlRegU.st.reverseDirection               = updateRegU.st.datum;

               reverseDirection                              = ctrlRegU.st.reverseDirection;

               *msgPtr               += "ReverseDirection";

               break;


               case BemfSampleTime :

               torqueRegU.st.bemfSampleTime               = updateRegU.st.datum;

               *msgPtr               += "BemfSampleTime";

               break;


               case OffTime :

               offRegU.st.offTime                              = updateRegU.st.datum;

               *msgPtr               += "Off";

               setRegister(     offRegU.offReg,     msgPtr );

               break;


               case BlankingTime :

               blankRegU.st.blankingTime                    = updateRegU.st.datum;

               *msgPtr               += "Blanking";

               setRegister(     blankRegU.blankReg,     msgPtr );

               break;


               case AdaptiveBlanking :

               blankRegU.st.adaptiveBlanking               = updateRegU.st.datum;

               *msgPtr               += "Blanking";

               setRegister(     blankRegU.blankReg,     msgPtr );

               break;


               case TransitionTime :

               decayRegU.st.transitionTime                    = updateRegU.st.datum;

               *msgPtr               += "Decay";

               setRegister(     decayRegU.decayReg,     msgPtr );

               break;


               case DecayMode :

               decayRegU.st.decayMode                         = updateRegU.st.datum;

               *msgPtr               += "Decay";

               setRegister(     decayRegU.decayReg,     msgPtr );

               break;


               case StallDetectThreshold :

               stallRegU.st.stallDetectThreshold          = updateRegU.st.datum;

               *msgPtr               += "Stall";

               setRegister(     stallRegU.stallReg,     msgPtr );

               break;


               case StallDelay :

               stallRegU.st.stallDelay                         = updateRegU.st.datum;

               *msgPtr               += "Stall";

               setRegister(     stallRegU.stallReg,     msgPtr );

               break;


               case BemfDivider :

               stallRegU.st.bemfDivider                    = updateRegU.st.datum;

               *msgPtr               += "Stall";

               setRegister(     stallRegU.stallReg,     msgPtr );

               break;


               case OutputCurrentThreshold :

               driveRegU.st.outputCurrentThreshold          = updateRegU.st.datum;

               *msgPtr               += "Drive";

               setRegister(     driveRegU.driveReg,     msgPtr );

               break;


               case OutputCurrentDelay :

               driveRegU.st.outputCurrentDelay               = updateRegU.st.datum;

               *msgPtr               += "Drive";

               setRegister(     driveRegU.driveReg,     msgPtr );

               break;


               case LowGateDelay :

               driveRegU.st.lowGateDelay                    = updateRegU.st.datum;

               *msgPtr               += "Drive";

               setRegister(     driveRegU.driveReg,     msgPtr );

               break;


               case HighGateDelay :

               driveRegU.st.highGateDelay                    = updateRegU.st.datum;

               *msgPtr               += "Drive";

               setRegister(     driveRegU.driveReg,     msgPtr );

               break;


               case LowGateThreshold :

               driveRegU.st.lowGateThreshold               = updateRegU.st.datum;

               *msgPtr               += "Drive";

               setRegister(     driveRegU.driveReg,     msgPtr );

               break;


               case HighGateThreshold :

               driveRegU.st.highGateThreshold               = updateRegU.st.datum;

               *msgPtr               += "Drive";

               setRegister(     driveRegU.driveReg,     msgPtr );

               break;


               case HoldTorque :

               powerLevelsU.st.holdTorque                    = updateRegU.st.datum;

               *msgPtr               += "Hold";

               break;


               case ConstantTorque :

               powerLevelsU.st.constantTorque               = updateRegU.st.datum;

               *msgPtr               += "Constant";

               break;


               case AcceleratingTorque :

               powerLevelsU.st.acceleratingTorque          = updateRegU.st.datum;

               *msgPtr               += "Accel";

               break;


               case DeceleratingTorque :

               powerLevelsU.st.deceleratingTorque          = updateRegU.st.datum;

               *msgPtr               += "Decel";

               break;


               case AdaptiveMicroStepping :

               optionsU.st.adaptiveMicroStepping          = updateRegU.st.datum;

               *msgPtr               += "Microstep";

               break;

               

               case MinStallDetectSpeed :

               optionsU.st.minStallDetectSpeed               = updateRegU.st.datum;

               *msgPtr               += "StallDetectSpeed";

               

               case EnableStallDetect :

               optionsU.st.enableStallDetect               = updateRegU.st.datum;

               *msgPtr               += "EnableStallDetect";

          };

          data     += length; };


     *msgPtr               += "\n"; };