aboutsummaryrefslogtreecommitdiff
path: root/printer/include/mipi_syst_decode.h
diff options
context:
space:
mode:
Diffstat (limited to 'printer/include/mipi_syst_decode.h')
-rw-r--r--printer/include/mipi_syst_decode.h187
1 files changed, 187 insertions, 0 deletions
diff --git a/printer/include/mipi_syst_decode.h b/printer/include/mipi_syst_decode.h
new file mode 100644
index 0000000..50dd84b
--- /dev/null
+++ b/printer/include/mipi_syst_decode.h
@@ -0,0 +1,187 @@
+/*
+ Copyright (c) 2018, MIPI Alliance, Inc.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+ * Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+ * Contributors:
+ * Norbert Schulz (Intel Corporation) - Initial API and implementation
+ */
+
+#ifndef MIPI_SYST_DECODE_H_included
+#define MIPI_SYST_DECODE_H_included
+
+#include <vector>
+#include "mipi_syst_printer.h"
+#include "mipi_syst_collateral.h"
+#include "mipi_syst_message.h"
+
+MIPI_SYST_NAMESPACE_BEGIN
+
+class message;
+class collateral;
+
+/// Base class for decoding exceptions
+//
+class decode_exception {
+public:
+ decode_exception(message::decode_state s,
+ const std::string& what = std::string())
+ : state(s), msg(what)
+ {}
+ virtual ~decode_exception() {};
+
+ virtual const std::string& what() const { return msg; }
+ message::decode_state get_state() const { return state; }
+
+protected:
+ message::decode_state state;
+ std::string msg;
+};
+
+
+class tooshort_exception : public decode_exception
+{
+public:
+ tooshort_exception() :
+ decode_exception(message::decode_state::TOO_SHORT) {}
+};
+class toolong_exception : public decode_exception
+{
+public:
+ toolong_exception() :
+ decode_exception(message::decode_state::TOO_LONG) {}
+};
+class unknown_type_exception : public decode_exception
+{
+public:
+ unknown_type_exception() :
+ decode_exception(message::decode_state::UNKNOWN_TYPE) {}
+};
+
+class crc_error_exception : public decode_exception
+{
+public:
+ crc_error_exception() :
+ decode_exception(message::decode_state::CHECKSUM_ERROR) {}
+};
+
+class missing_collateral_exception : public decode_exception
+{
+public:
+ missing_collateral_exception() :
+ decode_exception(message::decode_state::MISSING_COLLATERAL) {}
+};
+
+/// Decode context information.
+//
+// This class is delivering timstamp and identifcation information as
+// side-band data.
+// Context based message identification is needed for client identification
+// if messages don't carry GUID information as part of the message data.
+// Short messages are one example for such messages. In this case
+// collateral matching relies on side-band information. In systems using
+// MIPI System Trace Protocol (STP), the master and channel 16-bit values
+// are typically used for this purpose.
+// A timestamp is often also provided through a transport protocol and not
+// embedded into SyS-T messages.
+//
+class decode_context {
+public:
+ virtual const guid& getGuid() const = 0; ///< get context based guid
+ virtual uint64_t getTS() const = 0; ///< get context timestamp
+ virtual ~decode_context() {}
+};
+
+/// MIPI SyS-T data protocol decoder
+//
+// This class is decoding a sequence of bytes that represent one SyS-T message into
+// a message data structure for post processing.
+//
+class decoder {
+public:
+ /// Parse given file as a SyS-T collateral XML file
+ //
+ // Parse and add provided file as SyS-T collateral data. The function
+ // throws an exception if the XML is malformed.
+ //
+ // @param file filename to load
+ //
+ void loadCollateral(const std::string& file);
+
+ /// Store Build ID for given GUID
+ //
+ // Cache build ID for given GUID to make collateral matching "build number"
+ // aware. If a build ID was seen, the decode looks for collateral matching this
+ // one.
+ //
+ // @param id 64-Bit build number to remember
+ // @param g client guid associated with this build number
+ //
+ void setBuildNumber(uint64_t id, const guid& g) const;
+
+ /// Decode single SyS-T raw binary message
+ //
+ // @param dest message data structed holding decode result
+ // @param data raw data bytes representing one SyS-T message
+ //
+ // @return true on success
+ //
+ bool decode(message& dest, const std::vector<uint8_t>& data, const decode_context * ctx) const;
+
+private:
+ bool decodeShortMessage(message& dest, const uint8_t *data, uint32_t length, const decode_context * ctx) const;
+ bool decodeNormalMessage(message& dest, const uint8_t *data, uint32_t length, const decode_context * ctx) const;
+
+ void decodeBuildPayload(message& dest, const uint8_t * data, uint32_t len) const;
+ void decodeStringPayload(message& dest, const uint8_t * data, uint32_t len) const;
+ void decodeCatalogPayload(message& dest, const uint8_t * data, uint32_t len) const;
+ void decodeRawPayload(message& dest, const uint8_t * data, uint32_t len) const;
+ void decodeInvalidType(message& dest, const uint8_t * data, uint32_t len) const;
+
+
+ collateral * findCollateral(const guid& m) const;
+
+ static guid generatePseudoGuid(uint8_t origin);
+ static uint32_t getCrc32(const uint8_t * data, size_t len);
+
+ std::vector<collateral*> collaterals;
+ mutable std::map<guid, collateral*> collateral_by_guid;
+ mutable std::map<guid, uint64_t> build_by_guid;
+ typedef void (decoder::*decode_payload_f)(message&, const uint8_t *, uint32_t len) const;
+
+ static decode_payload_f payloadDecode[16];
+ static const uint32_t crc32c_table[256];
+};
+
+MIPI_SYST_NAMESPACE_END
+
+#endif // MIPI_SYST_PRINTER_H_included