Skip to content
Snippets Groups Projects
Commit 4a9a3607 authored by Micah Elizabeth Scott's avatar Micah Elizabeth Scott
Browse files

Extensible argument parsing

parent f1b9d7a0
No related branches found
No related tags found
No related merge requests found
...@@ -120,6 +120,12 @@ public: ...@@ -120,6 +120,12 @@ public:
// Simple argument parsing and main loop // Simple argument parsing and main loop
int main(int argc, char **argv); int main(int argc, char **argv);
protected:
// Extensibility for argument parsing
virtual bool parseArgument(int &i, int &argc, char **argv);
virtual bool validateArguments();
virtual void argumentUsage();
private: private:
float minTimeDelta; float minTimeDelta;
rapidjson::Document layout; rapidjson::Document layout;
...@@ -282,7 +288,7 @@ inline void EffectRunner::doFrame(float timeDelta) ...@@ -282,7 +288,7 @@ inline void EffectRunner::doFrame(float timeDelta)
// Only calculate the effect if we have a connection // Only calculate the effect if we have a connection
if (opc.tryConnect()) { if (opc.tryConnect()) {
uint8_t *dest = OPCClient::Header::view(frameBuffer).data(); uint8_t *dest = OPCClient::Header::view(frameBuffer).data();
for (PixelInfoIter i = frameInfo.pixels.begin(), e = frameInfo.pixels.end(); i != e; ++i) { for (PixelInfoIter i = frameInfo.pixels.begin(), e = frameInfo.pixels.end(); i != e; ++i) {
...@@ -317,51 +323,74 @@ inline OPCClient& EffectRunner::getClient() ...@@ -317,51 +323,74 @@ inline OPCClient& EffectRunner::getClient()
inline int EffectRunner::main(int argc, char **argv) inline int EffectRunner::main(int argc, char **argv)
{ {
for (int i = 1; i < argc; i++) { for (int i = 1; i < argc; i++) {
if (!parseArgument(i, argc, argv)) {
if (!strcmp(argv[i], "-fps") && (i+1 < argc)) { return usage(argv[0]);
float rate = atof(argv[++i]);
if (rate <= 0) {
fprintf(stderr, "Invalid frame rate\n");
return usage(argv[0]);
}
setMaxFrameRate(rate);
continue;
} }
}
if (!strcmp(argv[i], "-layout") && (i+1 < argc)) { if (!validateArguments()) {
if (!setLayout(argv[++i])) { return usage(argv[0]);
fprintf(stderr, "Can't load layout from %s\n", argv[i]); }
return 1;
} run();
continue; return 0;
}
inline int EffectRunner::usage(const char *name)
{
fprintf(stderr, "usage: %s ", name);
argumentUsage();
fprintf(stderr, "\n");
return 1;
}
bool EffectRunner::parseArgument(int &i, int &argc, char **argv)
{
if (!strcmp(argv[i], "-fps") && (i+1 < argc)) {
float rate = atof(argv[++i]);
if (rate <= 0) {
fprintf(stderr, "Invalid frame rate\n");
return false;
} }
setMaxFrameRate(rate);
return true;
}
if (!strcmp(argv[i], "-server") && (i+1 < argc)) { if (!strcmp(argv[i], "-layout") && (i+1 < argc)) {
if (!setServer(argv[++i])) { if (!setLayout(argv[++i])) {
fprintf(stderr, "Can't resolve server name %s\n", argv[i]); fprintf(stderr, "Can't load layout from %s\n", argv[i]);
return 1; return false;
}
continue;
} }
return true;
}
return usage(argv[0]); if (!strcmp(argv[i], "-server") && (i+1 < argc)) {
if (!setServer(argv[++i])) {
fprintf(stderr, "Can't resolve server name %s\n", argv[i]);
return false;
}
return true;
} }
return false;
}
bool EffectRunner::validateArguments()
{
if (!hasLayout()) { if (!hasLayout()) {
fprintf(stderr, "No layout specified\n"); fprintf(stderr, "No layout specified\n");
return usage(argv[0]); return false;
} }
run(); return true;
return 0;
} }
inline int EffectRunner::usage(const char *name) void EffectRunner::argumentUsage()
{ {
fprintf(stderr, "usage: %s [-fps LIMIT] [-layout FILE.json] [-server HOST[:port]]\n", name); fprintf(stderr, "[-fps LIMIT] [-layout FILE.json] [-server HOST[:port]]");
return 1;
} }
static inline float sq(float a) static inline float sq(float a)
{ {
// Fast square // Fast square
......
...@@ -83,7 +83,6 @@ int main(int argc, char **argv) ...@@ -83,7 +83,6 @@ int main(int argc, char **argv)
EffectRunner r; EffectRunner r;
Rings e; Rings e;
r.setEffect(&e); r.setEffect(&e);
r.setMaxFrameRate(60);
r.setLayout("../layouts/grid32x16z.json"); r.setLayout("../layouts/grid32x16z.json");
return r.main(argc, argv); return r.main(argc, argv);
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment