Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: freemaster_lib mbed
main.cpp@2:030b58681ec2, 2014-11-16 (annotated)
- 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?
User | Revision | Line number | New 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 | } |