Gets messages form the pc and translates it to I2C and back.
Dependencies: DevInterfaces I2Cinterfaces MCP4725 mbed
Translator.h@2:2330ad8b1baa, 2016-06-15 (annotated)
- 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?
User | Revision | Line number | New 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 | }; |