crc reset command. stable-1.5
authorFlorian Pose <fp@igh-essen.com>
Fri, 03 Mar 2017 13:50:49 +0100
branchstable-1.5
changeset 2667 0d7936701e60
parent 2666 d9e14a0ddbd6
child 2668 dd32f74ee76e
crc reset command.
tool/CommandCrc.cpp
--- a/tool/CommandCrc.cpp	Fri Mar 03 13:33:17 2017 +0100
+++ b/tool/CommandCrc.cpp	Fri Mar 03 13:50:49 2017 +0100
@@ -27,6 +27,7 @@
 
 #include <iostream>
 #include <iomanip>
+#include <algorithm>
 using namespace std;
 
 #include "CommandCrc.h"
@@ -45,8 +46,9 @@
 {
     stringstream str;
 
-    str << binaryBaseName << " " << getName()
-        << " [OPTIONS]" << endl
+    str
+        << binaryBaseName << " " << getName() << endl
+        << binaryBaseName << " " << getName() << " reset" << endl
         << endl
         << getBriefDescription() << endl
         << endl
@@ -66,16 +68,60 @@
 /****************************************************************************/
 
 #define NUM_PORTS (4)
+#define REG_SIZE  (20)
 
 void CommandCrc::execute(const StringVector &args)
 {
+    bool reset = false;
+
+    if (args.size() > 1) {
+        stringstream err;
+        err << "'" << getName() << "' takes either no or 'reset' argument!";
+        throwInvalidUsageException(err);
+    }
+
+    if (args.size() == 1) {
+        string arg = args[0];
+        transform(arg.begin(), arg.end(),
+                arg.begin(), (int (*) (int)) std::tolower);
+        if (arg != "reset") {
+            stringstream err;
+            err << "'" << getName() << "' takes either no or 'reset' argument!";
+            throwInvalidUsageException(err);
+        }
+
+        reset = true;
+    }
 
     MasterDevice m(getSingleMasterIndex());
-    m.open(MasterDevice::Read);
+    m.open(reset ? MasterDevice::ReadWrite : MasterDevice::Read);
 
     ec_ioctl_master_t master;
     m.getMaster(&master);
 
+    uint8_t data[REG_SIZE];
+    ec_ioctl_slave_reg_t io;
+    io.emergency = 0;
+    io.address = 0x0300;
+    io.size = REG_SIZE;
+    io.data = data;
+
+    if (reset) {
+        for (int j = 0; j < REG_SIZE; j++) {
+            data[j] = 0x00;
+        }
+
+        for (unsigned int i = 0; i < master.slave_count; i++) {
+
+            io.slave_position = i;
+            try {
+                m.writeReg(&io);
+            } catch (MasterDeviceException &e) {
+                throw e;
+            }
+        }
+        return;
+    }
 
     cout << "   |";
     for (unsigned int port = 0; port < NUM_PORTS; port++) {
@@ -89,19 +135,12 @@
     }
     cout << endl;
 
-    ec_ioctl_slave_reg_t io;
-    io.emergency = 0;
-    io.address = 0x0300;
-    io.size = 20;
-    io.data = new uint8_t[20];
-
     for (unsigned int i = 0; i < master.slave_count; i++) {
 
         io.slave_position = i;
         try {
             m.readReg(&io);
         } catch (MasterDeviceException &e) {
-            delete [] io.data;
             throw e;
         }
 
@@ -120,8 +159,6 @@
         slaveName = slaveName.substr(0, 11);
         cout << slaveName << endl;
     }
-
-    delete [] io.data;
 }
 
 /*****************************************************************************/