![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Gets messages form the pc and translates it to I2C and back.
Dependencies: DevInterfaces I2Cinterfaces MCP4725 mbed
Translator.cpp
- Committer:
- katrijnverhasselt
- Date:
- 2016-05-18
- Revision:
- 1:8ba039abd9b8
- Parent:
- 0:b40341017545
- Child:
- 2:2330ad8b1baa
File content as of revision 1:8ba039abd9b8:
#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) { return false; } // Check length of command if (cmd[Rules::CharsToReadIndex] + Rules::CharsToReadOffset != cmdSize) { 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; }