Skip to content

Commit b218578

Browse files
committed
Fix SDO loopback transfer
1 parent 926ae3b commit b218578

File tree

3 files changed

+70
-52
lines changed

3 files changed

+70
-52
lines changed

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "canopen",
3-
"version": "2.8.1",
3+
"version": "2.8.2",
44
"description": "CANopen implementation for Javascript",
55
"main": "index.js",
66
"scripts": {

source/protocol/sdo.js

Lines changed: 68 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ const ClientCommand = {
5454
ABORT: 4,
5555
};
5656

57-
/**
57+
/**
5858
* CANopen SDO 'Server Command Specifier' codes.
5959
* @enum {number}
6060
* @see CiA301 'SDO protocols' (§7.2.4.3)
@@ -212,8 +212,10 @@ class Transfer {
212212

213213
/** Refresh the transfer timeout. */
214214
refresh() {
215-
if(this.timeout)
216-
this.timer.refresh();
215+
if(!this.timeout)
216+
return;
217+
218+
this.timer.refresh();
217219
}
218220

219221
/** Send a data buffer. */
@@ -488,12 +490,12 @@ class Sdo {
488490
sendBuffer.writeUInt16LE(index, 1);
489491
sendBuffer.writeUInt8(subIndex, 3);
490492

493+
this.transfers[server.cobIdRx].start();
494+
491495
this.device.send({
492496
id: server.cobIdTx,
493497
data: sendBuffer
494498
});
495-
496-
this.transfers[server.cobIdRx].start();
497499
})
498500
})
499501
.then((data) => {
@@ -584,12 +586,12 @@ class Sdo {
584586
data.copy(sendBuffer, 4);
585587
}
586588

589+
this.transfers[server.cobIdRx].start();
590+
587591
this.device.send({
588592
id: server.cobIdTx,
589593
data: sendBuffer
590594
});
591-
592-
this.transfers[server.cobIdRx].start();
593595
});
594596
});
595597
}
@@ -626,6 +628,9 @@ class Sdo {
626628
* @private
627629
*/
628630
_clientUploadSegment(transfer, data) {
631+
if(!transfer.active)
632+
return;
633+
629634
if((data[0] & 0x10) != (transfer.toggle << 4))
630635
return transfer.abort(AbortCode.TOGGLE_BIT);
631636

@@ -686,6 +691,9 @@ class Sdo {
686691
* @private
687692
*/
688693
_clientDownloadSegment(transfer, data) {
694+
if(!transfer.active)
695+
return;
696+
689697
if((data[0] & 0x10) != (transfer.toggle << 4))
690698
return transfer.abort(AbortCode.TOGGLE_BIT);
691699

@@ -714,6 +722,29 @@ class Sdo {
714722
transfer.refresh();
715723
}
716724

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+
717748
/**
718749
* Handle CCS.DOWNLOAD_INITIATE.
719750
* @param {Transfer} client - SDO context.
@@ -881,7 +912,7 @@ class Sdo {
881912
data: sendBuffer,
882913
});
883914

884-
client.refresh();;
915+
client.refresh();
885916
}
886917

887918
/**
@@ -945,6 +976,29 @@ class Sdo {
945976
client.refresh();
946977
}
947978

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+
9481002
/**
9491003
* Called when a new CAN message is received.
9501004
* @param {Object} message - CAN frame.
@@ -953,52 +1007,16 @@ class Sdo {
9531007
_onMessage(message) {
9541008
// Handle transfers as a client (remote object dictionary)
9551009
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;
9771013
}
9781014

9791015
// Handle transfers as a server (local object dictionary)
9801016
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;
10021020
}
10031021
}
10041022
}

0 commit comments

Comments
 (0)