Refactor/mstp zero config state machine (#676)
* Changed MS/TP master node self destination checks to be located in receive FSM * Changed MSTP zero configuration: modified comments for state transition names; modified next station increment; refactored the UUID rand() to not be required by common zero config implementation; added more unit tests. * Added another context to MS/TP user data to allow additional user data
This commit is contained in:
+21
-17
@@ -44,7 +44,7 @@
|
||||
|
||||
/* MS/TP port */
|
||||
static struct mstp_port_struct_t MSTP_Port;
|
||||
static struct dlmstp_rs485_driver RS485_Driver = {
|
||||
static struct dlmstp_rs485_driver RS485_Driver = {
|
||||
.init = rs485_init,
|
||||
.send = rs485_bytes_send,
|
||||
.read = rs485_byte_available,
|
||||
@@ -52,7 +52,7 @@ static struct dlmstp_rs485_driver RS485_Driver = {
|
||||
.baud_rate = rs485_baud_rate,
|
||||
.baud_rate_set = rs485_baud_rate_set,
|
||||
.silence_milliseconds = rs485_silence_milliseconds,
|
||||
.silence_reset = rs485_silence_reset
|
||||
.silence_reset = rs485_silence_reset
|
||||
};
|
||||
static struct dlmstp_user_data_t MSTP_User_Data;
|
||||
static uint8_t Input_Buffer[DLMSTP_MPDU_MAX];
|
||||
@@ -90,6 +90,24 @@ int main(void)
|
||||
led_init();
|
||||
rs485_init();
|
||||
mstimer_set(&Blink_Timer, 500);
|
||||
/* FIXME: get the device ID from EEPROM */
|
||||
Device_Set_Object_Instance_Number(103);
|
||||
/* seed stdlib rand() with device-id to get pseudo consistent
|
||||
zero-config poll slot, or use hardware RNG to get a more random slot */
|
||||
#ifdef BACNET_ZERO_CONFIG_RNG_HARDWARE
|
||||
/* enable the random number generator hardware */
|
||||
RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG, ENABLE);
|
||||
RNG_Cmd(ENABLE);
|
||||
while (RNG_GetFlagStatus(RNG_FLAG_DRDY) == RESET) {
|
||||
/* wait for 32-bit random number to generate */
|
||||
}
|
||||
srand(RNG_GetRandomNumber());
|
||||
#else
|
||||
srand(Device_Object_Instance_Number());
|
||||
#endif
|
||||
/* initialize the Device UUID from rand() */
|
||||
Device_UUID_Init();
|
||||
Device_UUID_Get(MSTP_Port.UUID, sizeof(MSTP_Port.UUID));
|
||||
/* initialize MSTP datalink layer */
|
||||
MSTP_Port.Nmax_info_frames = DLMSTP_MAX_INFO_FRAMES;
|
||||
MSTP_Port.Nmax_master = DLMSTP_MAX_MASTER;
|
||||
@@ -104,6 +122,7 @@ int main(void)
|
||||
MSTP_Port.UserData = &MSTP_User_Data;
|
||||
dlmstp_init((char *)&MSTP_Port);
|
||||
if (MSTP_Port.ZeroConfigEnabled) {
|
||||
/* set node to monitor address */
|
||||
dlmstp_set_mac_address(255);
|
||||
} else {
|
||||
/* FIXME: get the address from hardware DIP or from EEPROM */
|
||||
@@ -113,21 +132,6 @@ int main(void)
|
||||
dlmstp_set_baud_rate(DLMSTP_BAUD_RATE_DEFAULT);
|
||||
/* initialize application layer*/
|
||||
bacnet_init();
|
||||
/* FIXME: get the device ID from EEPROM */
|
||||
Device_Set_Object_Instance_Number(103);
|
||||
/* seed stdlib rand() with device-id to get pweudo consisten
|
||||
zero-config poll slot, or use hardware RNG to get a more random slot */
|
||||
#ifdef BACNET_ZERO_CONFIG_RNG_HARDWARE
|
||||
/* enable the random number generator hardware */
|
||||
RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_RNG, ENABLE);
|
||||
RNG_Cmd(ENABLE);
|
||||
while (RNG_GetFlagStatus(RNG_FLAG_DRDY) == RESET) {
|
||||
/* wait for 32-bit random number to generate */
|
||||
}
|
||||
srand(RNG_GetRandomNumber());
|
||||
#else
|
||||
srand(Device_Object_Instance_Number());
|
||||
#endif
|
||||
for (;;) {
|
||||
if (mstimer_expired(&Blink_Timer)) {
|
||||
mstimer_reset(&Blink_Timer);
|
||||
|
||||
Reference in New Issue
Block a user