@@ -1606,53 +1606,59 @@ static inline void vscp_core_handleProtocolDropNicknameId(void)
16061606 vscp_core_changeToStateReset (0 );
16071607 }
16081608 /* Additional flags received? */
1609- else if (2 <= vscp_core_rxMessage .dataNum )
1609+ else if ((2 == vscp_core_rxMessage .dataNum ) ||
1610+ (3 == vscp_core_rxMessage .dataNum ))
16101611 {
1611- /* Clear the nickname? */
1612- if (0 == (vscp_core_rxMessage .data [1 ] & 0x20 ))
1612+ uint8_t waitTime = 0 ;
1613+
1614+ /* Wait time received? */
1615+ if (3 == vscp_core_rxMessage .dataNum )
16131616 {
1614- vscp_core_writeNicknameId ( VSCP_NICKNAME_NOT_INIT ) ;
1617+ waitTime = vscp_core_rxMessage . data [ 2 ] ;
16151618 }
1616-
1617- /* Set persistent memory to default? */
1618- if (0 != (vscp_core_rxMessage .data [1 ] & 0x40 ))
1619+
1620+ /* Byte 1:
1621+ * Bit 5 - Reset device. Keep nickname.
1622+ * Bit 6 - Set persistent storage to default.
1623+ * Bit 7 - Go idle. Do not start up again.
1624+ */
1625+
1626+ /* Set persistent memory to default (bit 6)? */
1627+ if (0 != (vscp_core_rxMessage .data [1 ] & (1 << 6 )))
16191628 {
1620- /* Backup nickname */
1629+ /* Backup nickname, because restore factory settings will clear it. */
16211630 uint8_t nicknameBackup = vscp_core_nickname ;
16221631
16231632 /* Set defaults to persistent memory. */
16241633 vscp_core_restoreFactoryDefaultSettings ();
16251634
1626- /* Keep nickname? */
1627- if (0 != (vscp_core_rxMessage .data [1 ] & 0x20 ))
1635+ /* Restore nickname? */
1636+ if (0 != (vscp_core_rxMessage .data [1 ] & ( 1 << 5 ) ))
16281637 {
16291638 /* Restore nickname */
16301639 vscp_core_writeNicknameId (nicknameBackup );
16311640 }
16321641 }
16331642
1634- /* Reset device?
1643+ /* Reset device (bit 5) ?
16351644 * Note that "reset device" has a higher priority than "go idle".
16361645 * There is no exact description in the specification yet.
16371646 */
1638- if ((0 != (vscp_core_rxMessage .data [1 ] & 0x20 )) ||
1639- (0 == (vscp_core_rxMessage .data [1 ] & 0x80 )))
1647+ if (0 != (vscp_core_rxMessage .data [1 ] & (1 << 5 )))
16401648 {
1641- /* Wait time received? */
1642- if (3 == vscp_core_rxMessage .dataNum )
1643- {
1644- vscp_core_changeToStateReset (vscp_core_rxMessage .data [2 ]);
1645- }
1646- else
1647- {
1648- vscp_core_changeToStateReset (0 );
1649- }
1649+ vscp_core_changeToStateReset (waitTime );
16501650 }
1651- /* Change to idle state? */
1652- else if (0 != (vscp_core_rxMessage .data [1 ] & 0x80 ))
1651+ /* Change to idle state (bit 7) ? */
1652+ else if (0 != (vscp_core_rxMessage .data [1 ] & ( 1 << 7 ) ))
16531653 {
1654+ vscp_core_writeNicknameId (VSCP_NICKNAME_NOT_INIT );
16541655 vscp_core_changeToStateIdle ();
16551656 }
1657+ else
1658+ {
1659+ vscp_core_writeNicknameId (VSCP_NICKNAME_NOT_INIT );
1660+ vscp_core_changeToStateReset (waitTime );
1661+ }
16561662 }
16571663 }
16581664 }
0 commit comments