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

Dependencies:   DevInterfaces I2Cinterfaces MCP4725 mbed

Committer:
katrijnverhasselt
Date:
Wed Jun 15 10:53:32 2016 +0000
Revision:
2:2330ad8b1baa
Parent:
0:b40341017545
Finished programming. This program now simply extract only the info it needs and sends all of it immediately through its I2C port.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
katrijnverhasselt 0:b40341017545 1 #pragma once
katrijnverhasselt 0:b40341017545 2
katrijnverhasselt 2:2330ad8b1baa 3 #define MAX(a,b) (((a) > (b)) ? (a) : (b))
katrijnverhasselt 2:2330ad8b1baa 4
katrijnverhasselt 0:b40341017545 5 #include <string>
katrijnverhasselt 0:b40341017545 6 #include "mbed.h"
katrijnverhasselt 0:b40341017545 7
katrijnverhasselt 0:b40341017545 8 // Implements the Data-Link layer, translating a raw message to MessageInfo and back
katrijnverhasselt 0:b40341017545 9 class Translator {
katrijnverhasselt 2:2330ad8b1baa 10
katrijnverhasselt 0:b40341017545 11 public:
katrijnverhasselt 2:2330ad8b1baa 12 enum EErrorCode {
katrijnverhasselt 2:2330ad8b1baa 13 SUCCES,
katrijnverhasselt 2:2330ad8b1baa 14 INCOMPLETE,
katrijnverhasselt 2:2330ad8b1baa 15 INVALID
katrijnverhasselt 2:2330ad8b1baa 16 };
katrijnverhasselt 2:2330ad8b1baa 17
katrijnverhasselt 2:2330ad8b1baa 18 // Rules over how the command is structured, indexes are per byte
katrijnverhasselt 2:2330ad8b1baa 19 struct Rules {
katrijnverhasselt 2:2330ad8b1baa 20 static const int StartCharIndex = 0; // Location of starting char
katrijnverhasselt 2:2330ad8b1baa 21 static const int CharsToReadIndex = 1; // Location of chars to read value
katrijnverhasselt 2:2330ad8b1baa 22 static const int AddressIndex = 2; // Location of pin address
katrijnverhasselt 2:2330ad8b1baa 23 static const int CommandIndex = 3; // Location of command type char
katrijnverhasselt 2:2330ad8b1baa 24 static const int DataIndex = 4; // Location of data start
katrijnverhasselt 2:2330ad8b1baa 25
katrijnverhasselt 2:2330ad8b1baa 26 static const char StartChar = '!'; // Starting character
katrijnverhasselt 2:2330ad8b1baa 27 static const char ReadChar = 'r'; // Character to indicate read command
katrijnverhasselt 2:2330ad8b1baa 28 static const char WriteChar = 'w'; // Character to indicate write command
katrijnverhasselt 2:2330ad8b1baa 29 static const char OtherChar = 'o'; // Character to indicate other command
katrijnverhasselt 2:2330ad8b1baa 30 static const char ErrorChar = 'e'; // Character to indicate an error
katrijnverhasselt 2:2330ad8b1baa 31
katrijnverhasselt 2:2330ad8b1baa 32 static const int PrefixSize = CharsToReadIndex + 1; // Number of chars in the prefix
katrijnverhasselt 2:2330ad8b1baa 33 static const int ReadDataSize = 5; // Number of chars used in read data
katrijnverhasselt 2:2330ad8b1baa 34 static const int WriteDataSize = 3; // Number of chars used in write data
katrijnverhasselt 2:2330ad8b1baa 35 static const int MaxDataSize = MAX(ReadDataSize, WriteDataSize); // Maximum size of data array
katrijnverhasselt 2:2330ad8b1baa 36 static const int EmptyDataCmdSize = DataIndex; // Number of chars in command if no data
katrijnverhasselt 2:2330ad8b1baa 37 static const int ReadCmdSize = EmptyDataCmdSize + ReadDataSize; // Size of a read command
katrijnverhasselt 2:2330ad8b1baa 38 static const int WriteCmdSize = EmptyDataCmdSize + WriteDataSize; // Size of a write command
katrijnverhasselt 2:2330ad8b1baa 39 static const int ErrorCmdSize = EmptyDataCmdSize; // Size of an error command
katrijnverhasselt 2:2330ad8b1baa 40
katrijnverhasselt 2:2330ad8b1baa 41 static const int MaxCmdSize = MAX(ReadCmdSize, WriteCmdSize); // Maximum total command size
katrijnverhasselt 2:2330ad8b1baa 42 };
katrijnverhasselt 2:2330ad8b1baa 43
katrijnverhasselt 0:b40341017545 44 // Contains easy retreivable message info
katrijnverhasselt 0:b40341017545 45 struct MessageInfo {
katrijnverhasselt 2:2330ad8b1baa 46 enum ECommandType { NONE, READ, WRITE, ERROR } CommandType;
katrijnverhasselt 2:2330ad8b1baa 47 int Address;
katrijnverhasselt 2:2330ad8b1baa 48 char Data[Rules::MaxCmdSize];
katrijnverhasselt 0:b40341017545 49
katrijnverhasselt 0:b40341017545 50 MessageInfo();
katrijnverhasselt 0:b40341017545 51
katrijnverhasselt 0:b40341017545 52 // Function to more easily check CommandType
katrijnverhasselt 0:b40341017545 53 bool IsNone();
katrijnverhasselt 0:b40341017545 54 bool IsRead();
katrijnverhasselt 0:b40341017545 55 bool IsWrite();
katrijnverhasselt 2:2330ad8b1baa 56 bool IsError();
katrijnverhasselt 0:b40341017545 57
katrijnverhasselt 2:2330ad8b1baa 58 // Resets all values to default
katrijnverhasselt 2:2330ad8b1baa 59 void Reset();
katrijnverhasselt 0:b40341017545 60 };
katrijnverhasselt 0:b40341017545 61
katrijnverhasselt 0:b40341017545 62 private:
katrijnverhasselt 0:b40341017545 63 // Private constructor: no class instance allowed
katrijnverhasselt 0:b40341017545 64 Translator();
katrijnverhasselt 0:b40341017545 65
katrijnverhasselt 0:b40341017545 66 public:
katrijnverhasselt 0:b40341017545 67 // <Handig om weten: dit is een NULL ('\0') terminated character array dat terug wordt gegeven.
katrijnverhasselt 0:b40341017545 68 // Dit is nodig omdat printf("%s", cmd) niet kan weten hoe lang de array is en zal simpelweg
katrijnverhasselt 0:b40341017545 69 // blijven lezen tot het toevallig een NULL karakter tegenkomt.
katrijnverhasselt 0:b40341017545 70 // cmdSize geeft de grootte van de pointer ZONDER het null karakter zodat het zowel veilig
katrijnverhasselt 0:b40341017545 71 // kan gebruikt worden in printf en andere functies die geen null karakter vereisen (en waarbij
katrijnverhasselt 0:b40341017545 72 // dus het NULL karakter niet zal ingelezen worden>
katrijnverhasselt 2:2330ad8b1baa 73 // Translate MessageInfo to raw char* (NULL terminated)
katrijnverhasselt 2:2330ad8b1baa 74 static bool Translate(MessageInfo info, char cmd[Rules::MaxCmdSize], int* const cmdSize);
katrijnverhasselt 0:b40341017545 75 // <Hier bijvoorbeeld is het NULL karakter niet vereist omdat de grootte wordt opgevraagt
katrijnverhasselt 2:2330ad8b1baa 76 // Indien de char* van vorige functie hier terug wordt in gezet volstaat het om ook zijn
katrijnverhasselt 0:b40341017545 77 // cmdSize te gebruiken: het NULL karakter valt hier buiten en wordt daarom dus niet gelezen
katrijnverhasselt 0:b40341017545 78 // Dit zal ik toevoegen aan de ondervonden problemen.>
katrijnverhasselt 2:2330ad8b1baa 79 // Translate raw char* message to MessageInfo
katrijnverhasselt 2:2330ad8b1baa 80 // Returns 0 if succesful, -1 if message too short, 1 for faulty/unrecoverable message
katrijnverhasselt 2:2330ad8b1baa 81 static EErrorCode Translate(const char* const cmd, int cmdSize, MessageInfo* const info);
katrijnverhasselt 0:b40341017545 82
katrijnverhasselt 0:b40341017545 83 };