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.
221 lines
6.2 KiB
221 lines
6.2 KiB
//#############################################################################
|
|
// idibus_custom.h implementation
|
|
//#############################################################################
|
|
#include <stdint.h>
|
|
#include <stdbool.h>
|
|
|
|
#include "IdiBusSlave.h"
|
|
#include "idibus_hw.h"
|
|
|
|
#include "USART1.h"
|
|
#include "SYSTEM.h"
|
|
|
|
#include "IDIBUS_IMPL.h"
|
|
#include "RSLink.h"
|
|
#include "MEMORY.h"
|
|
|
|
// ÍÅ ÈÑÏÎËÜÇÓÉÒÅ ÎÁÙÈÅ ÏÅÐÅÌÅÍÍÛÅ ÄËß ÑÂßÇÈ ÊÎÌÏîÍÅÍÒΠÌÅÆÄÓ ÑÎÁÎÉ ÏÎÆÀË+ÉÑÒÀ
|
|
|
|
//=============================================================================
|
|
// IMPLEMENTATION SECTION
|
|
//=============================================================================
|
|
/*
|
|
* Define your specific logic for slave module
|
|
* Required:
|
|
* Init
|
|
* Shutdown
|
|
* And any other custom functions for your needs
|
|
*/
|
|
//Make prototypes for channel handlers
|
|
static void IDIBUS_XXX_NAME_ChannelHandler(idibus_channel_t* CH, idibus_farg_t* farg);
|
|
|
|
//Enumerate channels and assign functions to them
|
|
static idibus_channel_t IDIBUS_XXX_NAME_Channels[IDIBUS_XXX_NAME_CH_NUM] =
|
|
{
|
|
{
|
|
.ChNum = 0,
|
|
.CH_Func = IDIBUS_XXX_NAME_ChannelHandler,
|
|
},
|
|
{
|
|
.ChNum = 1,
|
|
.CH_Func = IDIBUS_XXX_NAME_ChannelHandler,
|
|
},
|
|
{
|
|
.ChNum = 2,
|
|
.CH_Func = IDIBUS_XXX_NAME_ChannelHandler,
|
|
},
|
|
{
|
|
.ChNum = 3,
|
|
.CH_Func = IDIBUS_XXX_NAME_ChannelHandler,
|
|
},
|
|
|
|
};
|
|
|
|
//List all devices and their channels
|
|
static idibus_device_t IDIBUS_Devices[XXX_NAME_DEVICES_NUMBER] =
|
|
{
|
|
{IDIBUS_XXX_NAME_Channels, IDIBUS_XXX_NAME_CH_NUM},
|
|
};
|
|
//Common module configuration
|
|
//Change on your own risk;
|
|
static idibus_slave_module_t IDIBUS_MODULE =
|
|
{
|
|
.Devices = IDIBUS_Devices,
|
|
.DevicesCount = XXX_NAME_DEVICES_NUMBER,
|
|
.STATUS.STATE.B0S.StError = 0,
|
|
.STATUS.STATE.B0S.StState = IDISTATUS_B0S_ST_STATE_StOperate,
|
|
.STATUS.STATE.B0S.AesSupported = 0,
|
|
.STATUS.STATE.B0S.AesInstalled = 0,
|
|
.STATUS.STATE.B0S.SendAlarmL0 = 0,
|
|
.STATUS.STATE.B0S.SendAlarmL1 = 0,
|
|
|
|
.STATUS.STATE.B1S.ModuleType = IDISTATUS_B1S_MODULE_TYPE_Slave,
|
|
.STATUS.STATE.B1S.BridgeConnected = 0,
|
|
.STATUS.STATE.B1S.SelfInit = 1,
|
|
.STATUS.STATE.B1S.TimeoutLed = 1,
|
|
.STATUS.STATE.B1S.NoMMESTimeout = 0,
|
|
.STATUS.STATE.B1S.CatchAlarmL0 = 0,
|
|
.STATUS.STATE.B1S.CatchAlarmL1 = 0,
|
|
};
|
|
#define IDIBUS_READ_VAR(farg, DATA){\
|
|
if (farg->InpDataLength != 0)\
|
|
{\
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIERSLV_INVALID_RX_REQUEST_FORMAT);\
|
|
}\
|
|
else\
|
|
{\
|
|
uint8_t ResponseData[sizeof(DATA)] = {0};\
|
|
memcpy(ResponseData, &DATA, sizeof(DATA));\
|
|
IDIBUS_ResponseProtectedWrite(farg, ResponseData, sizeof(ResponseData), IDIER_NOPE);\
|
|
}\
|
|
}
|
|
#define IDIBUS_WRITE_VAR(farg, DATA){\
|
|
if (farg->InpDataLength == sizeof(DATA))\
|
|
{\
|
|
memcpy(&DATA, farg->InpData, sizeof(DATA));\
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIER_NOPE);\
|
|
}\
|
|
else\
|
|
{\
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIERSLV_INVALID_RX_REQUEST_FORMAT);\
|
|
}\
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Channel Handler
|
|
// This sequence is for a single channel CH->ChNum
|
|
//-----------------------------------------------------------------------------
|
|
//memcpy(to, from, num);
|
|
static void IDIBUS_XXX_NAME_ChannelHandler(idibus_channel_t* CH, idibus_farg_t* farg)
|
|
{
|
|
//Check for msg and operations
|
|
if (IDIBUS_CnannelStaticFunc(CH, farg) != 0)
|
|
{
|
|
return;
|
|
}
|
|
//Catch channel error
|
|
if (CH->ChNum >= IDIBUS_XXX_NAME_CH_NUM)
|
|
{
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIERDEV_INVALID_CHN_NUM);
|
|
return;
|
|
}
|
|
/*
|
|
* After all checks proccess the command
|
|
* This sequence is for a single channel CH->ChNum
|
|
* Use farg->ComFunc to define command
|
|
* Use farg->InpData and farg->InpDataLength to read recieved data
|
|
* Two types of command is used READ and WRITE
|
|
* For ecxlusive actions write your own handler
|
|
*/
|
|
switch (farg->ComFunc)
|
|
{
|
|
case (XXX_NAME_STATUS_CMD):
|
|
{
|
|
IDIBUS_READ_VAR(farg, XXX_NAME_channels_data[CH->ChNum].status);
|
|
break;
|
|
}
|
|
case (XXX_NAME_GET_CMD):
|
|
{
|
|
IDIBUS_READ_VAR(farg, XXX_NAME_channels_data[CH->ChNum].ch_data);
|
|
break;
|
|
}
|
|
|
|
case (XXX_NAME_SET_CMD):
|
|
{
|
|
IDIBUS_WRITE_VAR(farg, XXX_NAME_channels_data[CH->ChNum].ch_data);
|
|
break;
|
|
}
|
|
default:
|
|
{
|
|
IDIBUS_ResponseProtectedWrite(farg, NULL, 0, IDIERSLV_UNSUPPORTED_FUNC_NUM);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Custom Initialization
|
|
//-----------------------------------------------------------------------------
|
|
static void IDIBUS_Init() //Idibus only init!
|
|
{
|
|
for (uint8_t dev = 0; dev < XXX_NAME_DEVICES_NUMBER; dev ++)
|
|
{
|
|
for (uint8_t I = 0; I < IDIBUS_MODULE.Devices[dev].ChannelsCount; I++)
|
|
{
|
|
IDIBUS_MODULE.Devices[dev].Channels[I].ChNum = I;
|
|
IDIBUS_MODULE.Devices[dev].Channels[I].LONG_OP.Type = 0;
|
|
IDIBUS_MODULE.Devices[dev].Channels[I].LONG_OP.State =
|
|
IDILONGOP_STATE_COMPLETE_NO_ERR;
|
|
IDIBUS_MODULE.Devices[dev].Channels[I].BcastAddr =
|
|
IDIBUS_GROUP_0_ADDR;
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// IdiBus Initialization
|
|
//-----------------------------------------------------------------------------
|
|
void IdiBusSlaveInit()
|
|
{
|
|
// Idibus dedicated hardware init
|
|
System_InitSysTick();
|
|
System_SystickTimerStart();
|
|
USART1_Init();
|
|
|
|
RSLink_StatusLedInit();
|
|
|
|
wdt_reset();
|
|
//Rslink hardware registration
|
|
rslink_func_pack_t rslink_hw =
|
|
{
|
|
.dips_init = RSLink_DipsInit,
|
|
.disp_read_addr = RSLink_AddrDecode,
|
|
.disp_read_speed = RSLink_SpeedDecode,
|
|
.status_led_init = RSLink_StatusLedInit,
|
|
.status_led_off = RSLink_StatusLedSetOff,
|
|
.status_led_on = RSLink_StatusLedSetOn,
|
|
};
|
|
//Register hardware and configuration
|
|
RSLink_register_hw_functions(rslink_hw);
|
|
IDIBUS_Init();
|
|
//Executes on c_Init
|
|
//IdiBus_register_init();
|
|
//Executes on c_Shutdown
|
|
//IdiBus_register_shutdown();
|
|
|
|
wdt_reset();
|
|
//Do a complete init of IdiBus
|
|
RSLlink_pass_module(&IDIBUS_MODULE);
|
|
IdiBus_pass_module(&IDIBUS_MODULE);
|
|
#ifdef _LONG_ADDR_SPACE_
|
|
IdiBus_ModuleInit(&USART1_INTERFACE, (uint_farptr_t)(locationInApp*2));
|
|
#else
|
|
IdiBus_ModuleInit(&USART1_INTERFACE, (uint8_t*)(locationInApp*2));
|
|
#endif
|
|
|
|
RSLink_Init(&USART1_INTERFACE, &USART1_IDIBUS);
|
|
wdt_reset();
|
|
}
|