prepare EEPROM and logic funcs

This commit is contained in:
2024-09-08 22:20:30 +03:00
parent 962333bfec
commit 400ee6dee0
7 changed files with 241 additions and 105 deletions

View File

@ -4,45 +4,95 @@
#include "Print.h"
void SaveShot(unsigned char number, struct Shot* shot)
MemoryStatus saveShot(unsigned char number, Shot* shot)
{
print("SaveShot ");
printNumber(number);
unsigned char Buf[SHOT_BLOCKSIZE];
memset(Buf, 0x00, sizeof(Buf));
Buf[0] = number;
Buf[1] = shot->countRepeatShot;
Buf[2] = shot->speedRollerTop;
Buf[3] = shot->speedRollerBottom;
Buf[4] = shot->speedScrew;
Buf[5] = shot->rotationAxial;
Buf[6] = shot->rotationHorizontal;
Buf[7] = shot->rotationVertical;
FLASH_WriteBlock(START_ADR_SHOT, number, Buf);
if(FLASH_WriteBlock(START_ADR_SHOT, number, (uint8_t*)shot) == EEPROM_OK){
return EEPROM_OK;
}
return EEPROM_FAIL;
}
struct Shot GetShot( unsigned char number)
MemoryStatus getShot(unsigned char number, Shot *shot)
{
struct Shot shot;
unsigned char Buf[SHOT_BLOCKSIZE];
FLASH_ReadBlock(START_ADR_SHOT, number, Buf);
shot.isExist = Buf[0];
shot.countRepeatShot = Buf[1];
shot.speedRollerTop = Buf[2];
shot.speedRollerBottom = Buf[3];
shot.speedScrew = Buf[4];
shot.rotationAxial = Buf[5];
shot.rotationHorizontal = Buf[6];
shot.rotationVertical = Buf[7];
return shot;
if(FLASH_ReadBlock(START_ADR_SHOT, number, (uint8_t*)&shot) != EEPROM_OK){
return EEPROM_FAIL;
}
if(!shot->isExist){
return EEPROM_MISSING_ELEMENT;
}
return EEPROM_OK;
}
void FLASH_WriteBlock(uint16_t startAddr, uint8_t number, uint8_t *writeData)
MemoryStatus saveProg(unsigned char number, Program* prog)
{
MemoryStatus result = EEPROM_OK;
for(uint16_t i = 0; i < MAX_NUMBER_SHOTS_IN_PROGRAMS; ++i){
Shot shot;
MemoryStatus stat = getShot(prog->shots[i].id, &shot);
if(!(stat == EEPROM_OK || stat == EEPROM_MISSING_ELEMENT)){
return EEPROM_FAIL;
}
if(!shot.isExist){
//todo: add to shotRequest order
result = EEPROM_MISSING_ELEMENT;
}
}
if(FLASH_WriteBlock(START_ADR_PROGRAM, number, (uint8_t*)prog) != EEPROM_OK){
return EEPROM_FAIL;
}
return result;
}
MemoryStatus getProg( unsigned char number, Program* prog)
{
if(FLASH_ReadBlock(START_ADR_PROGRAM, number, (uint8_t*)&prog) != EEPROM_OK){
return EEPROM_FAIL;
}
if(!prog->header.isExist){
return EEPROM_MISSING_ELEMENT;
}
return EEPROM_OK;
}
MemoryStatus saveMacro(unsigned char number, Macro* macro)
{
MemoryStatus result = EEPROM_OK;
for (uint16_t i = 0; i < MAX_NUMBER_PROGRAMS_IN_MACRO; ++i) {
Program prog;
MemoryStatus stat = getProg(macro->programs[i].id, &prog);
if(!(stat == EEPROM_OK || stat == EEPROM_MISSING_ELEMENT)){
return EEPROM_FAIL;
}
if(!prog.header.isExist){
result = EEPROM_MISSING_ELEMENT;
//todo: add to programRequest order
}
}
if(FLASH_WriteBlock(START_ADR_PROGRAM, number, (uint8_t*)macro) != EEPROM_OK){
return EEPROM_FAIL;
}
return result;
}
MemoryStatus getMacro( unsigned char number, Macro* macro)
{
if(FLASH_ReadBlock(START_ADR_PROGRAM, number, (uint8_t*)&macro) != EEPROM_OK){
return EEPROM_FAIL;
}
if(!macro->header.isExist){
return EEPROM_MISSING_ELEMENT;
}
return EEPROM_OK;
}
MemoryStatus FLASH_WriteBlock(uint16_t startAddr, uint8_t number, uint8_t *writeData)
{
HAL_StatusTypeDef result;
uint8_t dataSize;
// protect and select
switch (startAddr) {
@ -53,20 +103,20 @@ void FLASH_WriteBlock(uint16_t startAddr, uint8_t number, uint8_t *writeData)
case START_ADR_SHOT:
dataSize = SHOT_BLOCKSIZE;
if(number > MAX_NUMBER_SHOTS)
return;
return EEPROM_OUT_OF_RANGE;
break;
case START_ADR_PROGRAM:
dataSize = PROGRAM_BLOCKSIZE;
if(number > MAX_NUMBER_PROGRAMS)
return;
return EEPROM_OUT_OF_RANGE;
break;
case START_ADR_MACRO:
dataSize = MACRO_BLOCKSIZE;
if(number > MAX_NUMBER_MACRO)
return;
return EEPROM_OUT_OF_RANGE;
break;
default:
return;
return EEPROM_WRONG_STARTADDR;
break;
}
@ -80,11 +130,13 @@ void FLASH_WriteBlock(uint16_t startAddr, uint8_t number, uint8_t *writeData)
for( unsigned char i = 0; i < (dataSize); i++ ) Buf[i+2] = writeData[i];
HAL_I2C_Master_Transmit(&hi2c1, (AT24C_ADRESS << 1), Buf, (dataSize + 2), 10);
result = HAL_I2C_Master_Transmit(&hi2c1, (AT24C_ADRESS << 1), Buf, (dataSize + 2), 10);
HAL_Delay(1);
return result;
}
void FLASH_ReadBlock(uint16_t startAddr, uint8_t number, uint8_t *readData){
MemoryStatus FLASH_ReadBlock(uint16_t startAddr, uint8_t number, uint8_t *readData){
HAL_StatusTypeDef result;
uint8_t dataSize;
// protect and select
switch (startAddr) {
@ -95,20 +147,20 @@ void FLASH_ReadBlock(uint16_t startAddr, uint8_t number, uint8_t *readData){
case START_ADR_SHOT:
dataSize = SHOT_BLOCKSIZE;
if(number > MAX_NUMBER_SHOTS)
return;
return EEPROM_OUT_OF_RANGE;
break;
case START_ADR_PROGRAM:
dataSize = PROGRAM_BLOCKSIZE;
if(number > MAX_NUMBER_PROGRAMS)
return;
return EEPROM_OUT_OF_RANGE;
break;
case START_ADR_MACRO:
dataSize = MACRO_BLOCKSIZE;
if(number > MAX_NUMBER_MACRO)
return;
return EEPROM_OUT_OF_RANGE;
break;
default:
return;
return EEPROM_WRONG_STARTADDR;
break;
}
@ -117,8 +169,9 @@ void FLASH_ReadBlock(uint16_t startAddr, uint8_t number, uint8_t *readData){
uint16_t blockAddr16 = (uint16_t)(startAddr + (uint16_t)(number*dataSize));
uint8_t blockAddr[2] = {HIBYTE(blockAddr16), LOBYTE(blockAddr16)};
HAL_I2C_Master_Transmit(&hi2c1, (AT24C_ADRESS << 1), blockAddr, 2, 10);
result = HAL_I2C_Master_Transmit(&hi2c1, (AT24C_ADRESS << 1), blockAddr, 2, 10);
HAL_Delay(1);
HAL_I2C_Master_Receive(&hi2c1, (AT24C_ADRESS << 1), readData, dataSize, 10);
result = HAL_I2C_Master_Receive(&hi2c1, (AT24C_ADRESS << 1), readData, dataSize, 10);
HAL_Delay(1);
return result;
}