You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
780 lines
28 KiB
780 lines
28 KiB
//#############################################################################################################################################################################################################
|
|
#include "IDIBUS_IMPL.h"
|
|
#include "EEMEM.h"
|
|
#include "SYSTEM.h"
|
|
#include "MEMORY.h"
|
|
#include "RSLink.h"
|
|
#include "USART1.h"
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
// At the request of the customer
|
|
volatile char IDUBUS_SPEC_FRAZE_RU[] = "ÍÅËÅÇÒÜ !!!";
|
|
volatile char IDUBUS_SPEC_FRAZE_EN[] = "HANDS OFF !!!";
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
static idibus_func_t custom_init = NULL;
|
|
static idibus_func_t custom_shutdown = NULL;
|
|
static idibus_func_t custom_freeze = NULL;
|
|
static idibus_func_t custom_resume = NULL;
|
|
|
|
static idibus_slave_module_t* IDIBUS_MODULE;
|
|
//Device description
|
|
|
|
void IdiBus_pass_module(idibus_slave_module_t* MODULE)
|
|
{
|
|
IDIBUS_MODULE = MODULE;
|
|
}
|
|
|
|
|
|
|
|
void IdiBus_register_init(idibus_func_t callback)
|
|
{
|
|
custom_init = callback;
|
|
}
|
|
void IdiBus_register_shutdown(idibus_func_t callback)
|
|
{
|
|
custom_shutdown = callback;
|
|
}
|
|
void IdiBus_register_freeze(idibus_func_t callback)
|
|
{
|
|
custom_freeze = callback;
|
|
}
|
|
void IdiBus_register_resume(idibus_func_t callback)
|
|
{
|
|
custom_resume = callback;
|
|
}
|
|
|
|
|
|
// EEPROM_Fast.h BLOCK
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
uint16_t EEPROM_ADDR;
|
|
uint8_t EEPROM_BUF[EEPROM_BUF_SIZE];
|
|
uint8_t EEPROM_BUF_COUNT;
|
|
|
|
ISR(EE_READY_vect)
|
|
{
|
|
|
|
while (1)
|
|
{
|
|
if (EEPROM_BUF_COUNT == 0)
|
|
{
|
|
IDIBUS_MODULE->LONG_OP.State = IDILONGOP_STATE_COMPLETE_NO_ERR; //isThisSafe???!!!
|
|
IDIBUS_MODULE->LONG_OP.Switch = 0;
|
|
IDIBUS_MODULE->LONG_OP.Type = IDIBUS_LONGOP_NOPE;
|
|
EECR &= ~(1<<EERIE);
|
|
return;
|
|
}
|
|
|
|
EEAR = EEPROM_ADDR+EEPROM_BUF_COUNT-1;
|
|
EECR |= (1<<EERE);
|
|
uint8_t EEDRold = EEDR;
|
|
|
|
if (EEDRold == EEPROM_BUF[EEPROM_BUF_COUNT-1])
|
|
EEPROM_BUF_COUNT--;
|
|
else
|
|
break;
|
|
}
|
|
|
|
EEDR = EEPROM_BUF[EEPROM_BUF_COUNT-1];
|
|
EEPROM_BUF_COUNT--;
|
|
EECR |= (1<<EEMPE);
|
|
EECR |= (1<<EEPE);
|
|
}
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
void EEPROM_WriteEepBuf(uint8_t count,uint16_t addr)
|
|
{
|
|
if (count > EEPROM_BUF_SIZE || count == 0)
|
|
{
|
|
IDIBUS_MODULE->LONG_OP.State = IDILONGOP_STATE_COMPLETE_WITH_ERR; //isThisSafe???!!!
|
|
IDIBUS_MODULE->LONG_OP.Switch = 0;
|
|
IDIBUS_MODULE->LONG_OP.Type = IDIBUS_LONGOP_NOPE;
|
|
return;
|
|
}
|
|
EEPROM_BUF_COUNT = count;
|
|
EEPROM_ADDR = addr;
|
|
IDIBUS_MODULE->LONG_OP.Switch = 1;
|
|
|
|
while (1)
|
|
{
|
|
if (EEPROM_BUF_COUNT == 0)
|
|
{
|
|
IDIBUS_MODULE->LONG_OP.State = IDILONGOP_STATE_COMPLETE_NO_ERR; //isThisSafe???!!!
|
|
IDIBUS_MODULE->LONG_OP.Switch = 0;
|
|
IDIBUS_MODULE->LONG_OP.Type = IDIBUS_LONGOP_NOPE;
|
|
EECR &= ~(1<<EERIE);
|
|
return;
|
|
}
|
|
|
|
EEAR = EEPROM_ADDR+EEPROM_BUF_COUNT-1;
|
|
|
|
while(EECR&(1<<EEPE)); //Wait if we somehow doing write
|
|
EECR |= (1<<EERE);
|
|
uint8_t EEDRold = EEDR;
|
|
|
|
if (EEDRold == EEPROM_BUF[EEPROM_BUF_COUNT-1])
|
|
EEPROM_BUF_COUNT--;
|
|
else
|
|
break;
|
|
}
|
|
cli();
|
|
EEDR = EEPROM_BUF[EEPROM_BUF_COUNT-1];
|
|
EEPROM_BUF_COUNT--;
|
|
EECR |= (1<<EERIE);
|
|
EECR |= (1<<EEMPE);
|
|
EECR |= (1<<EEPE);
|
|
sei();
|
|
}
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef _LONG_ADDR_SPACE_
|
|
void IdiBus_ModuleInit(USART_INTERFACE_TYPE *USART_INTERFACE, uint_farptr_t PROGMEM_SN)
|
|
#else
|
|
void IdiBus_ModuleInit(USART_INTERFACE_TYPE *USART_INTERFACE, const volatile uint8_t *PROGMEM_SN)
|
|
#endif
|
|
{
|
|
if (IDUBUS_SPEC_FRAZE_RU[0]) {}
|
|
if (IDUBUS_SPEC_FRAZE_EN[0]) {}
|
|
|
|
IDIBUS_MODULE->USI = USART_INTERFACE;
|
|
IDIBUS_MODULE->FreezeMemState = IDISTATUS_B0S_ST_STATE_StOperate;
|
|
IDIBUS_MODULE->LONG_OP.Type = IDIBUS_LONGOP_NOPE;
|
|
IDIBUS_MODULE->LONG_OP.Switch = 0;
|
|
IDIBUS_MODULE->LONG_OP.State = IDILONGOP_STATE_COMPLETE_NO_ERR;
|
|
IDIBUS_MODULE->Error = IDIER_NOPE;
|
|
IDIBUS_MODULE->c_InitAssignGroup = IDIBUS_GROUP_0_ADDR;
|
|
|
|
// SN read ------------------------------------------------------------------------------------------------------>
|
|
IDIBUS_MODULE->STATUS.SNfix = PROGMEM_SN;
|
|
IDIBUS_MODULE->STATUS.SNvar = EEBLOCK.EEPROM_SN;
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
uint8_t InitAssignGroup = eeprom_read_byte(&EEBLOCK.EEPROM_IDIBUS_InitGroup);
|
|
|
|
if ( (InitAssignGroup > IDIBUS_GROUP_0_ADDR ) && (InitAssignGroup <= IDIBUS_GROUP_15_ADDR) )
|
|
{
|
|
for (uint8_t Dev = 0; Dev < IDIBUS_MODULE->DevicesCount; Dev++)
|
|
{
|
|
for (uint8_t Ch = 0; Ch<IDIBUS_MODULE->Devices[Dev].ChannelsCount; Ch++)
|
|
{
|
|
IDIBUS_MODULE->Devices[Dev].Channels[Ch].BcastAddr = InitAssignGroup;
|
|
}
|
|
}
|
|
eeprom_write_byte(&EEBLOCK.EEPROM_IDIBUS_InitGroup, 0xFF);
|
|
}
|
|
}
|
|
//=============================================================================================================================================================================================================
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
//=============================================================================================================================================================================================================
|
|
void IDIBUS_ModuleBackgroundHandler(void)
|
|
{
|
|
// Long Operation Routine ------------------------>
|
|
switch ( IDIBUS_MODULE->LONG_OP.Type )
|
|
{
|
|
case (IDIBUS_LONGOP_VARSN_IP_WRITE) :
|
|
{
|
|
if (IDIBUS_MODULE->LONG_OP.Switch == 0)
|
|
{
|
|
EEPROM_WriteEepBuf(IDISN_VARP_IPv4_Length+IDISN_VARP_IPv6_Length,EEBLOCK.EEPROM_SN[IDISN_VARP_IPv4_Pos]);
|
|
}
|
|
break;
|
|
}
|
|
|
|
case (IDIBUS_LONGOP_VARSN_VERIF_EXP_WRITE) :
|
|
{
|
|
if (IDIBUS_MODULE->LONG_OP.Switch == 0)
|
|
{
|
|
EEPROM_WriteEepBuf(IDISN_VARP_EXPIR_DATE_Length+IDISN_VARP_VERIF_DATE_Length,(int)&EEBLOCK.EEPROM_SN[IDISN_VARP_VERIF_DATE_Pos]);
|
|
}
|
|
break;
|
|
}
|
|
|
|
case (IDIBUS_LONGOP_VARSN_AES_WRITE) :
|
|
{
|
|
if (IDIBUS_MODULE->LONG_OP.Switch == 0)
|
|
{
|
|
EEPROM_WriteEepBuf(IDISN_VARP_AES256_Length,(int)&EEBLOCK.EEPROM_SN[IDISN_VARP_AES256_Pos]);
|
|
}
|
|
break;
|
|
}
|
|
|
|
case (IDIBUS_LONGOP_INIT) :
|
|
{
|
|
|
|
if ( IDIBUS_MODULE->c_InitAssignGroup != IDIBUS_GROUP_0_ADDR )
|
|
eeprom_write_byte(&EEBLOCK.EEPROM_IDIBUS_InitGroup,IDIBUS_MODULE->c_InitAssignGroup);
|
|
|
|
uint8_t TimeoutMS = 200;
|
|
while ( (!eeprom_is_ready() || IDIBUS_MODULE->USI->IsTxActive()) && (TimeoutMS != 0) )
|
|
{
|
|
TimeoutMS--;
|
|
_delay_ms(1);
|
|
}
|
|
System_SWReboot();
|
|
break;
|
|
}
|
|
|
|
default :
|
|
{}
|
|
}
|
|
|
|
// Error Handler Routine ------------------------>
|
|
if ( IDIBUS_MODULE->LONG_OP.State == IDILONGOP_STATE_IN_PROC )
|
|
{
|
|
if ( System_GetSysTickDifference(IDIBUS_MODULE->LONG_OP.StartTimeInstanceMS) > IDIBUS_MODULE->LONG_OP.DurationMS )
|
|
{
|
|
// Long Operation terminate function
|
|
IDIBUS_MODULE->LONG_OP.State = IDILONGOP_STATE_COMPLETE_WITH_ERR;
|
|
IDIBUS_MODULE->LONG_OP.Type = IDIBUS_LONGOP_NOPE;
|
|
IDIBUS_MODULE->LONG_OP.Switch = 0;
|
|
}
|
|
}
|
|
}
|
|
//=============================================================================================================================================================================================================
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
//=============================================================================================================================================================================================================
|
|
void IDIBUS_ModuleCommandHandler(idibus_farg_t *farg)
|
|
{
|
|
// If there is special command we don't care about any error in this place
|
|
if ( (farg->ComFunc != IDIMMES_COM_C_Init) && (farg->ComFunc != IDIMMES_COM_C_ShtDown) && (farg->ComFunc != IDIMMES_COM_C_SetAlarmL) )
|
|
{
|
|
// IF we somehow managed to come to the freeze state, we need to exit from freeze state
|
|
if ( IDIBUS_MODULE->STATUS.STATE.B0S.StState == IDISTATUS_B0S_ST_STATE_StFreeze )
|
|
{
|
|
if ( farg->ComFunc != IDIMMES_COM_C_Resume )
|
|
{
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIERSLV_IN_FREEZE);
|
|
return;
|
|
}
|
|
} // If not special command or freeze but long Operation and command not DummyModule
|
|
else if ( IDIBUS_MODULE->Error != IDIER_NOPE )
|
|
{
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIBUS_MODULE->Error);
|
|
return;
|
|
}
|
|
else if ( IDIBUS_MODULE->LONG_OP.State == IDILONGOP_STATE_IN_PROC )
|
|
{
|
|
if ( farg->ComFunc != IDIMMES_COM_C_CheckModuleLongOp )
|
|
{
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIERSLV_LONG_OP_IN_PROC);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
// There is no prohibited command if this place - just handle it
|
|
switch ( farg->ComFunc )
|
|
{
|
|
case (IDIMMES_COM_C_DummyModule) :
|
|
{
|
|
if ( farg->InpDataLength != 0 )
|
|
{
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIERSLV_INVALID_RX_REQUEST_FORMAT);
|
|
}
|
|
else
|
|
{
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIER_NOPE);
|
|
}
|
|
break;
|
|
}
|
|
case ( IDIMMES_COM_C_Init ) :
|
|
{
|
|
|
|
if ( farg->InpDataLength > 1 )
|
|
{
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIERSLV_INVALID_RX_REQUEST_FORMAT);
|
|
}
|
|
else if ( (farg->InpDataLength == 1) && (farg->InpData[0] > IDIBUS_GROUP_LAST_NUMBER) )
|
|
{
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIERSLV_INVALID_RX_PARAM);
|
|
}
|
|
//Some custom error???!!
|
|
//else if ( 0 /* CTRL_SelectedMode == _CTRL_MODE_MANUAL_ */ ) { IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIBUS_CUSTDEF_ERCODE_NO_ACCESS); }
|
|
else
|
|
{
|
|
// Execute custom init
|
|
if (custom_init!=NULL) custom_init();
|
|
|
|
if ( farg->InpDataLength == 1 )
|
|
{
|
|
|
|
IDIBUS_MODULE->c_InitAssignGroup = (uint8_t)( farg->InpData[0] + IDIBUS_GROUP_0_ADDR );
|
|
}
|
|
//IDIBUS_MODULE->LONG_OP.Type = IDIBUS_LONGOP_INIT;
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIER_NOPE);
|
|
|
|
}
|
|
break;
|
|
}
|
|
|
|
case ( IDIMMES_COM_C_ShtDown ) :
|
|
{
|
|
if ( farg->InpDataLength != 0 )
|
|
{
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIERSLV_INVALID_RX_REQUEST_FORMAT);
|
|
}
|
|
//Some custom error???!!
|
|
//else if ( 0 /* CTRL_SelectedMode == _CTRL_MODE_MANUAL_ */ ) { IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIBUS_CUSTDEF_ERCODE_NO_ACCESS); }
|
|
else
|
|
{
|
|
if (custom_shutdown!=NULL) custom_shutdown();
|
|
IDIBUS_MODULE->STATUS.STATE.B0S.StState = IDISTATUS_B0S_ST_STATE_StNoInit;
|
|
IDIBUS_MODULE->Error = IDIERSLV_NO_INIT;
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIER_NOPE);
|
|
}
|
|
break;
|
|
}
|
|
|
|
case (IDIMMES_COM_C_Freeze) :
|
|
{
|
|
if ( farg->InpDataLength != 0 )
|
|
{
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIERSLV_INVALID_RX_REQUEST_FORMAT);
|
|
}
|
|
else
|
|
{
|
|
if (custom_freeze!= NULL) custom_freeze();
|
|
IDIBUS_MODULE->FreezeMemState = IDIBUS_MODULE->STATUS.STATE.B0S.StState;
|
|
IDIBUS_MODULE->STATUS.STATE.B0S.StState = IDISTATUS_B0S_ST_STATE_StFreeze;
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIER_NOPE);
|
|
}
|
|
break;
|
|
}
|
|
|
|
case (IDIMMES_COM_C_Resume) :
|
|
{
|
|
if ( farg->InpDataLength != 0 )
|
|
{
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIERSLV_INVALID_RX_REQUEST_FORMAT);
|
|
}
|
|
else
|
|
{
|
|
if(custom_resume!=NULL) custom_resume();
|
|
IDIBUS_MODULE->STATUS.STATE.B0S.StState = (uint8_t)(IDIBUS_MODULE->FreezeMemState & 0x07U);
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIBUS_MODULE->Error);
|
|
}
|
|
break;
|
|
}
|
|
|
|
case (IDIMMES_COM_C_ReadDevFullSN_MS) :
|
|
{
|
|
if ( farg->InpDataLength != 0 )
|
|
{
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIERSLV_INVALID_RX_REQUEST_FORMAT);
|
|
}
|
|
else
|
|
{
|
|
FLASH_DATABLOCK dataApp;
|
|
readDeviceData(&dataApp, locationInApp);
|
|
IDIBUS_ResponseProtectedWrite(farg, (uint8_t*)&dataApp,sizeof(dataApp),IDIER_NOPE);
|
|
/*
|
|
uint8_t ResponseLength = IDISN_FULL_LENGTH - IDISN_VARP_AES256_Length + 2;
|
|
uint8_t Response[ResponseLength];
|
|
Response[IDISTATUS_B0S_Pos] = (uint8_t) (
|
|
((uint8_t)IDIBUS_MODULE->STATUS.STATE.B0S.StError << IDISTATUS_B0S_ST_ERROR_Pos) |
|
|
((uint8_t)IDIBUS_MODULE->STATUS.STATE.B0S.StState << IDISTATUS_B0S_ST_STATE_Pos) |
|
|
((uint8_t)IDIBUS_MODULE->STATUS.STATE.B0S.AesSupported << IDISTATUS_B0S_AES_SUPPORTED_Pos) |
|
|
((uint8_t)IDIBUS_MODULE->STATUS.STATE.B0S.AesInstalled << IDISTATUS_B0S_AES_INSTALLED_Pos) |
|
|
((uint8_t)IDIBUS_MODULE->STATUS.STATE.B0S.SendAlarmL0 << IDISTATUS_B0S_SEND_ALARM_L0_Pos) |
|
|
((uint8_t)IDIBUS_MODULE->STATUS.STATE.B0S.SendAlarmL1 << IDISTATUS_B0S_SEND_ALARM_L1_Pos) |
|
|
((uint8_t)IDIBUS_MODULE->STATUS.STATE.B0S.StState << IDISTATUS_B0S_ST_STATE_Pos) );
|
|
Response[IDISTATUS_B1S_Pos] = (uint8_t) (
|
|
((uint8_t)IDIBUS_MODULE->STATUS.STATE.B1S.ModuleType << IDISTATUS_B1S_MODULE_TYPE_Pos) |
|
|
((uint8_t)IDIBUS_MODULE->STATUS.STATE.B1S.BridgeConnected << IDISTATUS_B1S_BRIDGE_CONNECTED_Pos ) |
|
|
((uint8_t)IDIBUS_MODULE->STATUS.STATE.B1S.SelfInit << IDISTATUS_B1S_SELF_INIT_Pos ) |
|
|
((uint8_t)IDIBUS_MODULE->STATUS.STATE.B1S.TimeoutLed << IDISTATUS_B1S_TIMEOUT_LED_Pos ) |
|
|
((uint8_t)IDIBUS_MODULE->STATUS.STATE.B1S.NoMMESTimeout << IDISTATUS_B1S_NO_MMES_TIMEOUT_Pos ) |
|
|
((uint8_t)IDIBUS_MODULE->STATUS.STATE.B1S.CatchAlarmL0 << IDISTATUS_B1S_CATCH_ALARM_L0_Pos ) |
|
|
((uint8_t)IDIBUS_MODULE->STATUS.STATE.B1S.CatchAlarmL1 << IDISTATUS_B1S_CATCH_ALARM_L1_Pos ) );
|
|
for (uint8_t pos=0; pos < IDISN_FIXP_LENGTH; pos++)
|
|
{
|
|
Response[IDISTATUS_SN_Pos+pos] = flash_read_byte((uint_farptr_t)IDIBUS_MODULE->STATUS.SNfix,IDISN_FIXP_Pos+pos);
|
|
}
|
|
for (uint8_t pos=0; pos < IDISN_VARP_LENGTH-IDISN_VARP_AES256_Length; pos++)
|
|
{
|
|
Response[IDISTATUS_SN_Pos+IDISN_FIXP_LENGTH+pos] = eeprom_read_byte(&IDIBUS_MODULE->STATUS.SNvar[pos]);
|
|
}
|
|
IDIBUS_ResponseProtectedWrite(farg, Response, ResponseLength, IDIER_NOPE);
|
|
*/
|
|
}
|
|
break;
|
|
}
|
|
|
|
case (IDIMMES_COM_C_CheckModuleLongOp) :
|
|
{
|
|
if ( farg->InpDataLength != 0 )
|
|
{
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIERSLV_INVALID_RX_REQUEST_FORMAT);
|
|
}
|
|
else
|
|
{
|
|
uint8_t Response[IDILONGOP_MES_DATA_LENGTH];
|
|
Response[IDILONGOP_STATE_Pos] = IDIBUS_MODULE->LONG_OP.State;
|
|
uint32_t Countdown;
|
|
if ( IDIBUS_MODULE->LONG_OP.State == IDILONGOP_STATE_IN_PROC )
|
|
{
|
|
uint32_t TimeFromStart = System_GetSysTickDifference(IDIBUS_MODULE->LONG_OP.StartTimeInstanceMS);
|
|
if ( IDIBUS_MODULE->LONG_OP.DurationMS > TimeFromStart )
|
|
{
|
|
Countdown = IDIBUS_MODULE->LONG_OP.DurationMS - TimeFromStart;
|
|
}
|
|
else
|
|
{
|
|
Countdown = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Countdown = 0;
|
|
}
|
|
Response[IDILONGOP_REMAIN_TIME_Pos] = (uint8_t)(Countdown >> 24);
|
|
Response[IDILONGOP_REMAIN_TIME_Pos + 1] = (uint8_t)(Countdown >> 16);
|
|
Response[IDILONGOP_REMAIN_TIME_Pos + 2] = (uint8_t)(Countdown >> 8);
|
|
Response[IDILONGOP_REMAIN_TIME_Pos + 3] = (uint8_t)(Countdown);
|
|
IDIBUS_ResponseProtectedWrite(farg, Response, IDILONGOP_MES_DATA_LENGTH, IDIER_NOPE);
|
|
}
|
|
break;
|
|
}
|
|
|
|
case (IDIMMES_COM_C_SendTimeDate) :
|
|
{
|
|
if ( farg->InpDataLength != IDIMMES_C_DATETIME_LENGTH )
|
|
{
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIERSLV_INVALID_RX_REQUEST_FORMAT);
|
|
}
|
|
else
|
|
{
|
|
if (
|
|
( farg->InpData[IDIMMES_C_DATETIME_TIME_Pos + IDITIME_FORMAT_SECONDS_Pos] > 60U ) ||
|
|
( farg->InpData[IDIMMES_C_DATETIME_TIME_Pos + IDITIME_FORMAT_MINUTES_Pos] > 60U ) ||
|
|
( farg->InpData[IDIMMES_C_DATETIME_TIME_Pos + IDITIME_FORMAT_HOURS_Pos] > 23U ) ||
|
|
( (int8_t)farg->InpData[IDIMMES_C_DATETIME_TIME_Pos + IDITIME_FORMAT_TIMEZONE_Pos] > IDITIME_FORMAT_TIMEZONE_MAX ) ||
|
|
( (int8_t)farg->InpData[IDIMMES_C_DATETIME_TIME_Pos + IDITIME_FORMAT_TIMEZONE_Pos] < IDITIME_FORMAT_TIMEZONE_MIN ) ||
|
|
( farg->InpData[IDIMMES_C_DATETIME_DATE_Pos + IDIDATE_FORMAT_DAY_Pos] > 31 ) ||
|
|
( farg->InpData[IDIMMES_C_DATETIME_DATE_Pos + IDIDATE_FORMAT_DAY_Pos] == 0 ) ||
|
|
( farg->InpData[IDIMMES_C_DATETIME_DATE_Pos + IDIDATE_FORMAT_MONTH_Pos] > 31 ) ||
|
|
( farg->InpData[IDIMMES_C_DATETIME_DATE_Pos + IDIDATE_FORMAT_MONTH_Pos] == 0 ) ||
|
|
( farg->InpData[IDIMMES_C_DATETIME_DATE_Pos + IDIDATE_FORMAT_CENTURY_Pos] > 99 ) ||
|
|
( farg->InpData[IDIMMES_C_DATETIME_DATE_Pos + IDIDATE_FORMAT_YEAR99_Pos] > 99 )
|
|
)
|
|
{
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIERSLV_INVALID_RX_PARAM);
|
|
}
|
|
else
|
|
{
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIER_NOPE);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
// LONG OPERATION FUNCS -------------------------------------------------------------->
|
|
case (IDIMMES_COM_C_WriteSnIPv4IPv6) :
|
|
{
|
|
if ( farg->InpDataLength != (IDISN_VARP_IPv4_Length + IDISN_VARP_IPv6_Length) )
|
|
{
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIERSLV_INVALID_RX_REQUEST_FORMAT);
|
|
}
|
|
else
|
|
{
|
|
memcpy(&EEPROM_BUF, farg->InpData, farg->InpDataLength);
|
|
IDIBUS_MODULE->LONG_OP.Type = IDIBUS_LONGOP_VARSN_IP_WRITE;
|
|
IDIBUS_MODULE->LONG_OP.Switch = 0;
|
|
IDIBUS_MODULE->LONG_OP.State = IDILONGOP_STATE_IN_PROC;
|
|
IDIBUS_MODULE->LONG_OP.StartTimeInstanceMS = System_GetTimeInstance();
|
|
IDIBUS_MODULE->LONG_OP.DurationMS = IDIBUS_LONGOP_VARSN_IP_WRITE_DURATION_MS;
|
|
farg->LongOpState = 1;
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIER_NOPE);
|
|
}
|
|
break;
|
|
}
|
|
|
|
case (IDIMMES_COM_C_WriteSnVerifyDates) :
|
|
{
|
|
if ( farg->InpDataLength != (IDIDATE_FORMAT_LENGTH * 2) )
|
|
{
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIERSLV_INVALID_RX_REQUEST_FORMAT);
|
|
}
|
|
else if (
|
|
(farg->InpData[IDIDATE_FORMAT_DAY_Pos] == 0)||(farg->InpData[IDIDATE_FORMAT_DAY_Pos] > 31) ||
|
|
(farg->InpData[IDIDATE_FORMAT_MONTH_Pos] == 0 )||(farg->InpData[IDIDATE_FORMAT_MONTH_Pos] > 12) ||
|
|
(farg->InpData[IDIDATE_FORMAT_CENTURY_Pos] > 99 ) ||
|
|
(farg->InpData[IDIDATE_FORMAT_YEAR99_Pos] > 99) ||
|
|
(farg->InpData[IDIDATE_FORMAT_DAY_Pos+IDIDATE_FORMAT_LENGTH] == 0)||(farg->InpData[IDIDATE_FORMAT_DAY_Pos+IDIDATE_FORMAT_LENGTH] > 31) ||
|
|
(farg->InpData[IDIDATE_FORMAT_MONTH_Pos+IDIDATE_FORMAT_LENGTH] == 0 )||(farg->InpData[IDIDATE_FORMAT_MONTH_Pos+IDIDATE_FORMAT_LENGTH] > 12) ||
|
|
(farg->InpData[IDIDATE_FORMAT_CENTURY_Pos+IDIDATE_FORMAT_LENGTH] > 99 ) ||
|
|
(farg->InpData[IDIDATE_FORMAT_YEAR99_Pos+IDIDATE_FORMAT_LENGTH] > 99)
|
|
)
|
|
{
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIERSLV_INVALID_RX_PARAM);
|
|
}
|
|
else
|
|
{
|
|
//memcpy(&EEPROM_BUF, farg->InpData, (IDIDATE_FORMAT_LENGTH * 2));
|
|
memcpy(&EEPROM_BUF, farg->InpData, farg->InpDataLength);
|
|
IDIBUS_MODULE->LONG_OP.Type = IDIBUS_LONGOP_VARSN_VERIF_EXP_WRITE;
|
|
IDIBUS_MODULE->LONG_OP.Switch = 0;
|
|
IDIBUS_MODULE->LONG_OP.State = IDILONGOP_STATE_IN_PROC;
|
|
IDIBUS_MODULE->LONG_OP.StartTimeInstanceMS = System_GetTimeInstance();
|
|
IDIBUS_MODULE->LONG_OP.DurationMS = IDIBUS_LONGOP_VARSN_VERF_EXP_WRITE_DURATION_MS;
|
|
farg->LongOpState = 1;
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIER_NOPE);
|
|
}
|
|
break;
|
|
}
|
|
|
|
case (IDIMMES_COM_C_WriteSnAES256) :
|
|
{
|
|
if ( farg->InpDataLength != IDISN_VARP_AES256_Length )
|
|
{
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIERSLV_INVALID_RX_REQUEST_FORMAT);
|
|
}
|
|
else
|
|
{
|
|
//!!!memcpy(&IDIBUS_MODULE->STATUS.SN[IDISN_VARP_AES256_Pos], farg->InpData, farg->InpDataLength);
|
|
memcpy(&EEPROM_BUF, farg->InpData, farg->InpDataLength);
|
|
IDIBUS_MODULE->LONG_OP.Type = IDIBUS_LONGOP_VARSN_AES_WRITE;
|
|
IDIBUS_MODULE->LONG_OP.Switch = 0;
|
|
IDIBUS_MODULE->LONG_OP.State = IDILONGOP_STATE_IN_PROC;
|
|
IDIBUS_MODULE->LONG_OP.StartTimeInstanceMS = System_GetTimeInstance();
|
|
IDIBUS_MODULE->LONG_OP.DurationMS = IDIBUS_LONGOP_VARSN_AES_WRITE_DURATION_MS;
|
|
farg->LongOpState = 1;
|
|
IDIBUS_MODULE->STATUS.STATE.B0S.AesInstalled = 0;
|
|
for ( uint8_t I = 0; I < IDISN_VARP_AES256_Length; I++ )
|
|
{
|
|
if ( /*IDIBUS_MODULE->STATUS.SN[IDISN_VARP_AES256_Pos + I] != 0 */ 0 /* TODO */ )
|
|
{
|
|
IDIBUS_MODULE->STATUS.STATE.B0S.AesInstalled = 1;
|
|
break;
|
|
}
|
|
}
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIER_NOPE);
|
|
}
|
|
break;
|
|
}
|
|
case (IDIMMES_COM_C_EnterBootloader) :
|
|
{
|
|
const uint8_t packageSize = IDISN_FIXP_MODULE_TYPE_Length+IDISN_FIXP_HW_REV_Length+IDISN_FIXP_SERIAL_Length;
|
|
if ( farg->InpDataLength != packageSize)
|
|
{
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIERSLV_INVALID_RX_REQUEST_FORMAT);
|
|
}
|
|
else
|
|
{
|
|
uint8_t Check = 1;
|
|
/*
|
|
FLASH_DATABLOCK dataApp;
|
|
readDeviceData(&dataApp, locationInApp);
|
|
uint8_t* ptr = farg->InpData;
|
|
for (uint8_t i = 0;sizeof(dataApp.ModuleType);i++)
|
|
{
|
|
if(*ptr!=dataApp.ModuleType[i]) Check = 0;
|
|
ptr++;
|
|
}
|
|
for (uint8_t i = 0;sizeof(dataApp.HW_revision);i++)
|
|
{
|
|
if(*ptr!=dataApp.HW_revision[i]) Check = 0;
|
|
ptr++;
|
|
}
|
|
for (uint8_t i = 0;sizeof(dataApp.SN);i++)
|
|
{
|
|
if(*ptr!=dataApp.SN[i]) Check = 0;
|
|
ptr++;
|
|
}
|
|
*/
|
|
PORTC = 0;
|
|
/*
|
|
for (uint8_t pos=0; pos < packageSize; pos++)
|
|
{
|
|
if (farg->InpData[pos] != flash_read_byte(IDIBUS_MODULE->STATUS.SNfix,IDISN_FIXP_MODULE_TYPE_Pos+pos))
|
|
Check = 0;
|
|
}
|
|
*/
|
|
|
|
if (Check == 1)
|
|
{
|
|
//IDIBUS_MODULE->LONG_OP.Type = IDIBUS_LONGOP_INIT;
|
|
eeprom_busy_wait();
|
|
eeprom_write_byte(&EEBLOCK.BOOTFLAG, 0x21); //Magic BYTE???!?!??!
|
|
eeprom_busy_wait();
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIER_NOPE);
|
|
RSLink_SendSMES(farg);
|
|
while(IDIBUS_MODULE->USI->IsTxActive()) wdt_reset();
|
|
System_SWReboot();
|
|
}
|
|
else
|
|
{
|
|
IDIBUS_ResponseProtectedWrite(farg,NULL,0,IDIERSLV_INVALID_RX_PARAM);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
|
|
|
|
default :
|
|
{
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIERSLV_UNSUPPORTED_FUNC_NUM);
|
|
}
|
|
}
|
|
}
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
void IDIBUS_ChannelBackgroundHandler (void)
|
|
{
|
|
|
|
// Error Handler ------------------------>
|
|
for ( uint8_t Dev=0; Dev < IDIBUS_MODULE->DevicesCount; Dev++ )
|
|
{
|
|
for ( uint8_t Ch=0; Ch<IDIBUS_MODULE->Devices[Dev].ChannelsCount; Ch++ )
|
|
{
|
|
idibus_channel_t *CH = &IDIBUS_MODULE->Devices[Dev].Channels[Ch];
|
|
if ( CH->LONG_OP.State == IDILONGOP_STATE_IN_PROC )
|
|
{
|
|
if ( System_GetSysTickDifference(CH->LONG_OP.StartTimeInstanceMS) > CH->LONG_OP.DurationMS )
|
|
{
|
|
// Long Operation terminate function
|
|
CH->LONG_OP.State = IDILONGOP_STATE_COMPLETE_WITH_ERR;
|
|
CH->LONG_OP.Type = IDIBUS_LONGOP_NOPE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
uint8_t IDIBUS_CnannelStaticFunc(struct IDIBUS_CHANNEL_STR* CH, idibus_farg_t *farg)
|
|
{
|
|
if ( CH->LONG_OP.State == IDILONGOP_STATE_IN_PROC )
|
|
{
|
|
farg->LongOpState = 1;
|
|
if ( farg->ComFunc != IDIMMES_COM_C_CheckChannelLongOp )
|
|
{
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIERDEV_LONG_OP_IN_PROC);
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
if ( farg->ComFunc < IDIMMES_COM_START_NUM )
|
|
{
|
|
return 0; // If Not channel command
|
|
}
|
|
|
|
switch (farg->ComFunc)
|
|
{
|
|
case (IDIMMES_COM_C_Dummy) :
|
|
{
|
|
if ( farg->InpDataLength != 0 )
|
|
{
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIERSLV_INVALID_RX_REQUEST_FORMAT);
|
|
}
|
|
else
|
|
{
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIER_NOPE);
|
|
}
|
|
break;
|
|
}
|
|
|
|
case (IDIMMES_COM_C_AssignGroup) :
|
|
{
|
|
if ( (farg->InpDataLength != 1) || (farg->InpData[0] > IDIBUS_GROUP_LAST_NUMBER) )
|
|
{
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIERSLV_INVALID_RX_REQUEST_FORMAT);
|
|
}
|
|
else
|
|
{
|
|
CH->BcastAddr = (uint8_t)( farg->InpData[0] + IDIBUS_GROUP_0_ADDR );
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIER_NOPE);
|
|
}
|
|
break;
|
|
}
|
|
|
|
case (IDIMMES_COM_C_CheckChannelLongOp) :
|
|
{
|
|
if ( farg->InpDataLength != 0 )
|
|
{
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIERSLV_INVALID_RX_REQUEST_FORMAT);
|
|
}
|
|
else
|
|
{
|
|
uint8_t Response[IDILONGOP_MES_DATA_LENGTH];
|
|
Response[IDILONGOP_STATE_Pos] = CH->LONG_OP.State;
|
|
uint32_t Countdown;
|
|
if ( CH->LONG_OP.State == IDILONGOP_STATE_IN_PROC )
|
|
{
|
|
uint32_t TimeFromStart = System_GetSysTickDifference( CH->LONG_OP.StartTimeInstanceMS );
|
|
if ( CH->LONG_OP.DurationMS > TimeFromStart )
|
|
{
|
|
Countdown = CH->LONG_OP.DurationMS - TimeFromStart;
|
|
}
|
|
else
|
|
{
|
|
Countdown = 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
Countdown = 0;
|
|
}
|
|
Response[IDILONGOP_REMAIN_TIME_Pos] = (uint8_t)(Countdown >> 24);
|
|
Response[IDILONGOP_REMAIN_TIME_Pos + 1] = (uint8_t)(Countdown >> 16);
|
|
Response[IDILONGOP_REMAIN_TIME_Pos + 2] = (uint8_t)(Countdown >> 8);
|
|
Response[IDILONGOP_REMAIN_TIME_Pos + 3] = (uint8_t)(Countdown);
|
|
IDIBUS_ResponseProtectedWrite(farg, Response, IDILONGOP_MES_DATA_LENGTH, IDIER_NOPE);
|
|
}
|
|
break;
|
|
}
|
|
|
|
default :
|
|
{
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIERSLV_UNSUPPORTED_FUNC_NUM);
|
|
}
|
|
}
|
|
return 1;
|
|
}
|
|
//=============================================================================================================================================================================================================
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
//=============================================================================================================================================================================================================
|
|
void IDIBUS_ResponseProtectedWrite(idibus_farg_t *farg, uint8_t *Data, uint16_t DataLength, uint8_t ErrorCode)
|
|
{
|
|
if (farg->OutData != NULL)
|
|
{
|
|
if ( ErrorCode != IDIER_NOPE )
|
|
{
|
|
IDIBUS_MODULE->STATUS.STATE.B0S.StError = 1;
|
|
farg->ErrorState = 1;
|
|
}
|
|
else
|
|
{
|
|
IDIBUS_MODULE->STATUS.STATE.B0S.StError = 0;
|
|
}
|
|
farg->OutData[farg->ErrorPos] = ErrorCode;
|
|
farg->ErrorPos = (uint16_t)(farg->ErrorPos + 1);
|
|
farg->OutDataLength = (uint16_t)(farg->OutDataLength + 1);
|
|
|
|
if ( (DataLength != 0) && (Data != NULL) )
|
|
{
|
|
memcpy(&farg->OutData[farg->OutDataPos], Data, DataLength);
|
|
farg->OutDataPos = (uint16_t)( farg->OutDataPos + DataLength );
|
|
farg->OutDataLength = (uint16_t)(farg->OutDataLength + DataLength);
|
|
}
|
|
}
|
|
}
|
|
//=============================================================================================================================================================================================================
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
//=============================================================================================================================================================================================================
|
|
void IDIBUS_ServiceFunc (uint8_t *InpData, uint16_t InpDataLength, uint8_t *OutData, uint16_t *OutDataLength)
|
|
{
|
|
|
|
}
|
|
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//#############################################################################################################################################################################################################
|