Jarda Pajskr / Mbed 2 deprecated FreeMASTER_HelloWorld3

Dependencies:   freemaster_lib mbed

Committer:
JardaPajskr
Date:
Sun Nov 16 20:56:51 2014 +0000
Revision:
2:030b58681ec2
Parent:
1:836c4e999046
added baudrate configuration

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JardaPajskr 0:5badcae332d8 1 #include "mbed.h"
JardaPajskr 0:5badcae332d8 2 #include "freemaster_class.h"
JardaPajskr 0:5badcae332d8 3 //Initialize FreeMASTER driver
JardaPajskr 0:5badcae332d8 4 Freemaster fm(USBTX, USBRX);
JardaPajskr 0:5badcae332d8 5
JardaPajskr 0:5badcae332d8 6 //Add global variables
JardaPajskr 0:5badcae332d8 7 /* Test variables, will be displayed in the FreeMASTER application */
JardaPajskr 0:5badcae332d8 8 volatile unsigned char var8;
JardaPajskr 0:5badcae332d8 9 volatile unsigned short var16;
JardaPajskr 1:836c4e999046 10 volatile unsigned short var16inc = 100;
JardaPajskr 0:5badcae332d8 11 volatile unsigned long var32;
JardaPajskr 0:5badcae332d8 12 volatile unsigned long var32inc = 100;
JardaPajskr 0:5badcae332d8 13 volatile unsigned char nAppCmdCounter;
JardaPajskr 0:5badcae332d8 14
JardaPajskr 0:5badcae332d8 15 /*
JardaPajskr 0:5badcae332d8 16 * Test structure types - demonstrates the "TSA" feature thanks to which the
JardaPajskr 0:5badcae332d8 17 * FreeMASTER is able to load a variable and type information directly from
JardaPajskr 0:5badcae332d8 18 * the embedded application.
JardaPajskr 0:5badcae332d8 19 *
JardaPajskr 0:5badcae332d8 20 */
JardaPajskr 0:5badcae332d8 21
JardaPajskr 0:5badcae332d8 22 typedef struct {
JardaPajskr 0:5badcae332d8 23
JardaPajskr 0:5badcae332d8 24 unsigned short aa;
JardaPajskr 0:5badcae332d8 25 unsigned long bb[2];
JardaPajskr 0:5badcae332d8 26 unsigned short cc;
JardaPajskr 0:5badcae332d8 27 unsigned long dd[3];
JardaPajskr 0:5badcae332d8 28 unsigned char ee;
JardaPajskr 0:5badcae332d8 29 unsigned char ff[5];
JardaPajskr 0:5badcae332d8 30 } INNER_STRUCT;
JardaPajskr 0:5badcae332d8 31
JardaPajskr 0:5badcae332d8 32 typedef struct {
JardaPajskr 0:5badcae332d8 33
JardaPajskr 0:5badcae332d8 34 unsigned short a;
JardaPajskr 0:5badcae332d8 35 unsigned long b;
JardaPajskr 0:5badcae332d8 36 INNER_STRUCT inA[4];
JardaPajskr 0:5badcae332d8 37 INNER_STRUCT inB;
JardaPajskr 0:5badcae332d8 38 } OUTER_STRUCT;
JardaPajskr 0:5badcae332d8 39
JardaPajskr 0:5badcae332d8 40 /* Structure type information will be available in the FreeMASTER application (TSA) */
JardaPajskr 0:5badcae332d8 41 OUTER_STRUCT so1, so2;
JardaPajskr 0:5badcae332d8 42 INNER_STRUCT si1, si2;
JardaPajskr 0:5badcae332d8 43
JardaPajskr 0:5badcae332d8 44 /* buffer for runtime definition of the TSA table */
JardaPajskr 0:5badcae332d8 45 static unsigned long tsatable[(4*20)]; //up to 20 variables to register
JardaPajskr 0:5badcae332d8 46
JardaPajskr 0:5badcae332d8 47 /////////////////////////////////////////////////////////////////////////
JardaPajskr 0:5badcae332d8 48
JardaPajskr 0:5badcae332d8 49 FMSTR_APPCMD_RESULT myhandler(FMSTR_APPCMD_CODE /*nAppcmd*/, FMSTR_APPCMD_PDATA /*pData*/, FMSTR_SIZE /*nDataLen*/);
JardaPajskr 0:5badcae332d8 50
JardaPajskr 0:5badcae332d8 51 /*
JardaPajskr 0:5badcae332d8 52 * With TSA enabled, the user describes the global and static variables using
JardaPajskr 0:5badcae332d8 53 * so-called TSA tables. There can be any number of tables defined in
JardaPajskr 0:5badcae332d8 54 * the project files. Each table does have the identifier which should be
JardaPajskr 0:5badcae332d8 55 * unique across the project.
JardaPajskr 0:5badcae332d8 56 *
JardaPajskr 0:5badcae332d8 57 * Note that you can declare variables as Read-Only or Read-Write.
JardaPajskr 0:5badcae332d8 58 * The FreeMASTER driver denies any write access to the Read-Only variables
JardaPajskr 0:5badcae332d8 59 * when TSA_SAFETY is enabled.
JardaPajskr 0:5badcae332d8 60 */
JardaPajskr 0:5badcae332d8 61
JardaPajskr 0:5badcae332d8 62 FMSTR_TSA_TABLE_BEGIN(first_table)
JardaPajskr 0:5badcae332d8 63 FMSTR_TSA_RW_VAR(var8, FMSTR_TSA_UINT8)
JardaPajskr 0:5badcae332d8 64 FMSTR_TSA_RO_VAR(var32, FMSTR_TSA_UINT32)
JardaPajskr 0:5badcae332d8 65 FMSTR_TSA_RW_VAR(var32inc, FMSTR_TSA_UINT32)
JardaPajskr 0:5badcae332d8 66 FMSTR_TSA_RW_VAR(so1, FMSTR_TSA_USERTYPE(OUTER_STRUCT))
JardaPajskr 0:5badcae332d8 67 FMSTR_TSA_RW_VAR(si1, FMSTR_TSA_USERTYPE(INNER_STRUCT))
JardaPajskr 0:5badcae332d8 68
JardaPajskr 0:5badcae332d8 69 FMSTR_TSA_STRUCT(OUTER_STRUCT)
JardaPajskr 0:5badcae332d8 70 FMSTR_TSA_MEMBER(OUTER_STRUCT, a, FMSTR_TSA_UINT16)
JardaPajskr 0:5badcae332d8 71 FMSTR_TSA_MEMBER(OUTER_STRUCT, b, FMSTR_TSA_UINT32)
JardaPajskr 0:5badcae332d8 72 FMSTR_TSA_MEMBER(OUTER_STRUCT, inA, FMSTR_TSA_USERTYPE(INNER_STRUCT))
JardaPajskr 0:5badcae332d8 73 FMSTR_TSA_MEMBER(OUTER_STRUCT, inB, FMSTR_TSA_USERTYPE(INNER_STRUCT))
JardaPajskr 0:5badcae332d8 74
JardaPajskr 0:5badcae332d8 75 FMSTR_TSA_STRUCT(INNER_STRUCT)
JardaPajskr 0:5badcae332d8 76 FMSTR_TSA_MEMBER(INNER_STRUCT, aa, FMSTR_TSA_UINT16)
JardaPajskr 0:5badcae332d8 77 FMSTR_TSA_MEMBER(INNER_STRUCT, bb, FMSTR_TSA_UINT32)
JardaPajskr 0:5badcae332d8 78 FMSTR_TSA_MEMBER(INNER_STRUCT, cc, FMSTR_TSA_SINT16)
JardaPajskr 0:5badcae332d8 79 FMSTR_TSA_MEMBER(INNER_STRUCT, dd, FMSTR_TSA_SINT32)
JardaPajskr 0:5badcae332d8 80 FMSTR_TSA_MEMBER(INNER_STRUCT, ee, FMSTR_TSA_UINT8)
JardaPajskr 0:5badcae332d8 81 FMSTR_TSA_MEMBER(INNER_STRUCT, ff, FMSTR_TSA_SINT8)
JardaPajskr 0:5badcae332d8 82 FMSTR_TSA_TABLE_END()
JardaPajskr 0:5badcae332d8 83
JardaPajskr 0:5badcae332d8 84 /*
JardaPajskr 0:5badcae332d8 85 * This is an example of another TSA table. Typically, you put one table
JardaPajskr 0:5badcae332d8 86 * to each .c file where your global or static variables are instantiated.
JardaPajskr 0:5badcae332d8 87 */
JardaPajskr 0:5badcae332d8 88
JardaPajskr 0:5badcae332d8 89 FMSTR_TSA_TABLE_BEGIN(next_table)
JardaPajskr 0:5badcae332d8 90 FMSTR_TSA_RO_VAR(so2, FMSTR_TSA_USERTYPE(OUTER_STRUCT))
JardaPajskr 0:5badcae332d8 91 FMSTR_TSA_RO_VAR(si2, FMSTR_TSA_USERTYPE(INNER_STRUCT))
JardaPajskr 0:5badcae332d8 92 FMSTR_TSA_TABLE_END()
JardaPajskr 0:5badcae332d8 93
JardaPajskr 0:5badcae332d8 94 //Registration of all variables to observe in the FreeMASTER tool
JardaPajskr 0:5badcae332d8 95 FMSTR_TSA_TABLE_LIST_BEGIN()
JardaPajskr 0:5badcae332d8 96 //Register all TSA tables
JardaPajskr 0:5badcae332d8 97 FMSTR_TSA_TABLE(first_table)
JardaPajskr 0:5badcae332d8 98 FMSTR_TSA_TABLE(next_table)
JardaPajskr 0:5badcae332d8 99 FMSTR_TSA_TABLE_LIST_END()
JardaPajskr 0:5badcae332d8 100
JardaPajskr 0:5badcae332d8 101 /*
JardaPajskr 0:5badcae332d8 102 * This function is registerred as a application command handler (see
JardaPajskr 0:5badcae332d8 103 * main() below. It gets automatically invoked when the FreeMASTER
JardaPajskr 0:5badcae332d8 104 * application sends appropriate application command.
JardaPajskr 0:5badcae332d8 105 *
JardaPajskr 0:5badcae332d8 106 */
JardaPajskr 0:5badcae332d8 107
JardaPajskr 0:5badcae332d8 108 FMSTR_APPCMD_RESULT myhandler(FMSTR_APPCMD_CODE nAppcmd, FMSTR_APPCMD_PDATA pData, FMSTR_SIZE nDataLen)
JardaPajskr 0:5badcae332d8 109 {
JardaPajskr 0:5badcae332d8 110 // the return value is used as the application command result code
JardaPajskr 0:5badcae332d8 111 return 0x10;
JardaPajskr 0:5badcae332d8 112 }
JardaPajskr 0:5badcae332d8 113
JardaPajskr 0:5badcae332d8 114
JardaPajskr 0:5badcae332d8 115 int main() {
JardaPajskr 2:030b58681ec2 116 //change baudrate to 9600
JardaPajskr 2:030b58681ec2 117 fm.baud(9600);
JardaPajskr 0:5badcae332d8 118 //register global or static variables to FreeMASTER driver
JardaPajskr 0:5badcae332d8 119 fm.TsaAddVar(FMSTR_TSA_RW_VAR_CFG(var16inc,FMSTR_TSA_UINT16));
JardaPajskr 0:5badcae332d8 120 //register read only variable to FreeMASTER driver
JardaPajskr 0:5badcae332d8 121 fm.TsaAddVar(FMSTR_TSA_RO_VAR_CFG(var16,FMSTR_TSA_UINT8));
JardaPajskr 0:5badcae332d8 122
JardaPajskr 0:5badcae332d8 123 while(1) {
JardaPajskr 0:5badcae332d8 124 //execute demo code
JardaPajskr 0:5badcae332d8 125 unsigned short nAppCmdCode;
JardaPajskr 0:5badcae332d8 126 // scope variables
JardaPajskr 0:5badcae332d8 127 var16 += var16inc;
JardaPajskr 0:5badcae332d8 128 var32 += var32inc;
JardaPajskr 0:5badcae332d8 129
JardaPajskr 0:5badcae332d8 130 // the application commands not registered with callback handlers
JardaPajskr 0:5badcae332d8 131 // can be detected and processed using the API calls below
JardaPajskr 0:5badcae332d8 132
JardaPajskr 0:5badcae332d8 133 // first, check if a new command has been received
JardaPajskr 0:5badcae332d8 134 nAppCmdCode = fm.GetAppCmd();
JardaPajskr 0:5badcae332d8 135
JardaPajskr 0:5badcae332d8 136 // when a new command arrives, the nAppCmdCode contains the application
JardaPajskr 0:5badcae332d8 137 // command code. In other case, the "NOCMD" special value is returned
JardaPajskr 0:5badcae332d8 138 if (nAppCmdCode != FMSTR_APPCMDRESULT_NOCMD)
JardaPajskr 0:5badcae332d8 139 {
JardaPajskr 0:5badcae332d8 140 nAppCmdCounter++;
JardaPajskr 0:5badcae332d8 141
JardaPajskr 0:5badcae332d8 142 // each command may have different processing and different
JardaPajskr 0:5badcae332d8 143 // result code. The command processing is finished by
JardaPajskr 0:5badcae332d8 144 // calling FMSTR_AppCmdAck() with the result code value
JardaPajskr 0:5badcae332d8 145 switch(nAppCmdCode)
JardaPajskr 0:5badcae332d8 146 {
JardaPajskr 0:5badcae332d8 147 case 1: fm.AppCmdAck(var8); break;
JardaPajskr 0:5badcae332d8 148 case 2: fm.AppCmdAck((unsigned char) ~var8); break;
JardaPajskr 0:5badcae332d8 149 default: fm.AppCmdAck(0); break;
JardaPajskr 0:5badcae332d8 150 }
JardaPajskr 0:5badcae332d8 151 }
JardaPajskr 0:5badcae332d8 152
JardaPajskr 0:5badcae332d8 153 // This call should be placed in the timer interrupt or anywhere where
JardaPajskr 0:5badcae332d8 154 // the recorder sampling should occur.
JardaPajskr 0:5badcae332d8 155 fm.Recorder();
JardaPajskr 0:5badcae332d8 156
JardaPajskr 0:5badcae332d8 157 // The FreeMASTER poll call must be called in the main application loop
JardaPajskr 0:5badcae332d8 158 // to handle the communication interface and protocol.
JardaPajskr 0:5badcae332d8 159 // In LONG_INTR FreeMASTER interrupt mode, all the processing is done
JardaPajskr 0:5badcae332d8 160 // during the communication interrupt routine and the FMSTR_Poll() is
JardaPajskr 0:5badcae332d8 161 // compiled empty.
JardaPajskr 0:5badcae332d8 162 fm.Poll();
JardaPajskr 0:5badcae332d8 163 wait(0.0025);
JardaPajskr 0:5badcae332d8 164 }
JardaPajskr 0:5badcae332d8 165 }