Gets messages form the pc and translates it to I2C and back.

Dependencies:   DevInterfaces I2Cinterfaces MCP4725 mbed

Revision:
0:b40341017545
Child:
1:8ba039abd9b8
diff -r 000000000000 -r b40341017545 Translator.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Translator.cpp	Wed May 18 11:22:41 2016 +0000
@@ -0,0 +1,136 @@
+#include "Translator.h"
+
+Translator::MessageInfo::MessageInfo()
+    : CommandType(NONE),
+    Channel(0),
+    DacValue(0)
+{}
+
+bool Translator::MessageInfo::IsNone() {
+    return CommandType == NONE;
+}
+
+bool Translator::MessageInfo::IsRead() {
+    return CommandType == READ;
+}
+
+bool Translator::MessageInfo::IsWrite() {
+    return CommandType == WRITE;
+}
+
+bool Translator::MessageInfo::IsOption() {
+    return CommandType = OPTION;
+}
+
+int    Translator::Rules::StartCharIndex = 0;
+int8_t Translator::Rules::StartChar = '!';
+int    Translator::Rules::CharsToReadIndex = 1;
+int    Translator::Rules::CharsToReadOffset = CharsToReadIndex+1;
+int    Translator::Rules::rwoIndex = 2;
+int8_t Translator::Rules::ReadChar = 'r';
+int8_t Translator::Rules::WriteChar = 'w';
+int8_t Translator::Rules::OptionChar = 'o';
+int8_t Translator::Rules::ErrorChar = 'e';
+//int    Translator::Rules::ChannelIndex = 3;
+int    Translator::Rules::DataIndex = 3;
+int    Translator::Rules::DataLength = 2;
+
+int    Translator::Rules::ReadCmdSize = rwoIndex + 1;
+int    Translator::Rules::WriteCmdSize = DataIndex + DataLength;
+int    Translator::Rules::ErrorCmdSize = rwoIndex + 1;
+
+
+Translator::Translator()
+    : _rawMessage(0),
+    _size(0)
+{}
+
+
+bool Translator::Translate(MessageInfo info, int8_t** cmd, int* const cmdSize) {
+    switch (info.CommandType) {
+        case MessageInfo::NONE:
+            return false;
+        case MessageInfo::READ:
+            *cmdSize = Rules::ReadCmdSize;
+            // Add extra character for '\0'
+            *cmd = new int8_t[Rules::ReadCmdSize+1];
+            (*cmd)[Rules::StartCharIndex] = Rules::StartChar;
+            (*cmd)[Rules::CharsToReadIndex] = Rules::ReadCmdSize-Rules::CharsToReadOffset;
+            (*cmd)[Rules::rwoIndex] = Rules::ReadChar;
+            //(*cmd)[Rules::ChannelIndex] = info.Channel;
+            (*cmd)[Rules::ReadCmdSize] = '\0';
+            break;
+        case MessageInfo::WRITE:
+            *cmdSize = Rules::WriteCmdSize;
+            // Add extra character for '\0'
+            *cmd = new int8_t[Rules::WriteCmdSize+1];
+            (*cmd)[Rules::StartCharIndex] = Rules::StartChar;
+            (*cmd)[Rules::CharsToReadIndex] = Rules::WriteCmdSize - Rules::CharsToReadOffset;
+            (*cmd)[Rules::rwoIndex] = Rules::WriteChar;
+            //(*cmd)[Rules::ChannelIndex] = info.Channel;
+            for (int i = 0; i < Rules::DataLength; i++)
+                (*cmd)[Rules::DataIndex + i] = (info.DacValue >> (Rules::DataLength - i - 1) * 8) & 0xFF;
+            (*cmd)[Rules::WriteCmdSize] = '\0';
+            break;
+        case MessageInfo::OPTION:
+            // Not implemented yet
+            return false;
+        case MessageInfo::ERROR:
+            *cmdSize = Rules::ErrorCmdSize;
+            // Add extra character for '\0'
+            *cmd = new int8_t[Rules::ErrorCmdSize+1];
+            (*cmd)[Rules::StartCharIndex] = Rules::StartChar;
+            (*cmd)[Rules::CharsToReadIndex] = Rules::ErrorCmdSize - Rules::CharsToReadOffset;
+            (*cmd)[Rules::rwoIndex] = Rules::ErrorChar;
+            (*cmd)[Rules::ErrorCmdSize] = '\0';
+            break;
+        default:
+            return false;
+    }
+
+    return true;
+}
+
+
+bool Translator::Translate(const int8_t* const cmd, int cmdSize, MessageInfo* const info) {
+    // Check starting character
+    if (cmd[Rules::StartCharIndex] != Rules::StartChar) {
+        printf("No start char");
+        return false;
+    }
+    // Check length of command
+    if (cmd[Rules::CharsToReadIndex] + Rules::CharsToReadOffset != cmdSize) {
+        printf("Incorrect size");
+        return false;
+    }
+
+    // Populate info
+    switch (cmd[Rules::rwoIndex]) {
+    case 'r':
+        info->CommandType = MessageInfo::READ;
+        break;
+    case 'w':
+        info->CommandType = MessageInfo::WRITE;
+        break;
+    case 'o':
+        info->CommandType = MessageInfo::OPTION;
+        break;
+    default:
+        return false;
+    }
+    //info->Channel = cmd[Rules::ChannelIndex];
+    info->DacValue = ByteUnshift(cmd+Rules::DataIndex, Rules::DataLength);
+    return true;
+}
+
+
+void Translator::ResetMessageInfo() {
+    _message.CommandType = MessageInfo::NONE;
+    _message.Channel = 0;
+    _message.DacValue = 0;
+}
+
+void Translator::InvalidateMessage() {
+    _rawMessage = 0;
+    _size = 0;
+}
\ No newline at end of file