@@ -54,7 +54,7 @@ const ClientCommand = {
54
54
ABORT : 4 ,
55
55
} ;
56
56
57
- /**
57
+ /**
58
58
* CANopen SDO 'Server Command Specifier' codes.
59
59
* @enum {number}
60
60
* @see CiA301 'SDO protocols' (§7.2.4.3)
@@ -212,8 +212,10 @@ class Transfer {
212
212
213
213
/** Refresh the transfer timeout. */
214
214
refresh ( ) {
215
- if ( this . timeout )
216
- this . timer . refresh ( ) ;
215
+ if ( ! this . timeout )
216
+ return ;
217
+
218
+ this . timer . refresh ( ) ;
217
219
}
218
220
219
221
/** Send a data buffer. */
@@ -488,12 +490,12 @@ class Sdo {
488
490
sendBuffer . writeUInt16LE ( index , 1 ) ;
489
491
sendBuffer . writeUInt8 ( subIndex , 3 ) ;
490
492
493
+ this . transfers [ server . cobIdRx ] . start ( ) ;
494
+
491
495
this . device . send ( {
492
496
id : server . cobIdTx ,
493
497
data : sendBuffer
494
498
} ) ;
495
-
496
- this . transfers [ server . cobIdRx ] . start ( ) ;
497
499
} )
498
500
} )
499
501
. then ( ( data ) => {
@@ -584,12 +586,12 @@ class Sdo {
584
586
data . copy ( sendBuffer , 4 ) ;
585
587
}
586
588
589
+ this . transfers [ server . cobIdRx ] . start ( ) ;
590
+
587
591
this . device . send ( {
588
592
id : server . cobIdTx ,
589
593
data : sendBuffer
590
594
} ) ;
591
-
592
- this . transfers [ server . cobIdRx ] . start ( ) ;
593
595
} ) ;
594
596
} ) ;
595
597
}
@@ -626,6 +628,9 @@ class Sdo {
626
628
* @private
627
629
*/
628
630
_clientUploadSegment ( transfer , data ) {
631
+ if ( ! transfer . active )
632
+ return ;
633
+
629
634
if ( ( data [ 0 ] & 0x10 ) != ( transfer . toggle << 4 ) )
630
635
return transfer . abort ( AbortCode . TOGGLE_BIT ) ;
631
636
@@ -686,6 +691,9 @@ class Sdo {
686
691
* @private
687
692
*/
688
693
_clientDownloadSegment ( transfer , data ) {
694
+ if ( ! transfer . active )
695
+ return ;
696
+
689
697
if ( ( data [ 0 ] & 0x10 ) != ( transfer . toggle << 4 ) )
690
698
return transfer . abort ( AbortCode . TOGGLE_BIT ) ;
691
699
@@ -714,6 +722,29 @@ class Sdo {
714
722
transfer . refresh ( ) ;
715
723
}
716
724
725
+ _clientProcess ( transfer , message ) {
726
+ switch ( message . data [ 0 ] >> 5 ) {
727
+ case ServerCommand . UPLOAD_SEGMENT :
728
+ this . _clientUploadSegment ( transfer , message . data ) ;
729
+ break ;
730
+ case ServerCommand . DOWNLOAD_SEGMENT :
731
+ this . _clientDownloadSegment ( transfer , message . data ) ;
732
+ break ;
733
+ case ServerCommand . UPLOAD_INITIATE :
734
+ this . _clientUploadInitiate ( transfer , message . data ) ;
735
+ break ;
736
+ case ServerCommand . DOWNLOAD_INITIATE :
737
+ this . _clientDownloadInitiate ( transfer ) ;
738
+ break ;
739
+ case ServerCommand . ABORT :
740
+ transfer . abort ( message . data . readUInt32LE ( 4 ) ) ;
741
+ break ;
742
+ default :
743
+ transfer . abort ( AbortCode . BAD_COMMAND ) ;
744
+ break ;
745
+ }
746
+ }
747
+
717
748
/**
718
749
* Handle CCS.DOWNLOAD_INITIATE.
719
750
* @param {Transfer } client - SDO context.
@@ -881,7 +912,7 @@ class Sdo {
881
912
data : sendBuffer ,
882
913
} ) ;
883
914
884
- client . refresh ( ) ; ;
915
+ client . refresh ( ) ;
885
916
}
886
917
887
918
/**
@@ -945,6 +976,29 @@ class Sdo {
945
976
client . refresh ( ) ;
946
977
}
947
978
979
+ _serverProcess ( client , message ) {
980
+ switch ( message . data [ 0 ] >> 5 ) {
981
+ case ClientCommand . DOWNLOAD_SEGMENT :
982
+ this . _serverDownloadSegment ( client , message . data ) ;
983
+ break ;
984
+ case ClientCommand . DOWNLOAD_INITIATE :
985
+ this . _serverDownloadInitiate ( client , message . data ) ;
986
+ break ;
987
+ case ClientCommand . UPLOAD_INITIATE :
988
+ this . _serverUploadInitiate ( client , message . data ) ;
989
+ break ;
990
+ case ClientCommand . UPLOAD_SEGMENT :
991
+ this . _serverUploadSegment ( client , message . data ) ;
992
+ break ;
993
+ case ClientCommand . ABORT :
994
+ client . reject ( ) ;
995
+ break ;
996
+ default :
997
+ client . abort ( AbortCode . BAD_COMMAND ) ;
998
+ break ;
999
+ }
1000
+ }
1001
+
948
1002
/**
949
1003
* Called when a new CAN message is received.
950
1004
* @param {Object } message - CAN frame.
@@ -953,52 +1007,16 @@ class Sdo {
953
1007
_onMessage ( message ) {
954
1008
// Handle transfers as a client (remote object dictionary)
955
1009
const serverTransfer = this . transfers [ message . id ] ;
956
- if ( serverTransfer !== undefined && serverTransfer . active ) {
957
- switch ( message . data [ 0 ] >> 5 ) {
958
- case ServerCommand . ABORT :
959
- serverTransfer . abort ( message . data . readUInt32LE ( 4 ) ) ;
960
- break ;
961
- case ServerCommand . UPLOAD_INITIATE :
962
- this . _clientUploadInitiate ( serverTransfer , message . data ) ;
963
- break ;
964
- case ServerCommand . UPLOAD_SEGMENT :
965
- this . _clientUploadSegment ( serverTransfer , message . data ) ;
966
- break ;
967
- case ServerCommand . DOWNLOAD_INITIATE :
968
- this . _clientDownloadInitiate ( serverTransfer ) ;
969
- break ;
970
- case ServerCommand . DOWNLOAD_SEGMENT :
971
- this . _clientDownloadSegment ( serverTransfer , message . data ) ;
972
- break ;
973
- default :
974
- serverTransfer . abort ( AbortCode . BAD_COMMAND ) ;
975
- break ;
976
- }
1010
+ if ( serverTransfer !== undefined ) {
1011
+ this . _clientProcess ( serverTransfer , message ) ;
1012
+ return ;
977
1013
}
978
1014
979
1015
// Handle transfers as a server (local object dictionary)
980
1016
const client = this . clients [ message . id ] ;
981
- if ( client ) {
982
- switch ( message . data [ 0 ] >> 5 ) {
983
- case ClientCommand . ABORT :
984
- client . reject ( ) ;
985
- break ;
986
- case ClientCommand . DOWNLOAD_INITIATE :
987
- this . _serverDownloadInitiate ( client , message . data ) ;
988
- break ;
989
- case ClientCommand . UPLOAD_INITIATE :
990
- this . _serverUploadInitiate ( client , message . data ) ;
991
- break ;
992
- case ClientCommand . UPLOAD_SEGMENT :
993
- this . _serverUploadSegment ( client , message . data ) ;
994
- break ;
995
- case ClientCommand . DOWNLOAD_SEGMENT :
996
- this . _serverDownloadSegment ( client , message . data ) ;
997
- break ;
998
- default :
999
- client . abort ( AbortCode . BAD_COMMAND ) ;
1000
- break ;
1001
- }
1017
+ if ( client !== undefined ) {
1018
+ this . _serverProcess ( client , message ) ;
1019
+ return ;
1002
1020
}
1003
1021
}
1004
1022
}
0 commit comments