Skip to content

Commit e7e862d

Browse files
authored
Merge pull request #35 from REVrobotics/feature/list-dfu-image-elements
Add method to list DFU element info for an image
2 parents 60845fc + deb8c53 commit e7e862d

File tree

5 files changed

+63
-10
lines changed

5 files changed

+63
-10
lines changed

lib/binding.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
import {promisify} from "util";
22
import * as path from "path";
33

4+
export interface DfuImageElement {
5+
startAddress: number;
6+
size: number;
7+
}
8+
49
export interface CanMessage {
510
data: number[];
611
messageID: number;
@@ -59,7 +64,8 @@ export class CanBridge {
5964
initializeNotifier: () => void;
6065
waitForNotifierAlarm: (time:number) => Promise<number>;
6166
stopNotifier: () => void;
62-
writeDfuToBin: (dfuFileName:string, binFileName:string) => Promise<number>;
67+
writeDfuToBin: (dfuFileName:string, binFileName:string, elementIndex?: number) => Promise<number>;
68+
getImageElements: (dfuFileName: string, imageIndex: number) => DfuImageElement[];
6369
openHALStreamSession: (messageId: number, messageMask:number, numMessages:number) => number;
6470
readHALStreamSession: (streamHandle:number, numMessages:number) => CanMessage[];
6571
closeHALStreamSession: (streamHandle:number) => void;
@@ -87,7 +93,8 @@ export class CanBridge {
8793
this.initializeNotifier = addon.initializeNotifier;
8894
this.waitForNotifierAlarm = promisify(addon.waitForNotifierAlarm);
8995
this.stopNotifier = addon.stopNotifier;
90-
this.writeDfuToBin = promisify(addon.writeDfuToBin);
96+
this.writeDfuToBin = addon.writeDfuToBin;
97+
this.getImageElements = addon.getImageElements;
9198
this.openHALStreamSession = addon.openHALStreamSession;
9299
this.readHALStreamSession = addon.readHALStreamSession;
93100
this.closeHALStreamSession = addon.closeHALStreamSession;

src/DfuSeFile.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,15 @@ class DFUImage {
101101
const char* Name() { return m_prefix.Name; }
102102
int Size() { return m_prefix.Size; }
103103
const std::vector<DFUTarget>& Elements() const { return m_targets; }
104-
void Write(const std::string filename, writer::detail::FileWriter& writer) const {
104+
void Write(const std::string filename, const int elementIndex, writer::detail::FileWriter& writer) const {
105105
std::ofstream outputFile(filename, std::ofstream::binary);
106106
auto fw = writer.Clone();
107-
fw->Write(outputFile, m_targets[0]);
107+
108+
if(elementIndex >= m_targets.size()) {
109+
throw std::invalid_argument("Element index out of range");
110+
}
111+
112+
fw->Write(outputFile, m_targets[elementIndex]);
108113
outputFile.close();
109114
}
110115

src/addon.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@ Napi::Object Init(Napi::Env env, Napi::Object exports) {
3131
exports.Set(Napi::String::New(env, "stopNotifier"),
3232
Napi::Function::New(env, stopNotifier));
3333
exports.Set(Napi::String::New(env, "writeDfuToBin"),
34-
Napi::Function::New(env, writeDfuToBin));
34+
Napi::Function::New(env, writeDfuToBin));
35+
exports.Set(Napi::String::New(env, "getImageElements"),
36+
Napi::Function::New(env, getImageElements));
3537
exports.Set(Napi::String::New(env, "openHALStreamSession"),
3638
Napi::Function::New(env, openHALStreamSession));
3739
exports.Set(Napi::String::New(env, "readHALStreamSession"),

src/canWrapper.cc

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -671,19 +671,57 @@ void stopNotifier(const Napi::CallbackInfo& info) {
671671
HAL_CleanNotifier(m_notifier, &status);
672672
}
673673

674-
void writeDfuToBin(const Napi::CallbackInfo& info) {
674+
Napi::Promise writeDfuToBin(const Napi::CallbackInfo& info) {
675675
std::string dfuFileName = info[0].As<Napi::String>().Utf8Value();
676676
std::string binFileName = info[1].As<Napi::String>().Utf8Value();
677-
Napi::Function cb = info[2].As<Napi::Function>();
677+
int elementIndex;
678+
679+
if(info[2].IsUndefined() || info[2].IsNull()) {
680+
elementIndex = 0;
681+
} else {
682+
elementIndex = info[2].As<Napi::Number>().Int32Value();
683+
}
678684

679685
dfuse::DFUFile dfuFile(dfuFileName.c_str());
680686
int status = 0;
681687
if (dfuFile && dfuFile.Images().size() > 0 && dfuFile.Images()[0]) {
682-
dfuFile.Images()[0].Write(binFileName, dfuse::writer::Bin);
688+
dfuFile.Images()[0].Write(binFileName, elementIndex, dfuse::writer::Bin);
683689
} else {
684690
status = 1;
685691
}
686-
cb.Call(info.Env().Global(), {info.Env().Null(), Napi::Number::New(info.Env(), status)});
692+
Napi::Promise::Deferred deferred = Napi::Promise::Deferred::New(info.Env());
693+
694+
deferred.Resolve(Napi::Number::New(info.Env(), status));
695+
return deferred.Promise();
696+
}
697+
698+
Napi::Array getImageElements(const Napi::CallbackInfo& info) {
699+
Napi::Env env = info.Env();
700+
std::string dfuFileName = info[0].As<Napi::String>().Utf8Value();
701+
const int imageIndex = info[1].As<Napi::Number>().Int32Value();
702+
703+
Napi::Array elements = Napi::Array::New(env);
704+
705+
const dfuse::DFUFile dfuFile(dfuFileName.c_str());
706+
707+
if(imageIndex >= dfuFile.Images().size()) {
708+
const std::string errorMessage = "Image index out of range";
709+
Napi::Error::New(env, errorMessage).ThrowAsJavaScriptException();
710+
return elements;
711+
}
712+
713+
const dfuse::DFUImage image = dfuFile.Images()[imageIndex];
714+
715+
uint32_t elementsCount = 0;
716+
for(auto element: image.Elements()) {
717+
Napi::Object elementObject = Napi::Object::New(env);
718+
elementObject.Set("startAddress", element.Address());
719+
elementObject.Set("size", element.Size());
720+
721+
elements[elementsCount++] = elementObject;
722+
}
723+
724+
return elements;
687725
}
688726

689727
void cleanupHeartbeatsRunning() {

src/canWrapper.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ Napi::Number sendHALMessage(const Napi::CallbackInfo& info);
1818
void initializeNotifier(const Napi::CallbackInfo& info);
1919
void waitForNotifierAlarm(const Napi::CallbackInfo& info);
2020
void stopNotifier(const Napi::CallbackInfo& info);
21-
void writeDfuToBin(const Napi::CallbackInfo& info);
21+
Napi::Promise writeDfuToBin(const Napi::CallbackInfo& info);
22+
Napi::Array getImageElements(const Napi::CallbackInfo& info);
2223
Napi::Number openHALStreamSession(const Napi::CallbackInfo& info);
2324
Napi::Array readHALStreamSession(const Napi::CallbackInfo& info);
2425
void closeHALStreamSession(const Napi::CallbackInfo& info);

0 commit comments

Comments
 (0)