]> gitweb.hamatoma.de Git - cpidjinn/commitdiff
client: commands trace+getbuffer
authorhama <hama@siduction.net>
Thu, 16 Jun 2016 18:28:55 +0000 (20:28 +0200)
committerhama <hama@siduction.net>
Thu, 16 Jun 2016 18:28:55 +0000 (20:28 +0200)
Server/client.cpp
Server/cpidjinn.cpp
Server/gpioprocessor.cpp
Server/gpioprocessor.hpp
Server/gpiotimer.cpp
Server/gpiotimer.hpp

index 71e3d34d6f6bb2657d7fd6b7343e8414b08c22d2..e030206b07e3d9c786e96f6d913d966fcd9970a1 100644 (file)
@@ -34,13 +34,25 @@ static void prepareMelody(PinNumber pin, DynBuffer& buffer){
        addTone(duration, 659255, buffer);
 }
 static void prepareBlink(PinNumber pin, int count, int high, int low, DynBuffer& buffer){
-       printf("pin: %d count: %d high: %d low: %d\n", pin, count, high, low);
+       printf("blink: pin: %d count: %d high: %d low: %d\n", pin, count, high, low);
        buffer.clear().append("BLNK");
        buffer.appendAsLE((int) pin, 1);
        buffer.appendAsLE(count, 4);
        buffer.appendAsLE(high * 1000, 4);
        buffer.appendAsLE(low * 1000, 4);
 }
+static void prepareTrace(PinNumber pin, int count, int delay){
+       printf("trace: pin: %d count: %d delay: %d\n", pin, count, delay);
+       buffer.clear().append("TRAC");
+       buffer.appendAsLE((int) pin, 1);
+       buffer.appendAsLE(count, 4);
+       buffer.appendAsLE(delay, 4);
+}
+static void prepareGetBuffer(const char* bufferName){
+       printf("getbuffer: %s\n", buffername);
+       buffer.clear().append("GETB");
+       buffer.append(bufferName);
+}
 void usage(const char* msg, const char* argument){
        printf("Usage: client <opts> <command> [<args>]\n"
                "<opts>\n"
@@ -54,10 +66,20 @@ void usage(const char* msg, const char* argument){
                "  <pin>: rpi2_<number>\n"
                "  <number>: 5 7..8 10..16 18..19 21.. 24 26 29 31..33 35..38 40\n"
                "  melody\n"
+               "  trace <pin> <count> <delay>\n"
+               "    inspects in a fix time raster the input state of a pin <count> times.\n"
+               "    the pause between two checks is <delay> microseconds\n"
+               "    returns the name of a buffer which can be requested by 'getbuffer'\n"
+               "  getbuffer <buffer> <wait>\n"
+               "    returns the content of the buffer filled by 'trace'\n"
+               "    if <wait> is 't': the server waits for a full buffer\n"
+               "    otherwise the current content of the buffer is returned\n"
                "Examples:\n"
                "client -p21222 -h192.168.178.3 blink rpi2_11 99 500\n"
                "client --port=21222 --host=192.168.178.3 blink rpi2_11 99 500 250\n"
                "client melody rpi2_12\n"
+               "client trace rpi2_21 100 1000\n"
+               "client getbuffer #A t\n"
                "+++ %s%s%s\n",
           msg, argument == NULL ? "" : " ", argument == NULL ? "" : argument);
        exit(1);
@@ -91,15 +113,17 @@ int main (int argc, char **argv) {
        Logger logger;
        DynBuffer buffer;
        PinNumber pin;
-       if (strcmp(argv[1], "blink") == 0){
+       int count;
+       int length = 0;
+       const char* command = argv[1];
+       if (strcmp(command, "blink") == 0){
                argv++;
                argc--;
-               int length = 0;
                if (argc < 2)
                        usage("missing pin", NULL);
                else if ( (pin = pinNameToNumber(argv[1])) == pinUndef)
                        usage("unknown pin:", argv[1]);
-               int count = 100;
+               count = 100;
                if (argc > 2 && (count = toNumber(argv[2], length)) == 0)
                                usage("invalid count", argv[2]);
                int high = 1000;
@@ -109,14 +133,30 @@ int main (int argc, char **argv) {
                if (argc > 4 && (low = toNumber(argv[4], length)) == 0)
                                usage("invalid high_msec", argv[4]);
                prepareBlink(pin, count, high, low, buffer);
-       } else if (strcmp(argv[1], "melody") == 0){
+       } else if (strcmp(command, "melody") == 0){
                if (argc < 3)
                        usage("missing pin", NULL);
                else if ( (pin = pinNameToNumber(argv[2])) == pinUndef)
                        usage("unknown pin:", argv[2]);
                        prepareMelody(pin, buffer);
+       } else if (strcmp(command, "trace") == 0){
+               if (argc < 3)
+                       usage("missing pin", NULL);
+               else if ( (pin = pinNameToNumber(argv[2])) == pinUndef)
+                       usage("unknown pin:", argv[2]);
+               count = 100;
+               if (argc > 2 && (count = toNumber(argv[2], length)) == 0)
+                               usage("invalid count", argv[2]);
+               int delay = 1000;
+               if (argc > 3 && (count = toNumber(argv[3], length)) == 0)
+                               usage("invalid delay", argv[3]);
+               prepareTrace(pin, count, delay);
+       } else if (strcmp(command, "getbuffer") == 0){
+               if (argc < 3)
+                       usage("missing buffername", NULL);
+               prepareGetBuffer(argv[2]);
        } else {
-               usage("unknown command:", argv[1]);
+               usage("unknown command:", command);
        }
        TcpClient client(&logger);
        printf("connection to %s:%d\n", host, port);
index 517c2bada60b642f1e394b3a1821738a56aa57aa..cfd92bef928e9b14c28dc852e2ea51dcb0657eec 100644 (file)
@@ -3,7 +3,8 @@
 void blink(PinNumber pin, int count, int duration, Logger* logger){
        printf("blink pin: %d count: %d duration: %d\n", pin, count, duration);
        GPIOProcessor proc(logger);
-       for (int ix = 0; ix < count; ix++){
+       for (int ix = count; ix > 0; ix--){
+               printf("%d\n", ix);
                proc.writeToGPIO(pin, psHigh);
                usleep(duration * 1000);
                proc.writeToGPIO(pin, psLow);
@@ -17,7 +18,7 @@ void test(int argc, char** argv, Logger* logger){
                PinNumber pin = pinRPi2_11;
 
                if (argc > 1)
-                       count = pinNameToNumber(argv[1]);
+                       pin = pinNameToNumber(argv[1]);
                if (argc > 2)
                        count = atol(argv[2]);
                if (argc > 3)
index 75a0780717d63f71d31054677d89f61b12b1cc46..1e90ea4eb7a331dd0d48af258e04cc379ae37c1d 100644 (file)
@@ -45,6 +45,26 @@ void GPIOProcessor::blink(DynBuffer& buffer){
        }
 }
 
+/**
+ * Gets a buffer with data assembled from 'trace'.
+ *
+ * Syntax: GETB <name><b>
+ * <name>: '#' 'A'..'Z'
+ *
+ * @param buffer       IN: contains the command describing a melody to play<br>
+ *                                     OUT: answer for the client
+ */
+void GPIOProcessor::getBuffer(DynBuffer& buffer){
+       char name;
+       if (buffer.length() != 4 + 2 || buffer[4] != '#' || buffer[5] < 'A' || (name = buffer[5]) > 'Z'){
+               DynBuffer name(buffer.str() + 4);
+               buffer.set("ERROR wrong buffername: ").append(name);
+       } else if(m_buffers[name] == NULL) {
+               buffer.set("ERROR unknown buffername: #").append(name);
+       } else {
+               buffer.set("OK  ").append(*m_buffers[name]);
+       }
+}
 /**
  * "Writes" a melody to a GPIO pin.
  *
@@ -123,3 +143,18 @@ TcpProcessor::State GPIOProcessor::process(DynBuffer& buffer){
        }
        return rc;
 }
+
+/**
+ * Inspects the input state of a GPIO pin in a timer loop.
+ *
+ * Syntax: TRAC[pin][count][delay]<br>
+ * [pin]: 1 byte. Numbering like <i>PinNumber</i><br>
+ * [count]: 2 byte<br>
+ * [duration]: 4 byte little endian, number of microseconds<br>
+ *
+ * @param buffer       IN: contains the command describing a melody to play<br>
+ *                                     OUT: answer for the client
+ */
+void TcpProcessor::trace(DynBuffer& buffer){
+
+}
index f8db49f672b0e60196502b52c2a76976e81d23a2..9a6bec5d92a891d5077c615c55d5f2c4e5fe7a3d 100644 (file)
@@ -15,14 +15,17 @@ private:
        GPIOProcessor& operator=(const GPIOProcessor& other);
 private:
        void blink(DynBuffer& buffer);
+       void getBuffer(DynBuffer& buffer);
        void melody(DynBuffer& buffer);
        void pulseWidthModulation(DynBuffer& buffer);
+       void trace(DynBuffer& buffer);
 public:
        virtual State process(DynBuffer& buffer);
 private:
        PinInfo m_pins[MAX_PINS];
        Announcer* m_logger;
        ThreadPool m_pool;
+       DynBuffer* m_buffers[26];
 };
 
 #endif // GPIOPROCESSOR_H
index 9575ae6f85bc95bb7d4235ad0dad9aced500af3a..ba8a160a3fce6c4d8dde1256688e00b1938b1a53 100644 (file)
@@ -29,7 +29,7 @@ GPIOTimer::~GPIOTimer() {
  * @param state                <i>psLow</i> or <i>psHigh</i>
  */
 void GPIOTimer::switchState(PinState state){
-       m_logger->sayf(LOG_DEBUG, "pin %d: %c", m_pin, psHigh ? 'H' : 'L');
+       m_logger->sayf(LOG_DEBUG, "pin %d: %c", m_pin, state ? 'H' : 'L');
        m_processor->writeToGPIO(m_pin, state);
 }
 /**
@@ -65,3 +65,37 @@ void SquareWaveTimer::timerTask(){
        switchState(m_nextHigh ? psHigh : psLow);
        m_delay = m_nextHigh ? m_high : m_low;
 }
+
+/**
+ * Constructor.
+ *
+ * @param pin                  the target pin
+ * @param pause                        the pause (in microseconds) to wait between two reads
+ * @param count                        the number of reads
+ * @param buffer               OUT: for each read the state is stored in this buffer
+ * @param gpioProcessor        access to the SoC
+ * @param logger               the logger
+ * @param pool                 the pool managing the timer threads
+ */
+TraceInputTimer::TraceInputTimer(PinNumber pin, uint64_t pause, int count, DynBuffer* buffer,
+                               GPIOProcessor* gpioProcessor, Announcer* logger, ThreadPool* pool) :
+       GPIOTimer(pin, pause, gpioProcessor, logger, pool),
+       m_buffer(buffer),
+       m_lastState(psLow){
+       m_taskCount = count;
+       m_processor->setMode(pin, mInput);
+}
+
+/**
+ * The action done from the timer.
+ */
+void TraceInputTimer::timerTask(){
+       PinState current = m_processor->readFromGPIO(m_pin);
+       if (current != m_lastState){
+               printf("pin: %d changed to %c\n", m_pin, current == psHigh ? 'H' : 'L');
+               m_lastState = current;
+       }
+       if (m_buffer != NULL)
+               m_buffer->append((char) current);
+}
+
index 58f0d5bba32945932f95a03673e46d4f5e9930ba..79199f914110d2741ceee38df3615a186a6bbc8c 100644 (file)
@@ -36,6 +36,20 @@ private:
        bool m_nextHigh;
 };
 
+/**
+ * A timer watching states in a given interval.
+ */
+class TraceInputTimer : public GPIOTimer{
+public:
+       TraceInputTimer(PinNumber pin, uint64_t pause, int count, DynBuffer* buffer,
+                               GPIOProcessor* gpioProcessor, Announcer* logger, ThreadPool* pool);
+public:
+       virtual void timerTask();
+private:
+       DynBuffer* m_buffer;
+       PinState m_lastState;
+};
+
 /**
  * A timer producing a melody.
  *