@@ -28,6 +28,17 @@ var utilitiesModule = {
28
28
* @property {Array } channelData The extracted channel data
29
29
* @property {Buffer } rawDataPacket The raw data packet
30
30
*/
31
+ /**
32
+ * @typedef {Object } RawDataToSample
33
+ * @property {Array } rawDataPackets - An array of rawDataPackets
34
+ * @property {Buffer } rawDataPacket - A single raw data packet
35
+ * @property {Array } channelSettings - The channel settings array
36
+ * @property {Number } timeOffset (optional) for non time stamp use cases i.e. 0xC0 or 0xC1 (default and raw aux)
37
+ * @property {Array } accelArray (optional) for non time stamp use cases
38
+ * @property {Boolean } verbose (optional) for verbose output
39
+ * @property {Number } lastSampleNumber (optional) - The last sample number
40
+ * @property {Boolean } scale (optional) Default `true`. A gain of 24 for Cyton will be used and 51 for ganglion by default.
41
+ */
31
42
/**
32
43
* @description Used to extract samples out of a buffer of unknown length
33
44
* @param dataBuffer {Buffer} - A buffer to parse for samples
@@ -107,6 +118,7 @@ var utilitiesModule = {
107
118
} ;
108
119
} ,
109
120
121
+ transformRawDataPacketToSample,
110
122
transformRawDataPacketsToSample,
111
123
getRawPacketType,
112
124
getFromTimePacketAccel,
@@ -879,71 +891,71 @@ function newSyncObject () {
879
891
880
892
/**
881
893
* @description Used transform raw data packets into fully qualified packets
882
- * @param o {Object}
883
- * @param o.rawDataPackets {Array} - An array of rawDataPackets
884
- * @param o.channelSettings {Array}
885
- * @param o.timeOffset {Number} (optional) for non time stamp use cases i.e. 0xC0 or 0xC1 (default and raw aux)
886
- * @param o.accelArray {Array} (optional) for non time stamp use cases
887
- * @param o.verbose {Boolean} (optional) for verbose output
888
- * @param o.scale {Boolean} (optional) Default `true`. A gain of 24 for Cyton will be used and 51 for ganglion by default.
894
+ * @param o {RawDataToSample} - Used to hold data and configuration settings
889
895
* @return {Array } samples An array of {Sample}
890
896
* @author AJ Keller (@pushtheworldllc)
891
897
*/
892
898
function transformRawDataPacketsToSample ( o ) {
893
899
let samples = [ ] ;
894
900
for ( let i = 0 ; i < o . rawDataPackets . length ; i ++ ) {
895
- const rawDataPacket = o . rawDataPackets [ i ] ;
896
- const packetType = getRawPacketType ( rawDataPacket [ k . OBCIPacketPositionStopByte ] ) ;
897
- let sample ;
898
- try {
899
- switch ( packetType ) {
900
- case k . OBCIStreamPacketStandardAccel :
901
- sample = utilitiesModule . parsePacketStandardAccel ( {
902
- rawDataPacket,
903
- channelSettings : o . channelSettings ,
904
- scale : o . scale
905
- } ) ;
906
- break ;
907
- case k . OBCIStreamPacketStandardRawAux :
908
- sample = utilitiesModule . parsePacketStandardRawAux ( {
909
- rawDataPacket,
910
- channelSettings : o . channelSettings ,
911
- scale : o . scale
912
- } ) ;
913
- break ;
914
- case k . OBCIStreamPacketAccelTimeSyncSet :
915
- case k . OBCIStreamPacketAccelTimeSynced :
916
- sample = utilitiesModule . parsePacketTimeSyncedAccel ( {
917
- rawDataPacket,
918
- channelSettings : o . channelSettings ,
919
- timeOffset : o . timeOffset ,
920
- accelArray : o . accelArray
921
- } ) ;
922
- break ;
923
- case k . OBCIStreamPacketRawAuxTimeSyncSet :
924
- case k . OBCIStreamPacketRawAuxTimeSynced :
925
- sample = utilitiesModule . parsePacketTimeSyncedRawAux ( {
926
- rawDataPacket,
927
- channelSettings : o . channelSettings ,
928
- timeOffset : o . timeOffset
929
- } ) ;
930
- break ;
931
- default :
932
- // Don't do anything if the packet is not defined
933
- break ;
934
- }
935
- samples . push ( sample ) ;
936
- } catch ( err ) {
937
- samples . push ( {
938
- rawDataPacket
939
- } ) ;
940
- if ( o . verbose ) console . log ( err ) ;
901
+ o . rawDataPacket = o . rawDataPackets [ i ] ;
902
+ const sample = transformRawDataPacketToSample ( o ) ;
903
+ samples . push ( sample ) ;
904
+ if ( sample . hasOwnProperty ( 'sampleNumber' ) ) {
905
+ o [ 'lastSampleNumber' ] = sample . sampleNumber ;
906
+ } else {
907
+ o [ 'lastSampleNumber' ] = o . rawDataPacket [ k . OBCIPacketPositionSampleNumber ] ;
941
908
}
942
909
}
943
-
944
910
return samples ;
945
911
}
946
912
913
+ /**
914
+ * @description Used transform raw data packets into fully qualified packets
915
+ * @param o {RawDataToSample} - Used to hold data and configuration settings
916
+ * @return {Array } samples An array of {Sample}
917
+ * @author AJ Keller (@pushtheworldllc)
918
+ */
919
+ function transformRawDataPacketToSample ( o ) {
920
+ let sample ;
921
+ try {
922
+ const packetType = getRawPacketType ( o . rawDataPacket [ k . OBCIPacketPositionStopByte ] ) ;
923
+ switch ( packetType ) {
924
+ case k . OBCIStreamPacketStandardAccel :
925
+ sample = utilitiesModule . parsePacketStandardAccel ( o ) ;
926
+ break ;
927
+ case k . OBCIStreamPacketStandardRawAux :
928
+ sample = utilitiesModule . parsePacketStandardRawAux ( o ) ;
929
+ break ;
930
+ case k . OBCIStreamPacketAccelTimeSyncSet :
931
+ case k . OBCIStreamPacketAccelTimeSynced :
932
+ sample = utilitiesModule . parsePacketTimeSyncedAccel ( o ) ;
933
+ break ;
934
+ case k . OBCIStreamPacketRawAuxTimeSyncSet :
935
+ case k . OBCIStreamPacketRawAuxTimeSynced :
936
+ sample = utilitiesModule . parsePacketTimeSyncedRawAux ( o ) ;
937
+ break ;
938
+ default :
939
+ // Don't do anything if the packet is not defined
940
+ sample = {
941
+ error : `bad stop byte ${ o . rawDataPacket . slice ( 32 , 33 ) . toString ( 'hex' ) } ` ,
942
+ valid : false ,
943
+ rawDataPacket : o . rawDataPacket
944
+ } ;
945
+ if ( o . verbose ) console . log ( sample . error ) ;
946
+ break ;
947
+ }
948
+ } catch ( err ) {
949
+ sample = {
950
+ error : err ,
951
+ valid : false ,
952
+ rawDataPacket : o . rawDataPacket
953
+ } ;
954
+ if ( o . verbose ) console . log ( err ) ;
955
+ }
956
+ return sample ;
957
+ }
958
+
947
959
/**
948
960
* @description This method parses a 33 byte OpenBCI V3 packet and converts to a sample object
949
961
* @param o {Object} - The input object
@@ -952,6 +964,7 @@ function transformRawDataPacketsToSample (o) {
952
964
* calling k.channelSettingsArrayInit(). The most important rule here is that it is
953
965
* Array of objects that have key-value pair {gain:NUMBER}
954
966
* @param o.scale {Boolean} - Do you want to scale the results? Default true
967
+ * @param o.lastSampleNumber {Number} - The last sample number
955
968
* @returns {Sample } - A sample object. NOTE: Only has accelData if this is a Z axis packet.
956
969
*/
957
970
function parsePacketStandardAccel ( o ) {
@@ -982,6 +995,8 @@ function parsePacketStandardAccel (o) {
982
995
// Get the stop byte
983
996
sampleObject . stopByte = o . rawDataPacket [ k . OBCIPacketPositionStopByte ] ;
984
997
998
+ sampleObject . valid = true ;
999
+
985
1000
return sampleObject ;
986
1001
}
987
1002
@@ -993,6 +1008,7 @@ function parsePacketStandardAccel (o) {
993
1008
* calling k.channelSettingsArrayInit(). The most important rule here is that it is
994
1009
* Array of objects that have key-value pair {gain:NUMBER}
995
1010
* @param o.scale {Boolean} - Do you want to scale the results? Default is true
1011
+ * @param o.lastSampleNumber {Number} - The last sample number
996
1012
* @returns {Sample } - A sample object. NOTE: Only has accelData if this is a Z axis packet.
997
1013
*/
998
1014
function parsePacketStandardRawAux ( o ) {
@@ -1024,6 +1040,8 @@ function parsePacketStandardRawAux (o) {
1024
1040
// Get the stop byte
1025
1041
sampleObject . stopByte = o . rawDataPacket [ k . OBCIPacketPositionStopByte ] ;
1026
1042
1043
+ sampleObject . valid = true ;
1044
+
1027
1045
return sampleObject ;
1028
1046
}
1029
1047
@@ -1078,6 +1096,8 @@ function parsePacketTimeSyncedAccel (o) {
1078
1096
if ( o . scale ) sampleObject . channelData = getChannelDataArray ( o ) ;
1079
1097
else sampleObject . channelDataCounts = getChannelDataArrayNoScale ( o . rawDataPacket ) ;
1080
1098
1099
+ sampleObject . valid = true ;
1100
+
1081
1101
return sampleObject ;
1082
1102
}
1083
1103
@@ -1125,6 +1145,8 @@ function parsePacketTimeSyncedRawAux (o) {
1125
1145
if ( o . scale ) sampleObject . channelData = getChannelDataArray ( o ) ;
1126
1146
else sampleObject . channelDataCounts = getChannelDataArrayNoScale ( o . rawDataPacket ) ;
1127
1147
1148
+ sampleObject . valid = true ;
1149
+
1128
1150
return sampleObject ;
1129
1151
}
1130
1152
0 commit comments