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.
ICE-Application/src/ConfigurationHandler/Controls/SequenceControl.h@0:61364762ee0e, 2017-01-24 (annotated)
- Committer:
- jmarkel44
- Date:
- Tue Jan 24 19:05:33 2017 +0000
- Revision:
- 0:61364762ee0e
Port from IAR to Nucleo-F412 board
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jmarkel44 | 0:61364762ee0e | 1 | /****************************************************************************** |
jmarkel44 | 0:61364762ee0e | 2 | * |
jmarkel44 | 0:61364762ee0e | 3 | * File: SetpointControl.h |
jmarkel44 | 0:61364762ee0e | 4 | * Desciption: ICE Timer Control Class |
jmarkel44 | 0:61364762ee0e | 5 | * |
jmarkel44 | 0:61364762ee0e | 6 | *****************************************************************************/ |
jmarkel44 | 0:61364762ee0e | 7 | #ifndef SEQUENCECONTROL_H |
jmarkel44 | 0:61364762ee0e | 8 | #define SEQUENCECONTROL_H |
jmarkel44 | 0:61364762ee0e | 9 | |
jmarkel44 | 0:61364762ee0e | 10 | #include <global.h> |
jmarkel44 | 0:61364762ee0e | 11 | #include <string> |
jmarkel44 | 0:61364762ee0e | 12 | #include <stdio.h> |
jmarkel44 | 0:61364762ee0e | 13 | #include <vector> |
jmarkel44 | 0:61364762ee0e | 14 | |
jmarkel44 | 0:61364762ee0e | 15 | #define SEQUENCE_CONTROL_DEBUG |
jmarkel44 | 0:61364762ee0e | 16 | #define SEQUENCE_CONTROL_FILENAME_PREFIX "seq_" |
jmarkel44 | 0:61364762ee0e | 17 | |
jmarkel44 | 0:61364762ee0e | 18 | typedef enum { |
jmarkel44 | 0:61364762ee0e | 19 | SEQUENCE_CONTROL_OK, |
jmarkel44 | 0:61364762ee0e | 20 | SEQUENCE_CONTROL_UNK_STATE, |
jmarkel44 | 0:61364762ee0e | 21 | SEQUENCE_CONTROL_ERROR, |
jmarkel44 | 0:61364762ee0e | 22 | SEQUENCE_CONTROL_DESTROY, |
jmarkel44 | 0:61364762ee0e | 23 | SEQUENCE_CONTROL_BAD_CONTROL_TYPE, |
jmarkel44 | 0:61364762ee0e | 24 | SEQUENCE_CONTROL_BAD_ACTION |
jmarkel44 | 0:61364762ee0e | 25 | } SequenceControlError_t; |
jmarkel44 | 0:61364762ee0e | 26 | |
jmarkel44 | 0:61364762ee0e | 27 | //! SequenceControl - implements a sequence control that is comprised of |
jmarkel44 | 0:61364762ee0e | 28 | // sub-controls and operations to achieve a sequence of activities. |
jmarkel44 | 0:61364762ee0e | 29 | class SequenceControl |
jmarkel44 | 0:61364762ee0e | 30 | { |
jmarkel44 | 0:61364762ee0e | 31 | private: |
jmarkel44 | 0:61364762ee0e | 32 | std::string controlFile; // the control file |
jmarkel44 | 0:61364762ee0e | 33 | std::string id; // unique identifier |
jmarkel44 | 0:61364762ee0e | 34 | std::string startTrigger; // start trigger: once the start |
jmarkel44 | 0:61364762ee0e | 35 | // trigger evals to true, the |
jmarkel44 | 0:61364762ee0e | 36 | // control will start executing |
jmarkel44 | 0:61364762ee0e | 37 | // the entries in the sequence table |
jmarkel44 | 0:61364762ee0e | 38 | |
jmarkel44 | 0:61364762ee0e | 39 | typedef struct Action_tag { |
jmarkel44 | 0:61364762ee0e | 40 | std::string action; // create/delete/execute |
jmarkel44 | 0:61364762ee0e | 41 | std::string id; // control, vreg or script identifier |
jmarkel44 | 0:61364762ee0e | 42 | float value; // for assignment action |
jmarkel44 | 0:61364762ee0e | 43 | } Action_t; |
jmarkel44 | 0:61364762ee0e | 44 | |
jmarkel44 | 0:61364762ee0e | 45 | // A Sequence Entry: |
jmarkel44 | 0:61364762ee0e | 46 | // |
jmarkel44 | 0:61364762ee0e | 47 | // startTrigger -> an expression that evals to true |
jmarkel44 | 0:61364762ee0e | 48 | // actions[] -> list of actions to perform when the start condition is satisfied |
jmarkel44 | 0:61364762ee0e | 49 | // stopTrigger -> an expression that evals to true |
jmarkel44 | 0:61364762ee0e | 50 | // |
jmarkel44 | 0:61364762ee0e | 51 | typedef struct SequenceEntry_tag { |
jmarkel44 | 0:61364762ee0e | 52 | std::string startTrigger; // trigger to load the sequence |
jmarkel44 | 0:61364762ee0e | 53 | std::vector<Action_t> actions; // actions to perform |
jmarkel44 | 0:61364762ee0e | 54 | std::string stopTrigger; // trigger to load the next entry |
jmarkel44 | 0:61364762ee0e | 55 | } SequenceEntry; |
jmarkel44 | 0:61364762ee0e | 56 | |
jmarkel44 | 0:61364762ee0e | 57 | // the sequence table |
jmarkel44 | 0:61364762ee0e | 58 | std::vector<SequenceEntry> sequenceTable; |
jmarkel44 | 0:61364762ee0e | 59 | |
jmarkel44 | 0:61364762ee0e | 60 | // state machine information |
jmarkel44 | 0:61364762ee0e | 61 | enum SequenceControlState_t { |
jmarkel44 | 0:61364762ee0e | 62 | SEQ_STATE_INIT, // object successfully created |
jmarkel44 | 0:61364762ee0e | 63 | SEQ_STATE_START, // object programmatically started |
jmarkel44 | 0:61364762ee0e | 64 | SEQ_STATE_LOADING_NEXT_ENTRY, // loading the next entry (transient) |
jmarkel44 | 0:61364762ee0e | 65 | SEQ_STATE_WAITING_START, // waiting for entry start trigger(s) |
jmarkel44 | 0:61364762ee0e | 66 | SEQ_STATE_WAITING_STOP, // waiting for entry stop trigger(s) |
jmarkel44 | 0:61364762ee0e | 67 | SEQ_STATE_FINISHED, // finished with all entries in the sequence table |
jmarkel44 | 0:61364762ee0e | 68 | SEQ_STATE_FAILED, // something went awry |
jmarkel44 | 0:61364762ee0e | 69 | SEQ_STATE_MAX |
jmarkel44 | 0:61364762ee0e | 70 | }; |
jmarkel44 | 0:61364762ee0e | 71 | |
jmarkel44 | 0:61364762ee0e | 72 | SequenceControlState_t currentState; // control's current state |
jmarkel44 | 0:61364762ee0e | 73 | SequenceEntry currentEntry; // currently loaded entry in the seq table |
jmarkel44 | 0:61364762ee0e | 74 | unsigned int nextEntryIndex; // next entry index |
jmarkel44 | 0:61364762ee0e | 75 | |
jmarkel44 | 0:61364762ee0e | 76 | /// validate the contents of the control file |
jmarkel44 | 0:61364762ee0e | 77 | bool validateControlData(const char *); |
jmarkel44 | 0:61364762ee0e | 78 | |
jmarkel44 | 0:61364762ee0e | 79 | /// assign control data from control file to object data |
jmarkel44 | 0:61364762ee0e | 80 | void copyControlData(const char *); |
jmarkel44 | 0:61364762ee0e | 81 | |
jmarkel44 | 0:61364762ee0e | 82 | /// has the control starting trigger fired? |
jmarkel44 | 0:61364762ee0e | 83 | bool isControlStartTriggerOn(void); |
jmarkel44 | 0:61364762ee0e | 84 | |
jmarkel44 | 0:61364762ee0e | 85 | /// has the sequence entry starting trigger fired? |
jmarkel44 | 0:61364762ee0e | 86 | bool isCurrentEntryStartTriggerOn(void); |
jmarkel44 | 0:61364762ee0e | 87 | |
jmarkel44 | 0:61364762ee0e | 88 | /// has the sequence entry stopping trigger fired? |
jmarkel44 | 0:61364762ee0e | 89 | bool isCurrentEntryStopTriggerOn(void); |
jmarkel44 | 0:61364762ee0e | 90 | |
jmarkel44 | 0:61364762ee0e | 91 | /// load the next entry from the sequence table |
jmarkel44 | 0:61364762ee0e | 92 | bool loadNextEntry(void); |
jmarkel44 | 0:61364762ee0e | 93 | |
jmarkel44 | 0:61364762ee0e | 94 | /// perform the actions from the sequence entry |
jmarkel44 | 0:61364762ee0e | 95 | SequenceControlError_t performActions(void); |
jmarkel44 | 0:61364762ee0e | 96 | |
jmarkel44 | 0:61364762ee0e | 97 | /// create a control from the sequence table |
jmarkel44 | 0:61364762ee0e | 98 | SequenceControlError_t createSubControl(const std::string controlId, |
jmarkel44 | 0:61364762ee0e | 99 | Control_t type); |
jmarkel44 | 0:61364762ee0e | 100 | |
jmarkel44 | 0:61364762ee0e | 101 | /// delete a control from the sequence table |
jmarkel44 | 0:61364762ee0e | 102 | SequenceControlError_t destroySubControl(const std::string controlId, |
jmarkel44 | 0:61364762ee0e | 103 | Control_t type); |
jmarkel44 | 0:61364762ee0e | 104 | |
jmarkel44 | 0:61364762ee0e | 105 | /// assign a virtual register |
jmarkel44 | 0:61364762ee0e | 106 | bool assignRegister(const std::string id, float value); |
jmarkel44 | 0:61364762ee0e | 107 | |
jmarkel44 | 0:61364762ee0e | 108 | public: |
jmarkel44 | 0:61364762ee0e | 109 | /// create a sequence control |
jmarkel44 | 0:61364762ee0e | 110 | SequenceControl() { |
jmarkel44 | 0:61364762ee0e | 111 | currentState = SEQ_STATE_INIT; |
jmarkel44 | 0:61364762ee0e | 112 | nextEntryIndex = 0; |
jmarkel44 | 0:61364762ee0e | 113 | }; |
jmarkel44 | 0:61364762ee0e | 114 | /// destructor |
jmarkel44 | 0:61364762ee0e | 115 | ~SequenceControl() { |
jmarkel44 | 0:61364762ee0e | 116 | printf("\r%s invoked\n", __func__); |
jmarkel44 | 0:61364762ee0e | 117 | } |
jmarkel44 | 0:61364762ee0e | 118 | |
jmarkel44 | 0:61364762ee0e | 119 | /// load sequence control data from a JSON configuration file |
jmarkel44 | 0:61364762ee0e | 120 | bool load(std::string filename); |
jmarkel44 | 0:61364762ee0e | 121 | |
jmarkel44 | 0:61364762ee0e | 122 | /// start the sequence control |
jmarkel44 | 0:61364762ee0e | 123 | void start(void); |
jmarkel44 | 0:61364762ee0e | 124 | |
jmarkel44 | 0:61364762ee0e | 125 | /// the motor |
jmarkel44 | 0:61364762ee0e | 126 | SequenceControlError_t run(void); |
jmarkel44 | 0:61364762ee0e | 127 | |
jmarkel44 | 0:61364762ee0e | 128 | /// display the pertinents |
jmarkel44 | 0:61364762ee0e | 129 | void display(void); |
jmarkel44 | 0:61364762ee0e | 130 | |
jmarkel44 | 0:61364762ee0e | 131 | /// get sequence control identifier |
jmarkel44 | 0:61364762ee0e | 132 | std::string getId(void) const { return id; } |
jmarkel44 | 0:61364762ee0e | 133 | |
jmarkel44 | 0:61364762ee0e | 134 | /// get starting trigger |
jmarkel44 | 0:61364762ee0e | 135 | std::string getStartTrigger(void) const { return startTrigger; } |
jmarkel44 | 0:61364762ee0e | 136 | }; |
jmarkel44 | 0:61364762ee0e | 137 | |
jmarkel44 | 0:61364762ee0e | 138 | #endif |
jmarkel44 | 0:61364762ee0e | 139 |