Trikarus/firmware_smartstepper_trikarus/stepper_nano_zero/nonvolatile.cpp

146 lines
5.3 KiB
C++

/**********************************************************************
Copyright (C) 2018 MisfitTech LLC, All rights reserved.
MisfitTech uses a dual license model that allows the software to be used under
a standard GPL open source license, or a commercial license. The standard GPL
license requires that all software statically linked with MisfitTec Code is
also distributed under the same GPL V2 license terms. Details of both license
options follow:
- Open source licensing -
MisfitTech is a free download and may be used, modified, evaluated and
distributed without charge provided the user adheres to version two of the GNU
General Public License (GPL) and does not remove the copyright notice or this
text. The GPL V2 text is available on the gnu.org web site
- Commercial licensing -
Businesses and individuals that for commercial or other reasons cannot comply
with the terms of the GPL V2 license must obtain a low cost commercial license
before incorporating MisfitTech code into proprietary software for distribution in
any form. Commercial licenses can be purchased from www.misfittech.net
and do not require any source files to be changed.
This code is distributed in the hope that it will be useful. You cannot
use MisfitTech's code unless you agree that you use the software 'as is'.
MisfitTech's code is provided WITHOUT ANY WARRANTY; without even the implied
warranties of NON-INFRINGEMENT, MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. MisfitTech LLC disclaims all conditions and terms, be they
implied, expressed, or statutory.
Written by Trampas Stern for MisfitTech.
Misfit Tech invests time and resources providing this open source code,
please support MisfitTech and open-source hardware by purchasing
products from MisfitTech, www.misifittech.net!
*********************************************************************/
#include "nonvolatile.h"
#include "Flash.h" //thanks to Kent Larsen for pointing out the lower case error
#include <Arduino.h>
//we use this so we can hard code calibration table
// be sure to set the last word as status flag
// this save time calibrating each time we do a code build
#ifdef NZS_FAST_CAL
__attribute__((__aligned__(FLASH_ROW_SIZE))) const uint16_t NVM_flash[16767]={ //allocates 33280 bytes
#else
__attribute__((__aligned__(FLASH_ROW_SIZE))) const uint16_t NVM_flash[256]={ //allocates 512 bytes
#endif
25758,26078,26399,26720,27043,27372,27698,28024,28353,28688,29017,29345,29671,30009,30340,30663,30997,31335,31664,31994,32325,32666,32997,33324,33661,33997,34330,34657,34986,35324,35653,35981,36303,36637,36962,37282,37605,37938,38260,38581,38901,39232,39554,39877,40198,40528,40849,41178,41500,41835,42163,42485,42815,43149,43475,43804,44139,44476,44801,45136,45460,45804,46130,46460,46790,47119,47449,47777,48103,48442,48772,49099,49424,49759,50087,50410,50735,51067,51394,51716,52045,52379,52703,53024,53348,53680,54002,54326,54648,54987,55309,55629,55958,56292,56612,56936,57262,57594,57917,58246,58569,58902,59225,59552,59873,60206,60534,60862,61192,61531,61864,62194,62529,62873,63210,63544,63878,64222,64562,64899,65241,45,384,719,1058,1398,1733,2058,2390,2732,3060,3394,3720,4056,4386,4710,5036,5366,5693,6016,6340,6665,6989,7308,7622,7952,8263,8586,8903,9232,9551,9874,10200,10534,10859,11185,11513,11852,12184,12514,12848,13185,13511,13841,14170,14504,14830,15156,15490,15827,16153,16481,16808,17143,17474,17801,18121,18458,18783,19111,19433,19765,20084,20405,20721,21045,21360,21673,21984,22305,22614,22922,23231,23551,23861,24173,24482,24808,25118,25435,
0xFFFF
};
static_assert (sizeof(nvm_t)<sizeof(NVM_flash), "nvm_t structure larger than allocated memory");
//FLASH_ALLOCATE(NVM_flash, sizeof(nvm_t));
bool nvmWriteCalTable(void *ptrData, uint32_t size)
{
bool x=true;
flashWrite(&NVM->CalibrationTable,ptrData,size);
return true;
}
bool nvmWrite_sPID(float Kp, float Ki, float Kd)
{
PIDparams_t pid;
pid.Kp=Kp;
pid.Ki=Ki;
pid.Kd=Kd;
pid.parametersVaild=true;
flashWrite((void *)&NVM->sPID,&pid,sizeof(pid));
return true;
}
bool nvmWrite_vPID(float Kp, float Ki, float Kd)
{
PIDparams_t pid;
pid.Kp=Kp;
pid.Ki=Ki;
pid.Kd=Kd;
pid.parametersVaild=true;
flashWrite((void *)&NVM->vPID,&pid,sizeof(pid));
return true;
}
bool nvmWrite_pPID(float Kp, float Ki, float Kd)
{
PIDparams_t pid;
pid.Kp=Kp;
pid.Ki=Ki;
pid.Kd=Kd;
pid.parametersVaild=true;
flashWrite((void *)&NVM->pPID,&pid,sizeof(pid));
return true;
}
bool nvmWriteSystemParms(SystemParams_t &systemParams)
{
systemParams.parametersVaild=true;
flashWrite((void *)&NVM->SystemParams,&systemParams,sizeof(systemParams));
return true;
}
bool nvmWriteMotorParms(MotorParams_t &motorParams)
{
motorParams.parametersVaild=true;
flashWrite((void *)&NVM->motorParams,&motorParams,sizeof(motorParams));
return true;
}
bool nvmErase(void)
{
bool data=false;
uint16_t cs=0;
flashWrite((void *)&NVM->CalibrationTable.status,&data,sizeof(data));
flashWrite((void *)&NVM->sPID.parametersVaild ,&data,sizeof(data));
flashWrite((void *)&NVM->vPID.parametersVaild ,&data,sizeof(data));
flashWrite((void *)&NVM->pPID.parametersVaild ,&data,sizeof(data));
flashWrite((void *)&NVM->motorParams.parametersVaild ,&data,sizeof(data));
flashWrite((void *)&NVM->SystemParams.parametersVaild ,&data,sizeof(data));
#ifdef NZS_FAST_CAL
flashWrite((void *)&NVM->FastCal.checkSum,&cs,sizeof(cs));
#endif
}