EasyCAT LAB - EtherCAT master legacy example

Dependencies:   SOEM SPI_STMPE610 SPI_TFT_ILI9341 TFT_fonts

The EasyCAT LAB is a complete educational and experimental EtherCAT® system, composed of one master and two slaves .

/media/uploads/EasyCAT/easycat_lab.jpg

/media/uploads/EasyCAT/components.jpg

Committer:
sulymarco
Date:
Tue Jun 11 10:19:08 2019 +0000
Revision:
0:7077d8f28b3e
Child:
2:7d4fd6354015
Added SPI speed parameter

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sulymarco 0:7077d8f28b3e 1 //********************************************************************************************
sulymarco 0:7077d8f28b3e 2 // *
sulymarco 0:7077d8f28b3e 3 // This software is distributed as an example, "AS IS", in the hope that it could *
sulymarco 0:7077d8f28b3e 4 // be useful, WITHOUT ANY WARRANTY of any kind, express or implied, included, but *
sulymarco 0:7077d8f28b3e 5 // not limited, to the warranties of merchantability, fitness for a particular *
sulymarco 0:7077d8f28b3e 6 // purpose, and non infringiment. In no event shall the authors be liable for any *
sulymarco 0:7077d8f28b3e 7 // claim, damages or other liability, arising from, or in connection with this software. *
sulymarco 0:7077d8f28b3e 8 // *
sulymarco 0:7077d8f28b3e 9 //********************************************************************************************
sulymarco 0:7077d8f28b3e 10
sulymarco 0:7077d8f28b3e 11
sulymarco 0:7077d8f28b3e 12 // The AB&T EasyCAT LAB is a complete experimental EtherCAT® system, composed by
sulymarco 0:7077d8f28b3e 13 // one master and two slaves.
sulymarco 0:7077d8f28b3e 14 // The EasyCAT LAB software is provided free of charge and its pourpose is to allow
sulymarco 0:7077d8f28b3e 15 // makers and educational institutes to experiment with the EtherCAT® protocol.
sulymarco 0:7077d8f28b3e 16 //
sulymarco 0:7077d8f28b3e 17 // The EasyCAT LAB is developed by "AB&T Tecnologie Informatiche" Via dell'About 2A Ivrea Italy.
sulymarco 0:7077d8f28b3e 18 // www.bausano.net
sulymarco 0:7077d8f28b3e 19 // www.easycatshield.com
sulymarco 0:7077d8f28b3e 20 //
sulymarco 0:7077d8f28b3e 21 // The EasyCAT LAB uses the SOEM library by rt:labs
sulymarco 0:7077d8f28b3e 22 // https://rt-labs.com/products/soem-ethercat-master-stack/
sulymarco 0:7077d8f28b3e 23 //
sulymarco 0:7077d8f28b3e 24 // EtherCAT® is a registered trademark and patented technology, licensed by Beckhoff Automation GmbH.
sulymarco 0:7077d8f28b3e 25 // www.beckhoff.com
sulymarco 0:7077d8f28b3e 26 // www.ethercat.org
sulymarco 0:7077d8f28b3e 27
sulymarco 0:7077d8f28b3e 28
sulymarco 0:7077d8f28b3e 29 #define ETH_TXBUFNB 16
sulymarco 0:7077d8f28b3e 30 #define ETH_RXBUFNB 16
sulymarco 0:7077d8f28b3e 31
sulymarco 0:7077d8f28b3e 32 #include "mbed.h"
sulymarco 0:7077d8f28b3e 33
sulymarco 0:7077d8f28b3e 34 #ifndef __align
sulymarco 0:7077d8f28b3e 35 #define __align MBED_ALIGN
sulymarco 0:7077d8f28b3e 36 #endif
sulymarco 0:7077d8f28b3e 37
sulymarco 0:7077d8f28b3e 38 #include "config.h"
sulymarco 0:7077d8f28b3e 39 #include "SPI_TFT_ILI9341.h"
sulymarco 0:7077d8f28b3e 40 #include "Arial12x12.h"
sulymarco 0:7077d8f28b3e 41 #include "Arial24x23.h"
sulymarco 0:7077d8f28b3e 42 #include "Arial28x28.h"
sulymarco 0:7077d8f28b3e 43 #include "font_big.h"
sulymarco 0:7077d8f28b3e 44 #include "soem_start.h"
sulymarco 0:7077d8f28b3e 45
sulymarco 0:7077d8f28b3e 46 #define CYCLE_TIME 1000 // master cycle time in uS
sulymarco 0:7077d8f28b3e 47 // 1000 = 1mS
sulymarco 0:7077d8f28b3e 48
sulymarco 0:7077d8f28b3e 49
sulymarco 0:7077d8f28b3e 50 #define SysMilliS() (uint32_t)Kernel::get_ms_count()
sulymarco 0:7077d8f28b3e 51
sulymarco 0:7077d8f28b3e 52 Serial pc(USBTX,USBRX,115200); // set the debug serial line speed to 115200
sulymarco 0:7077d8f28b3e 53
sulymarco 0:7077d8f28b3e 54
sulymarco 0:7077d8f28b3e 55 //---- TFT with resistive touchscreen pins -------------------------------------
sulymarco 0:7077d8f28b3e 56
sulymarco 0:7077d8f28b3e 57 // the display used is the SeeedStudio 2.8 inch TFT v2.0
sulymarco 0:7077d8f28b3e 58 // http://wiki.seeedstudio.com/2.8inch_TFT_Touch_Shield_v2.0/
sulymarco 0:7077d8f28b3e 59
sulymarco 0:7077d8f28b3e 60 #define PIN_YP A3 // resistive touchscreen
sulymarco 0:7077d8f28b3e 61 #define PIN_YM A1 //
sulymarco 0:7077d8f28b3e 62 #define PIN_XM A2 //
sulymarco 0:7077d8f28b3e 63 #define PIN_XP A0 //
sulymarco 0:7077d8f28b3e 64
sulymarco 0:7077d8f28b3e 65 #define PIN_MOSI D11 // TFT display SPI
sulymarco 0:7077d8f28b3e 66 #define PIN_MISO D12 //
sulymarco 0:7077d8f28b3e 67 #define PIN_SCLK D13 //
sulymarco 0:7077d8f28b3e 68 #define PIN_CS_TFT D5 //
sulymarco 0:7077d8f28b3e 69 #define PIN_DC_TFT D6 //
sulymarco 0:7077d8f28b3e 70
sulymarco 0:7077d8f28b3e 71
sulymarco 0:7077d8f28b3e 72 //---- touchscreen parameters --------------------------------------------------
sulymarco 0:7077d8f28b3e 73
sulymarco 0:7077d8f28b3e 74 #define TOUCH_SAMPLES 8
sulymarco 0:7077d8f28b3e 75 #define TOUCH_WINDOW 0.05
sulymarco 0:7077d8f28b3e 76 #define TOUCH_THRESHOLD 0.2
sulymarco 0:7077d8f28b3e 77 #define TOUCH_MAX_ROUNDS 16
sulymarco 0:7077d8f28b3e 78 #define TIME_TOUCH_RELEASED 300
sulymarco 0:7077d8f28b3e 79
sulymarco 0:7077d8f28b3e 80 #define TOUCH_X_OFFSET 0.118
sulymarco 0:7077d8f28b3e 81 #define TOUCH_X_GAIN 402
sulymarco 0:7077d8f28b3e 82
sulymarco 0:7077d8f28b3e 83 #define TOUCH_Y_OFFSET 0.090
sulymarco 0:7077d8f28b3e 84 #define TOUCH_Y_GAIN 302
sulymarco 0:7077d8f28b3e 85
sulymarco 0:7077d8f28b3e 86
sulymarco 0:7077d8f28b3e 87 //---- side menu parameters ----------------------------------------------------
sulymarco 0:7077d8f28b3e 88
sulymarco 0:7077d8f28b3e 89 #define MENU_Y 0
sulymarco 0:7077d8f28b3e 90 #define MENU_WIDTH 83
sulymarco 0:7077d8f28b3e 91 #define MENU_HEIGHT 42
sulymarco 0:7077d8f28b3e 92 #define MENU_X (319-MENU_WIDTH)
sulymarco 0:7077d8f28b3e 93
sulymarco 0:7077d8f28b3e 94
sulymarco 0:7077d8f28b3e 95 //---- slave parameters - LAB_1 EasyCAT with multifunction shield --------------
sulymarco 0:7077d8f28b3e 96
sulymarco 0:7077d8f28b3e 97 #define TERMO_X 55
sulymarco 0:7077d8f28b3e 98 #define TERMO_Y 185
sulymarco 0:7077d8f28b3e 99
sulymarco 0:7077d8f28b3e 100 #define ALARM_X 140
sulymarco 0:7077d8f28b3e 101 #define ALARM_Y 0
sulymarco 0:7077d8f28b3e 102 #define ALARM_WIDTH 83
sulymarco 0:7077d8f28b3e 103 #define ALARM_HEIGHT 42
sulymarco 0:7077d8f28b3e 104
sulymarco 0:7077d8f28b3e 105 #define TIME_BLINK 1000
sulymarco 0:7077d8f28b3e 106 #define TIME_AUTO_REP_START 1000
sulymarco 0:7077d8f28b3e 107 #define TIME_AUTO_REP_REPEAT 200
sulymarco 0:7077d8f28b3e 108
sulymarco 0:7077d8f28b3e 109
sulymarco 0:7077d8f28b3e 110 //---- slave parameters - LAB_2 EasyCAT with multifunction shield --------------
sulymarco 0:7077d8f28b3e 111
sulymarco 0:7077d8f28b3e 112 #define SEG_X 0
sulymarco 0:7077d8f28b3e 113 #define SEG_Y 0
sulymarco 0:7077d8f28b3e 114 #define SEG_WIDTH 42
sulymarco 0:7077d8f28b3e 115 #define SEG_HEIGHT 16
sulymarco 0:7077d8f28b3e 116 #define SEG_STEP 60
sulymarco 0:7077d8f28b3e 117
sulymarco 0:7077d8f28b3e 118 #define BUTTONS_X 38
sulymarco 0:7077d8f28b3e 119 #define BUTTONS_Y 80
sulymarco 0:7077d8f28b3e 120 #define BUTTONS_WIDTH 26
sulymarco 0:7077d8f28b3e 121 #define BUTTONS_R 3
sulymarco 0:7077d8f28b3e 122 #define BUTTONS_STEP 60
sulymarco 0:7077d8f28b3e 123
sulymarco 0:7077d8f28b3e 124 #define ANALOG_X 0
sulymarco 0:7077d8f28b3e 125 #define ANALOG_Y 120
sulymarco 0:7077d8f28b3e 126 #define ANALOG_WIDTH 222
sulymarco 0:7077d8f28b3e 127 #define ANALOG_HEIGHT 80
sulymarco 0:7077d8f28b3e 128
sulymarco 0:7077d8f28b3e 129 #define TIME_REP_SEG 300
sulymarco 0:7077d8f28b3e 130 #define TIME_POTENTIOMETER 100
sulymarco 0:7077d8f28b3e 131
sulymarco 0:7077d8f28b3e 132 /*
sulymarco 0:7077d8f28b3e 133 //---- slave 3 parameters - EL2004 ---------------------------------------------
sulymarco 0:7077d8f28b3e 134
sulymarco 0:7077d8f28b3e 135 #define OUT_X 0
sulymarco 0:7077d8f28b3e 136 #define OUT_Y 65
sulymarco 0:7077d8f28b3e 137 #define OUT_WIDTH 42
sulymarco 0:7077d8f28b3e 138 #define OUT_HEIGHT 42
sulymarco 0:7077d8f28b3e 139 #define OUT_STEP 60
sulymarco 0:7077d8f28b3e 140
sulymarco 0:7077d8f28b3e 141
sulymarco 0:7077d8f28b3e 142 //---- slave 4 parameters - EL1014 ---------------------------------------------
sulymarco 0:7077d8f28b3e 143
sulymarco 0:7077d8f28b3e 144 #define INPUTS_X 12
sulymarco 0:7077d8f28b3e 145 #define INPUTS_Y 84
sulymarco 0:7077d8f28b3e 146 #define INPUTS_WIDTH 26
sulymarco 0:7077d8f28b3e 147 #define INPUTS_R 3
sulymarco 0:7077d8f28b3e 148 #define INPUTS_STEP 60
sulymarco 0:7077d8f28b3e 149 */
sulymarco 0:7077d8f28b3e 150
sulymarco 0:7077d8f28b3e 151
sulymarco 0:7077d8f28b3e 152 //---- local functions ---------------------------------------------------------
sulymarco 0:7077d8f28b3e 153
sulymarco 0:7077d8f28b3e 154 void DrawBanner();
sulymarco 0:7077d8f28b3e 155 void DrawSlaveFixedParts();
sulymarco 0:7077d8f28b3e 156 void DrawSideMenu (uint8_t Slave);
sulymarco 0:7077d8f28b3e 157
sulymarco 0:7077d8f28b3e 158 void DrawTemperatureValue(float fValue);
sulymarco 0:7077d8f28b3e 159 void DrawAlarmSettings(float fThreshold, bool OnOff, bool MinMax);
sulymarco 0:7077d8f28b3e 160 void DrawOnlyThreshold(float fThreshold, bool OnOff, bool MinMax);
sulymarco 0:7077d8f28b3e 161 void DrawAlarmStatus(bool Alarm);
sulymarco 0:7077d8f28b3e 162 void DisplayInRect(int X, int Y, int X_off, int Y_off, char* Value, int BackColor, unsigned char* Font);
sulymarco 0:7077d8f28b3e 163
sulymarco 0:7077d8f28b3e 164 void DrawButtonsValue(uint8_t Value);
sulymarco 0:7077d8f28b3e 165 void DrawSegmentsValue(uint8_t Value);
sulymarco 0:7077d8f28b3e 166 void DrawPotentiometerValue(uint16_t PotValue);
sulymarco 0:7077d8f28b3e 167
sulymarco 0:7077d8f28b3e 168 void DrawOutputsValue(uint8_t Value);
sulymarco 0:7077d8f28b3e 169
sulymarco 0:7077d8f28b3e 170 void DrawInputsValue(uint8_t Value);
sulymarco 0:7077d8f28b3e 171
sulymarco 0:7077d8f28b3e 172
sulymarco 0:7077d8f28b3e 173
sulymarco 0:7077d8f28b3e 174 float ReadAnalog(AnalogIn Ana);
sulymarco 0:7077d8f28b3e 175
sulymarco 0:7077d8f28b3e 176
sulymarco 0:7077d8f28b3e 177 void Application();
sulymarco 0:7077d8f28b3e 178
sulymarco 0:7077d8f28b3e 179 void TouchScreenManagement();
sulymarco 0:7077d8f28b3e 180 bool TouchRead(uint16_t* X, uint16_t* Y);
sulymarco 0:7077d8f28b3e 181 uint16_t TouchRead_X();
sulymarco 0:7077d8f28b3e 182 uint16_t TouchRead_Y();
sulymarco 0:7077d8f28b3e 183 bool TouchRead_Z();
sulymarco 0:7077d8f28b3e 184
sulymarco 0:7077d8f28b3e 185
sulymarco 0:7077d8f28b3e 186
sulymarco 0:7077d8f28b3e 187 //---- global variables --------------------------------------------------------
sulymarco 0:7077d8f28b3e 188
sulymarco 0:7077d8f28b3e 189
sulymarco 0:7077d8f28b3e 190 bool TouchWasReleased;
sulymarco 0:7077d8f28b3e 191
sulymarco 0:7077d8f28b3e 192 bool FirstRound;
sulymarco 0:7077d8f28b3e 193
sulymarco 0:7077d8f28b3e 194 //------------------------------------------------------------------------------
sulymarco 0:7077d8f28b3e 195
sulymarco 0:7077d8f28b3e 196 SPI_TFT_ILI9341 TFT(PIN_MOSI, PIN_MISO, PIN_SCLK, PIN_CS_TFT, NC, PIN_DC_TFT);
sulymarco 0:7077d8f28b3e 197
sulymarco 0:7077d8f28b3e 198 Ticker SampleTicker;
sulymarco 0:7077d8f28b3e 199 Thread thread;
sulymarco 0:7077d8f28b3e 200
sulymarco 0:7077d8f28b3e 201 DigitalOut Test_1(D1); // debug test points
sulymarco 0:7077d8f28b3e 202 DigitalOut Test_2(D2); //
sulymarco 0:7077d8f28b3e 203 DigitalOut Test_3(D3); //
sulymarco 0:7077d8f28b3e 204 DigitalOut Test_4(D4); //
sulymarco 0:7077d8f28b3e 205
sulymarco 0:7077d8f28b3e 206
sulymarco 0:7077d8f28b3e 207 //------------------------------------------------------------------------------
sulymarco 0:7077d8f28b3e 208
sulymarco 0:7077d8f28b3e 209 float fAlarmThreshold;
sulymarco 0:7077d8f28b3e 210 bool AlarmOnOff;
sulymarco 0:7077d8f28b3e 211 bool AlarmMinMax;
sulymarco 0:7077d8f28b3e 212
sulymarco 0:7077d8f28b3e 213
sulymarco 0:7077d8f28b3e 214 uint16_t PotValue;
sulymarco 0:7077d8f28b3e 215 uint16_t PrevPotValue;
sulymarco 0:7077d8f28b3e 216 uint8_t Buttons;
sulymarco 0:7077d8f28b3e 217 uint8_t PrevButtons;
sulymarco 0:7077d8f28b3e 218 uint8_t Segments;
sulymarco 0:7077d8f28b3e 219 uint8_t PrevSegments;
sulymarco 0:7077d8f28b3e 220 int16_t Graph_x;
sulymarco 0:7077d8f28b3e 221
sulymarco 0:7077d8f28b3e 222 uint8_t Outputs;
sulymarco 0:7077d8f28b3e 223 uint8_t PrevOutputs;
sulymarco 0:7077d8f28b3e 224
sulymarco 0:7077d8f28b3e 225 uint8_t Inputs;
sulymarco 0:7077d8f28b3e 226 uint8_t PrevInputs;
sulymarco 0:7077d8f28b3e 227
sulymarco 0:7077d8f28b3e 228
sulymarco 0:7077d8f28b3e 229 int8_t VisuSlave;
sulymarco 0:7077d8f28b3e 230
sulymarco 0:7077d8f28b3e 231
sulymarco 0:7077d8f28b3e 232 //------------------------------------------------------------------------------
sulymarco 0:7077d8f28b3e 233
sulymarco 0:7077d8f28b3e 234 uint32_t Time;
sulymarco 0:7077d8f28b3e 235 uint32_t TimeBlink;
sulymarco 0:7077d8f28b3e 236 uint32_t TimeAutoRepeat;
sulymarco 0:7077d8f28b3e 237 uint32_t TimeAutoRepRepeat;
sulymarco 0:7077d8f28b3e 238 uint32_t TimePotentiometer;
sulymarco 0:7077d8f28b3e 239 uint32_t TimeTouchReleased;
sulymarco 0:7077d8f28b3e 240
sulymarco 0:7077d8f28b3e 241 bool Blink;
sulymarco 0:7077d8f28b3e 242
sulymarco 0:7077d8f28b3e 243 uint8_t TouchAxes = 0;
sulymarco 0:7077d8f28b3e 244 uint8_t Action = 0;
sulymarco 0:7077d8f28b3e 245
sulymarco 0:7077d8f28b3e 246 uint16_t X;
sulymarco 0:7077d8f28b3e 247 uint16_t Y;
sulymarco 0:7077d8f28b3e 248
sulymarco 0:7077d8f28b3e 249 float fTemperature;
sulymarco 0:7077d8f28b3e 250 float static fPrevTemperature;
sulymarco 0:7077d8f28b3e 251
sulymarco 0:7077d8f28b3e 252 int ExpectWorkCounter;
sulymarco 0:7077d8f28b3e 253 int WorkCounter;
sulymarco 0:7077d8f28b3e 254 int WorkCounterSafe;
sulymarco 0:7077d8f28b3e 255 bool NetworkError;
sulymarco 0:7077d8f28b3e 256 bool NetworkErrorSafe;
sulymarco 0:7077d8f28b3e 257
sulymarco 0:7077d8f28b3e 258 #define DATA_EXCHANGE_FLAG (1UL << 0)
sulymarco 0:7077d8f28b3e 259 #define APPLICATION_FLAG (1UL << 1)
sulymarco 0:7077d8f28b3e 260
sulymarco 0:7077d8f28b3e 261 EventFlags event_flags;
sulymarco 0:7077d8f28b3e 262
sulymarco 0:7077d8f28b3e 263 Mutex IO_data;
sulymarco 0:7077d8f28b3e 264
sulymarco 0:7077d8f28b3e 265
sulymarco 0:7077d8f28b3e 266 //---- data exchange thread ----------------------------------------------------
sulymarco 0:7077d8f28b3e 267
sulymarco 0:7077d8f28b3e 268 void ExchangeMaster()
sulymarco 0:7077d8f28b3e 269 {
sulymarco 0:7077d8f28b3e 270 while (true)
sulymarco 0:7077d8f28b3e 271 {
sulymarco 0:7077d8f28b3e 272
sulymarco 0:7077d8f28b3e 273
sulymarco 0:7077d8f28b3e 274 event_flags.wait_any(DATA_EXCHANGE_FLAG); // the thread waits for the synchronization flag
sulymarco 0:7077d8f28b3e 275
sulymarco 0:7077d8f28b3e 276 //Test_1 = 1;
sulymarco 0:7077d8f28b3e 277
sulymarco 0:7077d8f28b3e 278 IO_data.lock(); // Ethercat data exchange
sulymarco 0:7077d8f28b3e 279 ec_send_processdata(); //
sulymarco 0:7077d8f28b3e 280 WorkCounter = ec_receive_processdata(EC_TIMEOUTRET);
sulymarco 0:7077d8f28b3e 281
sulymarco 0:7077d8f28b3e 282 if (WorkCounter != ExpectWorkCounter)
sulymarco 0:7077d8f28b3e 283 NetworkError = true;
sulymarco 0:7077d8f28b3e 284 else
sulymarco 0:7077d8f28b3e 285 NetworkError = false;
sulymarco 0:7077d8f28b3e 286
sulymarco 0:7077d8f28b3e 287 IO_data.unlock(); //
sulymarco 0:7077d8f28b3e 288 event_flags.set(APPLICATION_FLAG); // synchronize the application
sulymarco 0:7077d8f28b3e 289
sulymarco 0:7077d8f28b3e 290 //Test_1 = 0;
sulymarco 0:7077d8f28b3e 291 }
sulymarco 0:7077d8f28b3e 292 }
sulymarco 0:7077d8f28b3e 293
sulymarco 0:7077d8f28b3e 294
sulymarco 0:7077d8f28b3e 295 //----- thicker generated sample time ------------------------------------------
sulymarco 0:7077d8f28b3e 296
sulymarco 0:7077d8f28b3e 297 void SampleIsr() // set the event that starts
sulymarco 0:7077d8f28b3e 298 { // the data exchange
sulymarco 0:7077d8f28b3e 299 event_flags.set(DATA_EXCHANGE_FLAG); //
sulymarco 0:7077d8f28b3e 300 } //
sulymarco 0:7077d8f28b3e 301
sulymarco 0:7077d8f28b3e 302
sulymarco 0:7077d8f28b3e 303 //****** initialization ********************************************************
sulymarco 0:7077d8f28b3e 304
sulymarco 0:7077d8f28b3e 305 int main()
sulymarco 0:7077d8f28b3e 306 {
sulymarco 0:7077d8f28b3e 307 int i;
sulymarco 0:7077d8f28b3e 308
sulymarco 0:7077d8f28b3e 309 printf("Start \n");
sulymarco 0:7077d8f28b3e 310
sulymarco 0:7077d8f28b3e 311 Test_1 = 0;
sulymarco 0:7077d8f28b3e 312 Test_2 = 0;
sulymarco 0:7077d8f28b3e 313 Test_3 = 0;
sulymarco 0:7077d8f28b3e 314 Test_4 = 0;
sulymarco 0:7077d8f28b3e 315
sulymarco 0:7077d8f28b3e 316 TFT.background(Black); // init TFT
sulymarco 0:7077d8f28b3e 317 TFT.cls(); //
sulymarco 0:7077d8f28b3e 318 TFT.set_orientation(3); //
sulymarco 0:7077d8f28b3e 319
sulymarco 0:7077d8f28b3e 320 DrawBanner();
sulymarco 0:7077d8f28b3e 321
sulymarco 0:7077d8f28b3e 322 NetworkError = false;
sulymarco 0:7077d8f28b3e 323 VisuSlave = LAB_1;
sulymarco 0:7077d8f28b3e 324
sulymarco 0:7077d8f28b3e 325 AlarmOnOff = true;
sulymarco 0:7077d8f28b3e 326 AlarmMinMax = false;
sulymarco 0:7077d8f28b3e 327 fAlarmThreshold = 28.8;
sulymarco 0:7077d8f28b3e 328 fTemperature = 0;
sulymarco 0:7077d8f28b3e 329 TouchWasReleased = true;
sulymarco 0:7077d8f28b3e 330
sulymarco 0:7077d8f28b3e 331
sulymarco 0:7077d8f28b3e 332 if (ec_init(NULL)) // init SOEM
sulymarco 0:7077d8f28b3e 333 {
sulymarco 0:7077d8f28b3e 334 printf("ec_init succeeded.\n");
sulymarco 0:7077d8f28b3e 335 printf("Scanning the network\n");
sulymarco 0:7077d8f28b3e 336
sulymarco 0:7077d8f28b3e 337 TFT.cls();
sulymarco 0:7077d8f28b3e 338
sulymarco 0:7077d8f28b3e 339 TFT.set_font((unsigned char*) Arial12x12);
sulymarco 0:7077d8f28b3e 340 TFT.foreground(Green);
sulymarco 0:7077d8f28b3e 341 TFT.locate(0, 0);
sulymarco 0:7077d8f28b3e 342
sulymarco 0:7077d8f28b3e 343 TFT.printf("Scanning the network\n");
sulymarco 0:7077d8f28b3e 344
sulymarco 0:7077d8f28b3e 345 if (network_scanning())
sulymarco 0:7077d8f28b3e 346 {
sulymarco 0:7077d8f28b3e 347 if (network_configuration()) // check network configuration
sulymarco 0:7077d8f28b3e 348 {
sulymarco 0:7077d8f28b3e 349 ec_config_map(&IOmap); // map the I/O
sulymarco 0:7077d8f28b3e 350 MapLocalStructures();
sulymarco 0:7077d8f28b3e 351
sulymarco 0:7077d8f28b3e 352 printf("\nSlaves mapped, state to SAFE_OP.\n");
sulymarco 0:7077d8f28b3e 353 // wait for all slaves to reach SAFE_OP state
sulymarco 0:7077d8f28b3e 354 ec_statecheck(0, EC_STATE_SAFE_OP, EC_TIMEOUTSTATE);
sulymarco 0:7077d8f28b3e 355
sulymarco 0:7077d8f28b3e 356 printf("Request operational state for all slaves\n");
sulymarco 0:7077d8f28b3e 357 ec_slave[0].state = EC_STATE_OPERATIONAL;
sulymarco 0:7077d8f28b3e 358
sulymarco 0:7077d8f28b3e 359 ec_send_processdata(); // send one valid process data to make outputs in slaves happy
sulymarco 0:7077d8f28b3e 360 ExpectWorkCounter = ec_receive_processdata(EC_TIMEOUTRET);
sulymarco 0:7077d8f28b3e 361
sulymarco 0:7077d8f28b3e 362 ec_writestate(0); // request OP state for all slaves
sulymarco 0:7077d8f28b3e 363
sulymarco 0:7077d8f28b3e 364 // wait for all slaves to reach OP state
sulymarco 0:7077d8f28b3e 365 ec_statecheck(0, EC_STATE_OPERATIONAL, EC_TIMEOUTSTATE);
sulymarco 0:7077d8f28b3e 366 if (ec_slave[0].state == EC_STATE_OPERATIONAL )
sulymarco 0:7077d8f28b3e 367 {
sulymarco 0:7077d8f28b3e 368 printf("Operational state reached for all slaves.\n");
sulymarco 0:7077d8f28b3e 369 }
sulymarco 0:7077d8f28b3e 370 else
sulymarco 0:7077d8f28b3e 371 {
sulymarco 0:7077d8f28b3e 372 printf("Not all slaves reached operational state.\n");
sulymarco 0:7077d8f28b3e 373 ec_readstate();
sulymarco 0:7077d8f28b3e 374 for(i = 1; i<=ec_slavecount ; i++)
sulymarco 0:7077d8f28b3e 375 {
sulymarco 0:7077d8f28b3e 376 if(ec_slave[i].state != EC_STATE_OPERATIONAL)
sulymarco 0:7077d8f28b3e 377 {
sulymarco 0:7077d8f28b3e 378 printf("Slave %d State=0x%04x StatusCode=0x%04x\n",
sulymarco 0:7077d8f28b3e 379 i, ec_slave[i].state, ec_slave[i].ALstatuscode);
sulymarco 0:7077d8f28b3e 380 }
sulymarco 0:7077d8f28b3e 381 }
sulymarco 0:7077d8f28b3e 382
sulymarco 0:7077d8f28b3e 383 TFT.foreground(Red);
sulymarco 0:7077d8f28b3e 384 TFT.locate(0, 0);
sulymarco 0:7077d8f28b3e 385 TFT.printf("Not all slaves reached operational state!");
sulymarco 0:7077d8f28b3e 386 while(1){}
sulymarco 0:7077d8f28b3e 387 }
sulymarco 0:7077d8f28b3e 388
sulymarco 0:7077d8f28b3e 389 DrawSlaveFixedParts();
sulymarco 0:7077d8f28b3e 390
sulymarco 0:7077d8f28b3e 391 thread.start(ExchangeMaster);
sulymarco 0:7077d8f28b3e 392 thread.set_priority(osPriorityRealtime);
sulymarco 0:7077d8f28b3e 393
sulymarco 0:7077d8f28b3e 394 SampleTicker.attach_us(&SampleIsr, CYCLE_TIME);
sulymarco 0:7077d8f28b3e 395
sulymarco 0:7077d8f28b3e 396 Application();
sulymarco 0:7077d8f28b3e 397 }
sulymarco 0:7077d8f28b3e 398
sulymarco 0:7077d8f28b3e 399 else
sulymarco 0:7077d8f28b3e 400 {
sulymarco 0:7077d8f28b3e 401 printf("Mismatch of network units!\n");
sulymarco 0:7077d8f28b3e 402 TFT.foreground(Red);
sulymarco 0:7077d8f28b3e 403 TFT.locate(0, 0);
sulymarco 0:7077d8f28b3e 404 TFT.printf("Mismatch of network units!");
sulymarco 0:7077d8f28b3e 405
sulymarco 0:7077d8f28b3e 406 while(1){}
sulymarco 0:7077d8f28b3e 407 }
sulymarco 0:7077d8f28b3e 408 }
sulymarco 0:7077d8f28b3e 409
sulymarco 0:7077d8f28b3e 410 else
sulymarco 0:7077d8f28b3e 411 {
sulymarco 0:7077d8f28b3e 412 printf("No slaves found!\n");
sulymarco 0:7077d8f28b3e 413 TFT.foreground(Red);
sulymarco 0:7077d8f28b3e 414 TFT.printf("No slaves found!");
sulymarco 0:7077d8f28b3e 415
sulymarco 0:7077d8f28b3e 416 while(1){}
sulymarco 0:7077d8f28b3e 417 }
sulymarco 0:7077d8f28b3e 418 }
sulymarco 0:7077d8f28b3e 419 else
sulymarco 0:7077d8f28b3e 420 {
sulymarco 0:7077d8f28b3e 421 printf("Ethernet interface init failed!");
sulymarco 0:7077d8f28b3e 422 TFT.foreground(Red);
sulymarco 0:7077d8f28b3e 423 TFT.locate(0, 0);
sulymarco 0:7077d8f28b3e 424 TFT.printf("Ethernet interface init failed!");
sulymarco 0:7077d8f28b3e 425 while(1){}
sulymarco 0:7077d8f28b3e 426 }
sulymarco 0:7077d8f28b3e 427 }
sulymarco 0:7077d8f28b3e 428
sulymarco 0:7077d8f28b3e 429
sulymarco 0:7077d8f28b3e 430 //****** user master application **********************************************
sulymarco 0:7077d8f28b3e 431
sulymarco 0:7077d8f28b3e 432 void Application()
sulymarco 0:7077d8f28b3e 433 {
sulymarco 0:7077d8f28b3e 434
sulymarco 0:7077d8f28b3e 435 while(1)
sulymarco 0:7077d8f28b3e 436 {
sulymarco 0:7077d8f28b3e 437 event_flags.wait_any(APPLICATION_FLAG); // the application waits for the synchronization flag
sulymarco 0:7077d8f28b3e 438
sulymarco 0:7077d8f28b3e 439 //Test_2 = 1;
sulymarco 0:7077d8f28b3e 440
sulymarco 0:7077d8f28b3e 441 IO_data.lock(); // copy the Ethercat data to a safe buffer
sulymarco 0:7077d8f28b3e 442 memcpy(&IOmapSafe[0], &IOmap[0], IO_MAP_SIZE); //
sulymarco 0:7077d8f28b3e 443 //
sulymarco 0:7077d8f28b3e 444 if (NetworkError) //
sulymarco 0:7077d8f28b3e 445 { //
sulymarco 0:7077d8f28b3e 446 NetworkErrorSafe = NetworkError; //
sulymarco 0:7077d8f28b3e 447 WorkCounterSafe = WorkCounter; //
sulymarco 0:7077d8f28b3e 448 } //
sulymarco 0:7077d8f28b3e 449 IO_data.unlock(); //
sulymarco 0:7077d8f28b3e 450
sulymarco 0:7077d8f28b3e 451 if (NetworkErrorSafe)
sulymarco 0:7077d8f28b3e 452 {
sulymarco 0:7077d8f28b3e 453 TFT.rect(35,50, 285, 182, Red);
sulymarco 0:7077d8f28b3e 454 TFT.fillrect(36,51, 284, 181, Black);
sulymarco 0:7077d8f28b3e 455 TFT.foreground(Red);
sulymarco 0:7077d8f28b3e 456 TFT.set_font((unsigned char*) Arial28x28);
sulymarco 0:7077d8f28b3e 457 TFT.locate(58, 65);
sulymarco 0:7077d8f28b3e 458 TFT.printf("Network error!");
sulymarco 0:7077d8f28b3e 459 printf("Network error!\n");
sulymarco 0:7077d8f28b3e 460 TFT.foreground(Magenta);
sulymarco 0:7077d8f28b3e 461 TFT.set_font((unsigned char*) Arial12x12);
sulymarco 0:7077d8f28b3e 462 TFT.locate(58, 106);
sulymarco 0:7077d8f28b3e 463
sulymarco 0:7077d8f28b3e 464 if(WorkCounterSafe >= 0)
sulymarco 0:7077d8f28b3e 465 {
sulymarco 0:7077d8f28b3e 466 TFT.printf("Expected working counter %d", ExpectWorkCounter);
sulymarco 0:7077d8f28b3e 467 TFT.locate(58, 118);
sulymarco 0:7077d8f28b3e 468 TFT.printf("Actual working counter %d", WorkCounterSafe);
sulymarco 0:7077d8f28b3e 469 printf("Expected working counter %d\n", ExpectWorkCounter);
sulymarco 0:7077d8f28b3e 470 printf("Actual working counter %d\n", WorkCounterSafe);
sulymarco 0:7077d8f28b3e 471 }
sulymarco 0:7077d8f28b3e 472 else
sulymarco 0:7077d8f28b3e 473 {
sulymarco 0:7077d8f28b3e 474 TFT.printf("Timeout");
sulymarco 0:7077d8f28b3e 475 printf("Timeout\n");
sulymarco 0:7077d8f28b3e 476 }
sulymarco 0:7077d8f28b3e 477
sulymarco 0:7077d8f28b3e 478 TFT.foreground(Green);
sulymarco 0:7077d8f28b3e 479 TFT.locate(58, 142);
sulymarco 0:7077d8f28b3e 480 TFT.printf("Please fix the error and");
sulymarco 0:7077d8f28b3e 481 TFT.locate(58, 154);
sulymarco 0:7077d8f28b3e 482 TFT.printf("press the reset button");
sulymarco 0:7077d8f28b3e 483 printf("Please fix the error and press the reset button \n");
sulymarco 0:7077d8f28b3e 484
sulymarco 0:7077d8f28b3e 485 SampleTicker.detach(); // stop the sample interrupt
sulymarco 0:7077d8f28b3e 486 while(1){} // and loop for ever
sulymarco 0:7077d8f28b3e 487 }
sulymarco 0:7077d8f28b3e 488
sulymarco 0:7077d8f28b3e 489 //----- slave 1 data management ------------
sulymarco 0:7077d8f28b3e 490
sulymarco 0:7077d8f28b3e 491 fTemperature = in_LAB_1->Temperature; // read the temperature
sulymarco 0:7077d8f28b3e 492
sulymarco 0:7077d8f28b3e 493 if (fTemperature != fPrevTemperature) // check if the temperature has changed
sulymarco 0:7077d8f28b3e 494 {
sulymarco 0:7077d8f28b3e 495 fPrevTemperature = fTemperature; // remember the current temperature value
sulymarco 0:7077d8f28b3e 496
sulymarco 0:7077d8f28b3e 497 if (VisuSlave == LAB_1) // if the HMI is setted to slave 1
sulymarco 0:7077d8f28b3e 498 { // visualize it
sulymarco 0:7077d8f28b3e 499 DrawTemperatureValue (fTemperature); //
sulymarco 0:7077d8f28b3e 500 }
sulymarco 0:7077d8f28b3e 501 }
sulymarco 0:7077d8f28b3e 502
sulymarco 0:7077d8f28b3e 503 bool AlarmStatus;
sulymarco 0:7077d8f28b3e 504 if (AlarmOnOff) // check if we are in alarm
sulymarco 0:7077d8f28b3e 505 { //
sulymarco 0:7077d8f28b3e 506 if ((AlarmMinMax && (fTemperature < fAlarmThreshold)) || (!AlarmMinMax && (fTemperature > fAlarmThreshold)))
sulymarco 0:7077d8f28b3e 507 {
sulymarco 0:7077d8f28b3e 508 out_LAB_1->Alarm = 0x01; // signal the alarm condition to the slave
sulymarco 0:7077d8f28b3e 509 AlarmStatus = true; // and to remember it
sulymarco 0:7077d8f28b3e 510 }
sulymarco 0:7077d8f28b3e 511 else
sulymarco 0:7077d8f28b3e 512 {
sulymarco 0:7077d8f28b3e 513 out_LAB_1->Alarm = 0x00; // signal the no alarm condition to the slave
sulymarco 0:7077d8f28b3e 514 AlarmStatus = false; // and remember it
sulymarco 0:7077d8f28b3e 515 }
sulymarco 0:7077d8f28b3e 516 }
sulymarco 0:7077d8f28b3e 517 else
sulymarco 0:7077d8f28b3e 518 {
sulymarco 0:7077d8f28b3e 519 out_LAB_1->Alarm = 0x00; // signal the no alarm condition to the slave
sulymarco 0:7077d8f28b3e 520 AlarmStatus = false; // and remember it
sulymarco 0:7077d8f28b3e 521 }
sulymarco 0:7077d8f28b3e 522
sulymarco 0:7077d8f28b3e 523 if (VisuSlave == LAB_1) // if the HMI is set to slave 1
sulymarco 0:7077d8f28b3e 524 { //
sulymarco 0:7077d8f28b3e 525 DrawAlarmStatus(AlarmStatus); // update the alarm status on the TFT
sulymarco 0:7077d8f28b3e 526 }
sulymarco 0:7077d8f28b3e 527
sulymarco 0:7077d8f28b3e 528 if (VisuSlave == LAB_1 && FirstRound) // if the HMI is set to slave 1
sulymarco 0:7077d8f28b3e 529 { // and it is the first time
sulymarco 0:7077d8f28b3e 530 FirstRound = false; //
sulymarco 0:7077d8f28b3e 531 DrawTemperatureValue (fTemperature); // draw the current temperature value
sulymarco 0:7077d8f28b3e 532 DrawAlarmSettings(fAlarmThreshold, AlarmOnOff, AlarmMinMax); // draw the alarm settings
sulymarco 0:7077d8f28b3e 533 }
sulymarco 0:7077d8f28b3e 534
sulymarco 0:7077d8f28b3e 535 //----- end LAB_1 ------------------------
sulymarco 0:7077d8f28b3e 536
sulymarco 0:7077d8f28b3e 537
sulymarco 0:7077d8f28b3e 538 //----- slave 2 data management ------------
sulymarco 0:7077d8f28b3e 539
sulymarco 0:7077d8f28b3e 540 PotValue = in_LAB_2->Potentiometer; // read the potentiometer value
sulymarco 0:7077d8f28b3e 541
sulymarco 0:7077d8f28b3e 542 if (VisuSlave == LAB_2) // if the HMI is setted to slave 2
sulymarco 0:7077d8f28b3e 543 { //
sulymarco 0:7077d8f28b3e 544 Time = SysMilliS(); // and the visualization timer is elapsed
sulymarco 0:7077d8f28b3e 545 if (Time-TimePotentiometer > TIME_POTENTIOMETER) //
sulymarco 0:7077d8f28b3e 546 { // draw the potentiometer value
sulymarco 0:7077d8f28b3e 547 TimePotentiometer = Time; //
sulymarco 0:7077d8f28b3e 548 DrawPotentiometerValue(PotValue); //
sulymarco 0:7077d8f28b3e 549 } //
sulymarco 0:7077d8f28b3e 550 }
sulymarco 0:7077d8f28b3e 551
sulymarco 0:7077d8f28b3e 552 Buttons = in_LAB_2->Buttons; // read the buttons status from the slave
sulymarco 0:7077d8f28b3e 553
sulymarco 0:7077d8f28b3e 554 if (Buttons != PrevButtons) // check if the buttons value has changed
sulymarco 0:7077d8f28b3e 555 {
sulymarco 0:7077d8f28b3e 556 PrevButtons = Buttons; // remember the current buttons value
sulymarco 0:7077d8f28b3e 557
sulymarco 0:7077d8f28b3e 558 if (VisuSlave == LAB_2) // if the HMI is setted to slave 2
sulymarco 0:7077d8f28b3e 559 { //
sulymarco 0:7077d8f28b3e 560 DrawButtonsValue(Buttons); // draw the current buttons value
sulymarco 0:7077d8f28b3e 561 } //
sulymarco 0:7077d8f28b3e 562 }
sulymarco 0:7077d8f28b3e 563
sulymarco 0:7077d8f28b3e 564 if (Segments != PrevSegments) // check if the segments value has changed
sulymarco 0:7077d8f28b3e 565 {
sulymarco 0:7077d8f28b3e 566 PrevSegments = Segments; // remember the current segments value
sulymarco 0:7077d8f28b3e 567
sulymarco 0:7077d8f28b3e 568 if (VisuSlave == LAB_2) // if the HMI is setted to slave 2
sulymarco 0:7077d8f28b3e 569 { //
sulymarco 0:7077d8f28b3e 570 DrawSegmentsValue(Segments); // draw the current segments value
sulymarco 0:7077d8f28b3e 571 } //
sulymarco 0:7077d8f28b3e 572 }
sulymarco 0:7077d8f28b3e 573
sulymarco 0:7077d8f28b3e 574 if (VisuSlave == LAB_2 && FirstRound) // if the HMI is set to slave 2
sulymarco 0:7077d8f28b3e 575 { // and it is the first time
sulymarco 0:7077d8f28b3e 576 FirstRound = false; //
sulymarco 0:7077d8f28b3e 577 //
sulymarco 0:7077d8f28b3e 578 DrawButtonsValue(Buttons); // draw the current buttons value
sulymarco 0:7077d8f28b3e 579 DrawSegmentsValue(Segments); // draw the current segments value
sulymarco 0:7077d8f28b3e 580 }
sulymarco 0:7077d8f28b3e 581
sulymarco 0:7077d8f28b3e 582 out_LAB_2->Segments = Segments; // send the segments status to the slave
sulymarco 0:7077d8f28b3e 583
sulymarco 0:7077d8f28b3e 584
sulymarco 0:7077d8f28b3e 585 //----- end LAB_2 ------------------------
sulymarco 0:7077d8f28b3e 586
sulymarco 0:7077d8f28b3e 587
sulymarco 0:7077d8f28b3e 588 /*
sulymarco 0:7077d8f28b3e 589 //----- slave 3 EL2004 data management -----
sulymarco 0:7077d8f28b3e 590
sulymarco 0:7077d8f28b3e 591 if (Outputs != PrevOutputs) // check if the outputs value has changed
sulymarco 0:7077d8f28b3e 592 {
sulymarco 0:7077d8f28b3e 593 PrevOutputs = Outputs; // remember the current outputs value
sulymarco 0:7077d8f28b3e 594
sulymarco 0:7077d8f28b3e 595 if (VisuSlave == EL2004) // if the HMI is setted to slave 3
sulymarco 0:7077d8f28b3e 596 { //
sulymarco 0:7077d8f28b3e 597 DrawOutputsValue(Outputs); // draw the current Outputs value
sulymarco 0:7077d8f28b3e 598 } //
sulymarco 0:7077d8f28b3e 599 }
sulymarco 0:7077d8f28b3e 600
sulymarco 0:7077d8f28b3e 601 if (VisuSlave == EL2004 && FirstRound) // if the HMI is set to slave 3
sulymarco 0:7077d8f28b3e 602 { // and it is the first time
sulymarco 0:7077d8f28b3e 603 FirstRound = false; //
sulymarco 0:7077d8f28b3e 604 //
sulymarco 0:7077d8f28b3e 605 DrawOutputsValue(Outputs); // draw the current Outputs value
sulymarco 0:7077d8f28b3e 606 }
sulymarco 0:7077d8f28b3e 607
sulymarco 0:7077d8f28b3e 608 if (Outputs & 0x01) // send the Outputs status to the slave
sulymarco 0:7077d8f28b3e 609 out_EL2004->Out_0 = 1; //
sulymarco 0:7077d8f28b3e 610 else //
sulymarco 0:7077d8f28b3e 611 out_EL2004->Out_0 = 0; //
sulymarco 0:7077d8f28b3e 612 if (Outputs & 0x02) //
sulymarco 0:7077d8f28b3e 613 out_EL2004->Out_1 = 1; //
sulymarco 0:7077d8f28b3e 614 else //
sulymarco 0:7077d8f28b3e 615 out_EL2004->Out_1 = 0; //
sulymarco 0:7077d8f28b3e 616 if (Outputs & 0x04) //
sulymarco 0:7077d8f28b3e 617 out_EL2004->Out_2 = 1; //
sulymarco 0:7077d8f28b3e 618 else //
sulymarco 0:7077d8f28b3e 619 out_EL2004->Out_2 = 0; //
sulymarco 0:7077d8f28b3e 620 if (Outputs & 0x08) //
sulymarco 0:7077d8f28b3e 621 out_EL2004->Out_3 = 1; //
sulymarco 0:7077d8f28b3e 622 else //
sulymarco 0:7077d8f28b3e 623 out_EL2004->Out_3 = 0; //
sulymarco 0:7077d8f28b3e 624
sulymarco 0:7077d8f28b3e 625 //----- end EL2004 -----------------------
sulymarco 0:7077d8f28b3e 626
sulymarco 0:7077d8f28b3e 627
sulymarco 0:7077d8f28b3e 628 //----- slave 4 EL1014 data management -----
sulymarco 0:7077d8f28b3e 629 Inputs = 0;
sulymarco 0:7077d8f28b3e 630 if (in_EL1014->In_0) // read the inputs status from the slave
sulymarco 0:7077d8f28b3e 631 Inputs |= 0x01; //
sulymarco 0:7077d8f28b3e 632 if (in_EL1014->In_1) //
sulymarco 0:7077d8f28b3e 633 Inputs |= 0x02; //
sulymarco 0:7077d8f28b3e 634 if (in_EL1014->In_2) //
sulymarco 0:7077d8f28b3e 635 Inputs |= 0x04; //
sulymarco 0:7077d8f28b3e 636 if (in_EL1014->In_3) //
sulymarco 0:7077d8f28b3e 637 Inputs |= 0x08; //
sulymarco 0:7077d8f28b3e 638
sulymarco 0:7077d8f28b3e 639 if (Inputs != PrevInputs) // check if the inputs value has changed
sulymarco 0:7077d8f28b3e 640 {
sulymarco 0:7077d8f28b3e 641 PrevInputs = Inputs; // remember the current inputs value
sulymarco 0:7077d8f28b3e 642
sulymarco 0:7077d8f28b3e 643 if (VisuSlave == EL1014) // if the HMI is setted to slave 4
sulymarco 0:7077d8f28b3e 644 { //
sulymarco 0:7077d8f28b3e 645 DrawInputsValue(Inputs); // draw the current inputs value
sulymarco 0:7077d8f28b3e 646 } //
sulymarco 0:7077d8f28b3e 647 }
sulymarco 0:7077d8f28b3e 648 //----- end EL1014 -----------------------
sulymarco 0:7077d8f28b3e 649 */
sulymarco 0:7077d8f28b3e 650
sulymarco 0:7077d8f28b3e 651 TouchScreenManagement(); // check if the touchscreen is tapped
sulymarco 0:7077d8f28b3e 652 // and handle it
sulymarco 0:7077d8f28b3e 653
sulymarco 0:7077d8f28b3e 654 Time = SysMilliS(); // toggle the variable Blink every
sulymarco 0:7077d8f28b3e 655 if ((Time-TimeBlink) > TIME_BLINK) // TIME_BLINK mS
sulymarco 0:7077d8f28b3e 656 { //
sulymarco 0:7077d8f28b3e 657 TimeBlink = Time; // we use it to blink a field on the TFT
sulymarco 0:7077d8f28b3e 658 Blink = !Blink; //
sulymarco 0:7077d8f28b3e 659 }
sulymarco 0:7077d8f28b3e 660
sulymarco 0:7077d8f28b3e 661 IO_data.lock(); // copy the IO data from the safe area
sulymarco 0:7077d8f28b3e 662 memcpy(&IOmap[0], &IOmapSafe[0], IO_MAP_SIZE); // to the EtherCAT buffer
sulymarco 0:7077d8f28b3e 663 IO_data.unlock(); //
sulymarco 0:7077d8f28b3e 664
sulymarco 0:7077d8f28b3e 665 //Test_2 = 0;
sulymarco 0:7077d8f28b3e 666 }
sulymarco 0:7077d8f28b3e 667 }
sulymarco 0:7077d8f28b3e 668
sulymarco 0:7077d8f28b3e 669
sulymarco 0:7077d8f28b3e 670 //******************************************************************************
sulymarco 0:7077d8f28b3e 671
sulymarco 0:7077d8f28b3e 672
sulymarco 0:7077d8f28b3e 673
sulymarco 0:7077d8f28b3e 674 //******* general functions ****************************************************
sulymarco 0:7077d8f28b3e 675
sulymarco 0:7077d8f28b3e 676
sulymarco 0:7077d8f28b3e 677 //------ touchscreen management ------------------------------------------------
sulymarco 0:7077d8f28b3e 678
sulymarco 0:7077d8f28b3e 679 void TouchScreenManagement()
sulymarco 0:7077d8f28b3e 680 {
sulymarco 0:7077d8f28b3e 681 uint16_t X;
sulymarco 0:7077d8f28b3e 682 uint16_t Y;
sulymarco 0:7077d8f28b3e 683
sulymarco 0:7077d8f28b3e 684 int i;
sulymarco 0:7077d8f28b3e 685
sulymarco 0:7077d8f28b3e 686
sulymarco 0:7077d8f28b3e 687 if (TouchRead(&X, &Y)) // the touchscreen has been tapped
sulymarco 0:7077d8f28b3e 688 {
sulymarco 0:7077d8f28b3e 689 TimeTouchReleased = SysMilliS();
sulymarco 0:7077d8f28b3e 690 // check if it is the side menu
sulymarco 0:7077d8f28b3e 691 // decrement slave button
sulymarco 0:7077d8f28b3e 692 if ((X>MENU_X) && (X>MENU_X+MENU_WIDTH/2) && (Y>MENU_HEIGHT) && (Y<MENU_HEIGHT*2))
sulymarco 0:7077d8f28b3e 693 { //
sulymarco 0:7077d8f28b3e 694 VisuSlave--;
sulymarco 0:7077d8f28b3e 695
sulymarco 0:7077d8f28b3e 696 if (VisuSlave == 0) //
sulymarco 0:7077d8f28b3e 697 VisuSlave = SLAVE_NUM; //
sulymarco 0:7077d8f28b3e 698 // the visualized slave has changed
sulymarco 0:7077d8f28b3e 699 DrawSlaveFixedParts(); // draw the new slave fixed parts
sulymarco 0:7077d8f28b3e 700 } //
sulymarco 0:7077d8f28b3e 701
sulymarco 0:7077d8f28b3e 702 // check if it is the side menu
sulymarco 0:7077d8f28b3e 703 // increment slave button
sulymarco 0:7077d8f28b3e 704 if ((X>MENU_X) && (X<MENU_X+MENU_WIDTH/2) && (Y>MENU_HEIGHT) && (Y<MENU_HEIGHT*2))
sulymarco 0:7077d8f28b3e 705 { //
sulymarco 0:7077d8f28b3e 706 VisuSlave++;
sulymarco 0:7077d8f28b3e 707
sulymarco 0:7077d8f28b3e 708 if (VisuSlave > SLAVE_NUM) //
sulymarco 0:7077d8f28b3e 709 VisuSlave = LAB_1; //
sulymarco 0:7077d8f28b3e 710 // the visualized slave has changed
sulymarco 0:7077d8f28b3e 711 DrawSlaveFixedParts(); // draw the new slave fixed parts
sulymarco 0:7077d8f28b3e 712 } //
sulymarco 0:7077d8f28b3e 713
sulymarco 0:7077d8f28b3e 714 switch (VisuSlave) // check which slave is visualized on the TFT
sulymarco 0:7077d8f28b3e 715 {
sulymarco 0:7077d8f28b3e 716 case (LAB_1): //-------------- slave 1 -----------------------
sulymarco 0:7077d8f28b3e 717
sulymarco 0:7077d8f28b3e 718
sulymarco 0:7077d8f28b3e 719 if(TouchWasReleased) // first check if the touch was
sulymarco 0:7077d8f28b3e 720 { // not tapped in the previous rounds
sulymarco 0:7077d8f28b3e 721 TouchWasReleased = false; // because for the following fields
sulymarco 0:7077d8f28b3e 722 TimeTouchReleased = SysMilliS(); // we don't want autorepeat
sulymarco 0:7077d8f28b3e 723
sulymarco 0:7077d8f28b3e 724 TimeAutoRepeat = SysMilliS(); // reload the autorepeat time
sulymarco 0:7077d8f28b3e 725
sulymarco 0:7077d8f28b3e 726 // handle taps on the ">" and "<" buttons
sulymarco 0:7077d8f28b3e 727 if ((X>ALARM_X) && (X<ALARM_X+(ALARM_WIDTH/2)) && (Y>ALARM_Y+ALARM_HEIGHT) && (Y<ALARM_Y+ALARM_HEIGHT*2))
sulymarco 0:7077d8f28b3e 728 { //
sulymarco 0:7077d8f28b3e 729 AlarmMinMax = true; //
sulymarco 0:7077d8f28b3e 730 DrawAlarmSettings(fAlarmThreshold, AlarmOnOff, AlarmMinMax);
sulymarco 0:7077d8f28b3e 731 } //
sulymarco 0:7077d8f28b3e 732 if ((X>ALARM_X+(ALARM_WIDTH/2)) && (X<ALARM_X+(ALARM_WIDTH)) && (Y>ALARM_Y+ALARM_HEIGHT) && (Y<ALARM_Y+ALARM_HEIGHT*2)) //
sulymarco 0:7077d8f28b3e 733 { //
sulymarco 0:7077d8f28b3e 734 AlarmMinMax = false; //
sulymarco 0:7077d8f28b3e 735 DrawAlarmSettings(fAlarmThreshold, AlarmOnOff, AlarmMinMax);
sulymarco 0:7077d8f28b3e 736 }
sulymarco 0:7077d8f28b3e 737
sulymarco 0:7077d8f28b3e 738 // handle taps on the "ON" and "OFF" buttons
sulymarco 0:7077d8f28b3e 739 if ((X>ALARM_X) && (X<ALARM_X+(ALARM_WIDTH/2)) && (Y>ALARM_Y) && (Y<ALARM_Y+ALARM_HEIGHT))
sulymarco 0:7077d8f28b3e 740 { //
sulymarco 0:7077d8f28b3e 741 AlarmOnOff = true; //
sulymarco 0:7077d8f28b3e 742 DrawAlarmSettings(fAlarmThreshold, AlarmOnOff, AlarmMinMax);
sulymarco 0:7077d8f28b3e 743 } //
sulymarco 0:7077d8f28b3e 744 if ((X>ALARM_X+(ALARM_WIDTH/2)) && (X<ALARM_X+(ALARM_WIDTH)) && (Y>ALARM_Y) && (Y<ALARM_Y+ALARM_HEIGHT))
sulymarco 0:7077d8f28b3e 745 { //
sulymarco 0:7077d8f28b3e 746 AlarmOnOff = false; //
sulymarco 0:7077d8f28b3e 747 DrawAlarmSettings(fAlarmThreshold, AlarmOnOff, AlarmMinMax);
sulymarco 0:7077d8f28b3e 748 }
sulymarco 0:7077d8f28b3e 749
sulymarco 0:7077d8f28b3e 750 // handle taps on the "+" and "-" buttons
sulymarco 0:7077d8f28b3e 751 // here we don't use the autorepeat to increment
sulymarco 0:7077d8f28b3e 752 // or decrement the threshold by 0.1
sulymarco 0:7077d8f28b3e 753 if ((X>ALARM_X) && (X<ALARM_X+(ALARM_WIDTH/2)) && (Y>ALARM_Y+(ALARM_HEIGHT*3)) && (Y<ALARM_Y+(ALARM_HEIGHT*4)))
sulymarco 0:7077d8f28b3e 754 { //
sulymarco 0:7077d8f28b3e 755 fAlarmThreshold += 0.1; //
sulymarco 0:7077d8f28b3e 756 DrawOnlyThreshold(fAlarmThreshold, AlarmOnOff, AlarmMinMax);
sulymarco 0:7077d8f28b3e 757 } //
sulymarco 0:7077d8f28b3e 758 if ((X>ALARM_X+(ALARM_WIDTH/2)) && (X<ALARM_X+(ALARM_WIDTH)) && (Y>ALARM_Y+(ALARM_HEIGHT*3)) && (Y<ALARM_Y+(ALARM_HEIGHT*4)))
sulymarco 0:7077d8f28b3e 759 { //
sulymarco 0:7077d8f28b3e 760 fAlarmThreshold -= 0.1; //
sulymarco 0:7077d8f28b3e 761 DrawOnlyThreshold(fAlarmThreshold, AlarmOnOff, AlarmMinMax);
sulymarco 0:7077d8f28b3e 762 } //
sulymarco 0:7077d8f28b3e 763 }
sulymarco 0:7077d8f28b3e 764
sulymarco 0:7077d8f28b3e 765 else // autorepeat management
sulymarco 0:7077d8f28b3e 766 { //
sulymarco 0:7077d8f28b3e 767 Time = SysMilliS(); //
sulymarco 0:7077d8f28b3e 768 if (Time-TimeAutoRepeat > TIME_AUTO_REP_START) //
sulymarco 0:7077d8f28b3e 769 { //
sulymarco 0:7077d8f28b3e 770 if (Time-TimeAutoRepRepeat > TIME_AUTO_REP_REPEAT)
sulymarco 0:7077d8f28b3e 771 { //
sulymarco 0:7077d8f28b3e 772 TimeAutoRepRepeat = Time; //
sulymarco 0:7077d8f28b3e 773
sulymarco 0:7077d8f28b3e 774 // handle taps on the "+" and "-" buttons
sulymarco 0:7077d8f28b3e 775 // here we use the autorepeat to increment
sulymarco 0:7077d8f28b3e 776 // or decrement the threshold by 1
sulymarco 0:7077d8f28b3e 777 if ((X>ALARM_X) && (X<ALARM_X+(ALARM_WIDTH/2)) && (Y>ALARM_Y+(ALARM_HEIGHT*3)) && (Y<ALARM_Y+(ALARM_HEIGHT*4)))
sulymarco 0:7077d8f28b3e 778 { //
sulymarco 0:7077d8f28b3e 779 fAlarmThreshold += 1; //
sulymarco 0:7077d8f28b3e 780 DrawOnlyThreshold(fAlarmThreshold, AlarmOnOff, AlarmMinMax);
sulymarco 0:7077d8f28b3e 781 } //
sulymarco 0:7077d8f28b3e 782 if ((X>ALARM_X+(ALARM_WIDTH/2)) && (X<ALARM_X+(ALARM_WIDTH)) && (Y>ALARM_Y+(ALARM_HEIGHT*3)) && (Y<ALARM_Y+(ALARM_HEIGHT*4)))
sulymarco 0:7077d8f28b3e 783 { //
sulymarco 0:7077d8f28b3e 784 fAlarmThreshold -= 1; //
sulymarco 0:7077d8f28b3e 785 DrawOnlyThreshold(fAlarmThreshold, AlarmOnOff, AlarmMinMax);
sulymarco 0:7077d8f28b3e 786 }
sulymarco 0:7077d8f28b3e 787 }
sulymarco 0:7077d8f28b3e 788 }
sulymarco 0:7077d8f28b3e 789 }
sulymarco 0:7077d8f28b3e 790
sulymarco 0:7077d8f28b3e 791 break; //-------------- end slave 1 -------------------
sulymarco 0:7077d8f28b3e 792
sulymarco 0:7077d8f28b3e 793
sulymarco 0:7077d8f28b3e 794
sulymarco 0:7077d8f28b3e 795 case (LAB_2): //-------------- slave 2 -----------------------
sulymarco 0:7077d8f28b3e 796
sulymarco 0:7077d8f28b3e 797 if(TouchWasReleased) // first check if the touch was
sulymarco 0:7077d8f28b3e 798 { // not tapped in the previous rounds
sulymarco 0:7077d8f28b3e 799 TouchWasReleased = false; // because for the following fields
sulymarco 0:7077d8f28b3e 800 TimeTouchReleased = SysMilliS(); // we don't want autorepeat
sulymarco 0:7077d8f28b3e 801
sulymarco 0:7077d8f28b3e 802 uint8_t Mask = 0x08; // check if one of the segment is tapped
sulymarco 0:7077d8f28b3e 803 //
sulymarco 0:7077d8f28b3e 804 for (i=0; i<4; i++) //
sulymarco 0:7077d8f28b3e 805 { //
sulymarco 0:7077d8f28b3e 806 if ((X>SEG_X+(i*SEG_STEP)) && (X<SEG_X+(i*SEG_STEP)+SEG_WIDTH) && (Y>SEG_Y) && (Y<SEG_Y+SEG_HEIGHT*3))
sulymarco 0:7077d8f28b3e 807 { //
sulymarco 0:7077d8f28b3e 808 Segments ^= Mask >> i; //
sulymarco 0:7077d8f28b3e 809 } //
sulymarco 0:7077d8f28b3e 810 } //
sulymarco 0:7077d8f28b3e 811 }
sulymarco 0:7077d8f28b3e 812 break; //----------------- end slave 2 ----------------
sulymarco 0:7077d8f28b3e 813
sulymarco 0:7077d8f28b3e 814
sulymarco 0:7077d8f28b3e 815 /*
sulymarco 0:7077d8f28b3e 816 case (EL2004): //-------------- slave 3 EL2004 ----------------
sulymarco 0:7077d8f28b3e 817
sulymarco 0:7077d8f28b3e 818
sulymarco 0:7077d8f28b3e 819 if(TouchWasReleased) // first check if the touch was
sulymarco 0:7077d8f28b3e 820 { // not tapped in the previous rounds
sulymarco 0:7077d8f28b3e 821 TouchWasReleased = false; // because for the following fields
sulymarco 0:7077d8f28b3e 822 TimeTouchReleased = SysMilliS(); // we don't want autorepeat
sulymarco 0:7077d8f28b3e 823
sulymarco 0:7077d8f28b3e 824 uint8_t Mask = 0x08; // check if one of the output is tapped
sulymarco 0:7077d8f28b3e 825 //
sulymarco 0:7077d8f28b3e 826 for (i=0; i<4; i++) //
sulymarco 0:7077d8f28b3e 827 { //
sulymarco 0:7077d8f28b3e 828 if ((X>OUT_X+(i*OUT_STEP)) && (X<OUT_X+(i*OUT_STEP)+OUT_WIDTH) && (Y>OUT_Y) && (Y<OUT_Y+OUT_HEIGHT))
sulymarco 0:7077d8f28b3e 829 { //
sulymarco 0:7077d8f28b3e 830 Outputs ^= Mask >> i; //
sulymarco 0:7077d8f28b3e 831 } //
sulymarco 0:7077d8f28b3e 832 } //
sulymarco 0:7077d8f28b3e 833 }
sulymarco 0:7077d8f28b3e 834 */
sulymarco 0:7077d8f28b3e 835 }
sulymarco 0:7077d8f28b3e 836 }
sulymarco 0:7077d8f28b3e 837
sulymarco 0:7077d8f28b3e 838 else
sulymarco 0:7077d8f28b3e 839 {
sulymarco 0:7077d8f28b3e 840 if ( SysMilliS()-TimeTouchReleased > TIME_TOUCH_RELEASED) // if the touchscreen was not
sulymarco 0:7077d8f28b3e 841 { // tapped for enought time
sulymarco 0:7077d8f28b3e 842 TouchWasReleased = true; // remember it
sulymarco 0:7077d8f28b3e 843
sulymarco 0:7077d8f28b3e 844 }
sulymarco 0:7077d8f28b3e 845 }
sulymarco 0:7077d8f28b3e 846 }
sulymarco 0:7077d8f28b3e 847
sulymarco 0:7077d8f28b3e 848
sulymarco 0:7077d8f28b3e 849 //----- draw the fixed part of the visualized slave ----------------------------
sulymarco 0:7077d8f28b3e 850
sulymarco 0:7077d8f28b3e 851 void DrawSlaveFixedParts()
sulymarco 0:7077d8f28b3e 852 {
sulymarco 0:7077d8f28b3e 853 int i;
sulymarco 0:7077d8f28b3e 854 int Offset;
sulymarco 0:7077d8f28b3e 855
sulymarco 0:7077d8f28b3e 856 TFT.cls(); // clear screen
sulymarco 0:7077d8f28b3e 857 DrawSideMenu(VisuSlave); // draw the side menu
sulymarco 0:7077d8f28b3e 858
sulymarco 0:7077d8f28b3e 859 switch (VisuSlave) // check which slave is visualized on the TFT
sulymarco 0:7077d8f28b3e 860 {
sulymarco 0:7077d8f28b3e 861 case (LAB_1): //-------------- slave 1 ---------------------------
sulymarco 0:7077d8f28b3e 862
sulymarco 0:7077d8f28b3e 863 TFT.foreground(Yellow); // draw the thermometer
sulymarco 0:7077d8f28b3e 864
sulymarco 0:7077d8f28b3e 865 TFT.circle(TERMO_X, TERMO_Y, 18, Yellow); // bowl
sulymarco 0:7077d8f28b3e 866 TFT.fillcircle(TERMO_X, TERMO_Y, 17, Red); //
sulymarco 0:7077d8f28b3e 867
sulymarco 0:7077d8f28b3e 868 // tube
sulymarco 0:7077d8f28b3e 869 TFT.rect(TERMO_X-8, TERMO_Y-185, TERMO_X+8, TERMO_Y-18, Yellow);
sulymarco 0:7077d8f28b3e 870 TFT.fillrect(TERMO_X-7, TERMO_Y-18, TERMO_X+7, TERMO_Y-16, Red);
sulymarco 0:7077d8f28b3e 871
sulymarco 0:7077d8f28b3e 872 for (i=0; i<8; i++) // scale
sulymarco 0:7077d8f28b3e 873 { //
sulymarco 0:7077d8f28b3e 874 if (i <1) //
sulymarco 0:7077d8f28b3e 875 Offset = 5; //
sulymarco 0:7077d8f28b3e 876 else //
sulymarco 0:7077d8f28b3e 877 Offset = 0; //
sulymarco 0:7077d8f28b3e 878 //
sulymarco 0:7077d8f28b3e 879 TFT.line(TERMO_X-8, (TERMO_Y-28)-(i *20), TERMO_X-18,(TERMO_Y-28)-(i*20), Yellow);
sulymarco 0:7077d8f28b3e 880 TFT.locate(TERMO_X-48+Offset, TERMO_Y-(i*20)-32); //
sulymarco 0:7077d8f28b3e 881 TFT.set_font((unsigned char*) Arial12x12); //
sulymarco 0:7077d8f28b3e 882 TFT.printf("%3d",(i*10)-10); //
sulymarco 0:7077d8f28b3e 883 }
sulymarco 0:7077d8f28b3e 884
sulymarco 0:7077d8f28b3e 885 TFT.foreground(Green); //
sulymarco 0:7077d8f28b3e 886 TFT.set_font((unsigned char*) Arial28x28); //
sulymarco 0:7077d8f28b3e 887 TFT.locate(TERMO_X+25, TERMO_Y+28); //
sulymarco 0:7077d8f28b3e 888 TFT.printf("C"); //
sulymarco 0:7077d8f28b3e 889
sulymarco 0:7077d8f28b3e 890 // draw the alarm control panel
sulymarco 0:7077d8f28b3e 891
sulymarco 0:7077d8f28b3e 892 // frame
sulymarco 0:7077d8f28b3e 893 TFT.rect(ALARM_X, ALARM_Y, ALARM_X+ALARM_WIDTH, ALARM_Y+(ALARM_HEIGHT*4), Magenta);
sulymarco 0:7077d8f28b3e 894 //
sulymarco 0:7077d8f28b3e 895 for (i=0; i<3; i++) //
sulymarco 0:7077d8f28b3e 896 { //
sulymarco 0:7077d8f28b3e 897 TFT.line(ALARM_X, ALARM_Y+((i+1)*ALARM_HEIGHT) , ALARM_X+ALARM_WIDTH, ALARM_Y+((i+1)*ALARM_HEIGHT), Magenta);
sulymarco 0:7077d8f28b3e 898 } //
sulymarco 0:7077d8f28b3e 899 //
sulymarco 0:7077d8f28b3e 900 TFT.line(ALARM_X+(ALARM_WIDTH/2), ALARM_Y, ALARM_X+(ALARM_WIDTH/2), ALARM_Y+(ALARM_HEIGHT*2), Magenta);
sulymarco 0:7077d8f28b3e 901 TFT.line(ALARM_X+(ALARM_WIDTH/2), ALARM_Y+(ALARM_HEIGHT*3), ALARM_X+(ALARM_WIDTH/2), ALARM_Y+(ALARM_HEIGHT*4), Magenta);
sulymarco 0:7077d8f28b3e 902
sulymarco 0:7077d8f28b3e 903 TFT.set_font((unsigned char*) Arial28x28); // "+" and "-"
sulymarco 0:7077d8f28b3e 904 TFT.foreground(Green); //
sulymarco 0:7077d8f28b3e 905 TFT.locate(ALARM_X+11, ALARM_Y+(ALARM_HEIGHT*3)+9); //
sulymarco 0:7077d8f28b3e 906 TFT.printf("+"); //
sulymarco 0:7077d8f28b3e 907 TFT.locate(ALARM_X+(ALARM_WIDTH/2)+14, ALARM_Y+(ALARM_HEIGHT*3)+9);
sulymarco 0:7077d8f28b3e 908 TFT.printf("-"); //
sulymarco 0:7077d8f28b3e 909
sulymarco 0:7077d8f28b3e 910 // alarm bar
sulymarco 0:7077d8f28b3e 911 TFT.rect(ALARM_X-30, ALARM_Y, ALARM_X-25, ALARM_Y+168, Yellow);
sulymarco 0:7077d8f28b3e 912
sulymarco 0:7077d8f28b3e 913 TFT.set_font((unsigned char*) Arial12x12); // draw "ALARM SETTINGS"
sulymarco 0:7077d8f28b3e 914 TFT.foreground(Yellow); //
sulymarco 0:7077d8f28b3e 915 TFT.locate(ALARM_X-35, ALARM_Y+14+(ALARM_HEIGHT*4)); //
sulymarco 0:7077d8f28b3e 916 TFT.printf("ALARM SETTINGS"); //
sulymarco 0:7077d8f28b3e 917
sulymarco 0:7077d8f28b3e 918 break;
sulymarco 0:7077d8f28b3e 919
sulymarco 0:7077d8f28b3e 920
sulymarco 0:7077d8f28b3e 921
sulymarco 0:7077d8f28b3e 922
sulymarco 0:7077d8f28b3e 923 case (LAB_2): //-------------- slave 2 ---------------------------
sulymarco 0:7077d8f28b3e 924
sulymarco 0:7077d8f28b3e 925 TFT.foreground(Yellow);
sulymarco 0:7077d8f28b3e 926
sulymarco 0:7077d8f28b3e 927 for (i=0; i<4; i++) // draw the segments fixed parts
sulymarco 0:7077d8f28b3e 928 { //
sulymarco 0:7077d8f28b3e 929 TFT.rect(SEG_X+(i*SEG_STEP), SEG_Y, SEG_X+SEG_WIDTH+(i*SEG_STEP), SEG_Y+SEG_HEIGHT, Yellow);
sulymarco 0:7077d8f28b3e 930 //
sulymarco 0:7077d8f28b3e 931 TFT.set_font((unsigned char*) Arial12x12); //
sulymarco 0:7077d8f28b3e 932 TFT.locate(SEG_X+44, SEG_Y+SEG_HEIGHT+12); //
sulymarco 0:7077d8f28b3e 933 TFT.printf("MIDDLE SEGMENTS"); //
sulymarco 0:7077d8f28b3e 934 } //
sulymarco 0:7077d8f28b3e 935
sulymarco 0:7077d8f28b3e 936 for (i=0; i<3; i++) // draw the buttons fixed parts
sulymarco 0:7077d8f28b3e 937 { //
sulymarco 0:7077d8f28b3e 938 TFT.circle(BUTTONS_X+(i*BUTTONS_STEP), BUTTONS_Y, BUTTONS_R, Red);
sulymarco 0:7077d8f28b3e 939 TFT.circle(BUTTONS_X+BUTTONS_WIDTH+(i*BUTTONS_STEP), BUTTONS_Y, BUTTONS_R, Red);
sulymarco 0:7077d8f28b3e 940 //
sulymarco 0:7077d8f28b3e 941 TFT.line(BUTTONS_X+(i*BUTTONS_STEP)-BUTTONS_R, BUTTONS_Y, BUTTONS_X+(i*BUTTONS_STEP)-BUTTONS_R-4, BUTTONS_Y, Red);
sulymarco 0:7077d8f28b3e 942 TFT.line(BUTTONS_X+BUTTONS_WIDTH+(i*BUTTONS_STEP)+BUTTONS_R, BUTTONS_Y, BUTTONS_X+BUTTONS_WIDTH+(i*BUTTONS_STEP)+BUTTONS_R+4 , BUTTONS_Y, Red);
sulymarco 0:7077d8f28b3e 943 } //
sulymarco 0:7077d8f28b3e 944 //
sulymarco 0:7077d8f28b3e 945 TFT.set_font((unsigned char*) Arial12x12); //
sulymarco 0:7077d8f28b3e 946 TFT.locate(BUTTONS_X+38, BUTTONS_Y+12); //
sulymarco 0:7077d8f28b3e 947 TFT.printf("BUTTONS"); //
sulymarco 0:7077d8f28b3e 948
sulymarco 0:7077d8f28b3e 949 // draw the potentiometer window fixed parts
sulymarco 0:7077d8f28b3e 950 TFT.rect(ANALOG_X, ANALOG_Y, ANALOG_X+ANALOG_WIDTH, ANALOG_Y+ANALOG_HEIGHT, Magenta);
sulymarco 0:7077d8f28b3e 951 //
sulymarco 0:7077d8f28b3e 952 TFT.set_font((unsigned char*) Arial12x12); //
sulymarco 0:7077d8f28b3e 953 TFT.locate(ANALOG_X+35, ANALOG_Y+ANALOG_HEIGHT+12); //
sulymarco 0:7077d8f28b3e 954 TFT.printf("POTENTIOMETER"); //
sulymarco 0:7077d8f28b3e 955
sulymarco 0:7077d8f28b3e 956 Graph_x = 0;
sulymarco 0:7077d8f28b3e 957
sulymarco 0:7077d8f28b3e 958 DrawSegmentsValue(Segments); // draw the segments status
sulymarco 0:7077d8f28b3e 959 DrawButtonsValue (Buttons); // draw the buttons status
sulymarco 0:7077d8f28b3e 960 DrawPotentiometerValue(PotValue); // draw the potentiometer value
sulymarco 0:7077d8f28b3e 961 break;
sulymarco 0:7077d8f28b3e 962
sulymarco 0:7077d8f28b3e 963 /*
sulymarco 0:7077d8f28b3e 964 case (EK1100): //-------------- slave 3 EK1100 --------------------
sulymarco 0:7077d8f28b3e 965
sulymarco 0:7077d8f28b3e 966 TFT.foreground(Red);
sulymarco 0:7077d8f28b3e 967 TFT.set_font((unsigned char*) Arial12x12);
sulymarco 0:7077d8f28b3e 968 TFT.locate(0, MENU_Y+(MENU_HEIGHT*2)+12);
sulymarco 0:7077d8f28b3e 969
sulymarco 0:7077d8f28b3e 970 TFT.printf("This slave has no Input/Output:");
sulymarco 0:7077d8f28b3e 971
sulymarco 0:7077d8f28b3e 972 break;
sulymarco 0:7077d8f28b3e 973
sulymarco 0:7077d8f28b3e 974
sulymarco 0:7077d8f28b3e 975 case (EL2004): //-------------- slave 4 EL2004 --------------------
sulymarco 0:7077d8f28b3e 976
sulymarco 0:7077d8f28b3e 977 TFT.foreground(Yellow);
sulymarco 0:7077d8f28b3e 978
sulymarco 0:7077d8f28b3e 979 for (i=0; i<4; i++) // draw the outputs fixed parts
sulymarco 0:7077d8f28b3e 980 { //
sulymarco 0:7077d8f28b3e 981 TFT.rect(OUT_X+(i*OUT_STEP), OUT_Y, OUT_X+OUT_WIDTH+(i*OUT_STEP), OUT_Y+OUT_HEIGHT, Yellow);
sulymarco 0:7077d8f28b3e 982 //
sulymarco 0:7077d8f28b3e 983 TFT.set_font((unsigned char*) Arial12x12); //
sulymarco 0:7077d8f28b3e 984 TFT.locate(OUT_X+45, OUT_Y+OUT_HEIGHT+40); //
sulymarco 0:7077d8f28b3e 985 TFT.printf("DIGITAL OUTPUTS"); //
sulymarco 0:7077d8f28b3e 986 } //
sulymarco 0:7077d8f28b3e 987
sulymarco 0:7077d8f28b3e 988 DrawOutputsValue(Outputs); // draw the outputs status
sulymarco 0:7077d8f28b3e 989 break;
sulymarco 0:7077d8f28b3e 990
sulymarco 0:7077d8f28b3e 991 case (EL1014): //-------------- slave 5 EL1014 --------------------
sulymarco 0:7077d8f28b3e 992
sulymarco 0:7077d8f28b3e 993 TFT.foreground(Yellow);
sulymarco 0:7077d8f28b3e 994
sulymarco 0:7077d8f28b3e 995
sulymarco 0:7077d8f28b3e 996 for (i=0; i<4; i++) // draw the inputs fixed parts
sulymarco 0:7077d8f28b3e 997 { //
sulymarco 0:7077d8f28b3e 998 TFT.circle(INPUTS_X+(i*INPUTS_STEP), INPUTS_Y, INPUTS_R, Red);
sulymarco 0:7077d8f28b3e 999 TFT.circle(INPUTS_X+INPUTS_WIDTH+(i*INPUTS_STEP), INPUTS_Y, INPUTS_R, Red);
sulymarco 0:7077d8f28b3e 1000 //
sulymarco 0:7077d8f28b3e 1001 TFT.line(INPUTS_X+(i*INPUTS_STEP)-INPUTS_R, INPUTS_Y, INPUTS_X+(i*INPUTS_STEP)-INPUTS_R-4, INPUTS_Y, Red);
sulymarco 0:7077d8f28b3e 1002 TFT.line(INPUTS_X+INPUTS_WIDTH+(i*INPUTS_STEP)+INPUTS_R, INPUTS_Y, INPUTS_X+INPUTS_WIDTH+(i*INPUTS_STEP)+INPUTS_R+4 , INPUTS_Y, Red);
sulymarco 0:7077d8f28b3e 1003 } //
sulymarco 0:7077d8f28b3e 1004 //
sulymarco 0:7077d8f28b3e 1005 TFT.set_font((unsigned char*) Arial12x12); //
sulymarco 0:7077d8f28b3e 1006 TFT.locate(INPUTS_X+45, INPUTS_Y+40); //
sulymarco 0:7077d8f28b3e 1007 TFT.printf("DIGITAL INPUTS"); //
sulymarco 0:7077d8f28b3e 1008
sulymarco 0:7077d8f28b3e 1009 DrawInputsValue (Inputs); // draw the inputs status
sulymarco 0:7077d8f28b3e 1010 break;
sulymarco 0:7077d8f28b3e 1011 */
sulymarco 0:7077d8f28b3e 1012
sulymarco 0:7077d8f28b3e 1013 }
sulymarco 0:7077d8f28b3e 1014
sulymarco 0:7077d8f28b3e 1015 FirstRound = true;
sulymarco 0:7077d8f28b3e 1016 }
sulymarco 0:7077d8f28b3e 1017
sulymarco 0:7077d8f28b3e 1018
sulymarco 0:7077d8f28b3e 1019 //---- draw the menu on the upper right part of the TFT ------------------------
sulymarco 0:7077d8f28b3e 1020
sulymarco 0:7077d8f28b3e 1021 void DrawSideMenu(uint8_t Slave)
sulymarco 0:7077d8f28b3e 1022 { // draw the side menu frame
sulymarco 0:7077d8f28b3e 1023 TFT.rect(MENU_X, MENU_Y, MENU_X+MENU_WIDTH, MENU_Y+MENU_HEIGHT*2, Green);
sulymarco 0:7077d8f28b3e 1024 TFT.line(MENU_X, MENU_HEIGHT, MENU_X+MENU_WIDTH, MENU_HEIGHT, Green);
sulymarco 0:7077d8f28b3e 1025 TFT.line(MENU_X+(MENU_WIDTH/2), MENU_Y+MENU_HEIGHT, MENU_X+(MENU_WIDTH/2), MENU_Y+(MENU_HEIGHT*2), Green);
sulymarco 0:7077d8f28b3e 1026
sulymarco 0:7077d8f28b3e 1027 // draw the slave number
sulymarco 0:7077d8f28b3e 1028 TFT.fillrect(MENU_X+1, MENU_Y+1, MENU_X+MENU_WIDTH-1, MENU_Y+MENU_HEIGHT-1, Red);
sulymarco 0:7077d8f28b3e 1029 TFT.set_font((unsigned char*) Arial12x12); //
sulymarco 0:7077d8f28b3e 1030 TFT.foreground(Yellow); //
sulymarco 0:7077d8f28b3e 1031 TFT.locate(MENU_X+8 , MENU_Y+18); //
sulymarco 0:7077d8f28b3e 1032 TFT.background(Red); //
sulymarco 0:7077d8f28b3e 1033 TFT.printf("SLAVE %d", Slave); //
sulymarco 0:7077d8f28b3e 1034 TFT.background(Black); //
sulymarco 0:7077d8f28b3e 1035
sulymarco 0:7077d8f28b3e 1036 TFT.set_font((unsigned char*) Arial28x28); // draw "+" and "-"
sulymarco 0:7077d8f28b3e 1037 TFT.foreground(Green); //
sulymarco 0:7077d8f28b3e 1038 TFT.locate (MENU_X+11, MENU_Y+MENU_HEIGHT+9); //
sulymarco 0:7077d8f28b3e 1039 TFT.printf("+"); //
sulymarco 0:7077d8f28b3e 1040 TFT.locate (MENU_X+(MENU_WIDTH/2)+14, MENU_Y+MENU_HEIGHT+9); //
sulymarco 0:7077d8f28b3e 1041 TFT.printf("-"); //
sulymarco 0:7077d8f28b3e 1042
sulymarco 0:7077d8f28b3e 1043 TFT.set_font((unsigned char*) Arial12x12); // draw the slave name
sulymarco 0:7077d8f28b3e 1044 TFT.foreground(Red); //
sulymarco 0:7077d8f28b3e 1045 //
sulymarco 0:7077d8f28b3e 1046 TFT.locate(MENU_X, MENU_Y+(MENU_HEIGHT*2)+12); //
sulymarco 0:7077d8f28b3e 1047 TFT.printf("%.9s", ec_slave[Slave].name); //
sulymarco 0:7077d8f28b3e 1048 }
sulymarco 0:7077d8f28b3e 1049
sulymarco 0:7077d8f28b3e 1050
sulymarco 0:7077d8f28b3e 1051 //---- draw the starting banner ------------------------------------------------
sulymarco 0:7077d8f28b3e 1052
sulymarco 0:7077d8f28b3e 1053 void DrawBanner()
sulymarco 0:7077d8f28b3e 1054 {
sulymarco 0:7077d8f28b3e 1055 TFT.set_font((unsigned char*) Arial24x23);
sulymarco 0:7077d8f28b3e 1056 TFT.foreground(Red);
sulymarco 0:7077d8f28b3e 1057 TFT.locate(30, 50);
sulymarco 0:7077d8f28b3e 1058 TFT.printf("EasyCAT");
sulymarco 0:7077d8f28b3e 1059 TFT.locate(30, 80);
sulymarco 0:7077d8f28b3e 1060 TFT.printf("SOEM MASTER");
sulymarco 0:7077d8f28b3e 1061
sulymarco 0:7077d8f28b3e 1062 TFT.set_font((unsigned char*) Arial12x12);
sulymarco 0:7077d8f28b3e 1063 TFT.foreground(Green);
sulymarco 0:7077d8f28b3e 1064 TFT.locate(30, 140);
sulymarco 0:7077d8f28b3e 1065 TFT.printf("www.bausano.net");
sulymarco 0:7077d8f28b3e 1066
sulymarco 0:7077d8f28b3e 1067 TFT.foreground(Green);
sulymarco 0:7077d8f28b3e 1068 TFT.locate(30, 160);
sulymarco 0:7077d8f28b3e 1069 TFT.printf("www.easycatshield.com");
sulymarco 0:7077d8f28b3e 1070
sulymarco 0:7077d8f28b3e 1071 TFT.locate(30, 180);
sulymarco 0:7077d8f28b3e 1072 TFT.printf("https://openethercatsociety.github.io/");
sulymarco 0:7077d8f28b3e 1073 }
sulymarco 0:7077d8f28b3e 1074
sulymarco 0:7077d8f28b3e 1075
sulymarco 0:7077d8f28b3e 1076
sulymarco 0:7077d8f28b3e 1077 //****** slave 1 functions *****************************************************
sulymarco 0:7077d8f28b3e 1078
sulymarco 0:7077d8f28b3e 1079 //---- draw the temperature value both in analog and in digital form ------------
sulymarco 0:7077d8f28b3e 1080
sulymarco 0:7077d8f28b3e 1081 void DrawTemperatureValue(float fValue)
sulymarco 0:7077d8f28b3e 1082 {
sulymarco 0:7077d8f28b3e 1083 TFT.set_font((unsigned char*) Arial28x28); // digital visualization
sulymarco 0:7077d8f28b3e 1084 TFT.foreground(Green); //
sulymarco 0:7077d8f28b3e 1085 TFT.locate(TERMO_X-45, TERMO_Y+28); //
sulymarco 0:7077d8f28b3e 1086 TFT.printf("%4.1f", fValue); //
sulymarco 0:7077d8f28b3e 1087
sulymarco 0:7077d8f28b3e 1088 if (fValue > 68) // limit the value for the
sulymarco 0:7077d8f28b3e 1089 fValue = 68; // analog visualization
sulymarco 0:7077d8f28b3e 1090 //
sulymarco 0:7077d8f28b3e 1091 if (fValue < -15) //
sulymarco 0:7077d8f28b3e 1092 fValue = -15; //
sulymarco 0:7077d8f28b3e 1093
sulymarco 0:7077d8f28b3e 1094 int LenColonnina = fValue * 2; // analog visualization
sulymarco 0:7077d8f28b3e 1095 TFT.fillrect(TERMO_X-7, TERMO_Y-184, TERMO_X+7, TERMO_Y-18-LenColonnina-30-1, Black);
sulymarco 0:7077d8f28b3e 1096 TFT.fillrect(TERMO_X-7, TERMO_Y-18-LenColonnina-30, TERMO_X+7, TERMO_Y-18, Red);
sulymarco 0:7077d8f28b3e 1097 }
sulymarco 0:7077d8f28b3e 1098
sulymarco 0:7077d8f28b3e 1099
sulymarco 0:7077d8f28b3e 1100 //---- draw the current parameter of the temperature alarm ---------------------
sulymarco 0:7077d8f28b3e 1101
sulymarco 0:7077d8f28b3e 1102 void DrawAlarmSettings(float fThreshold, bool OnOff, bool MinMax)
sulymarco 0:7077d8f28b3e 1103 {
sulymarco 0:7077d8f28b3e 1104
sulymarco 0:7077d8f28b3e 1105 if (OnOff) // alarm on
sulymarco 0:7077d8f28b3e 1106 { // draw "ON" on red background
sulymarco 0:7077d8f28b3e 1107 // and "OFF"" on black background
sulymarco 0:7077d8f28b3e 1108 DisplayInRect (ALARM_X, ALARM_Y, 10, 14, "ON", Red, (unsigned char*)Arial12x12);
sulymarco 0:7077d8f28b3e 1109 DisplayInRect (ALARM_X+(ALARM_WIDTH/2), ALARM_Y, 10, 14, "OFF", Black, (unsigned char*)Arial12x12);
sulymarco 0:7077d8f28b3e 1110 }
sulymarco 0:7077d8f28b3e 1111 else // alarm off
sulymarco 0:7077d8f28b3e 1112 { // and "ON"" on black background
sulymarco 0:7077d8f28b3e 1113 // draw "OFF" on red background
sulymarco 0:7077d8f28b3e 1114 DisplayInRect (ALARM_X, ALARM_Y, 10, 14, "ON", Black, (unsigned char*)Arial12x12);
sulymarco 0:7077d8f28b3e 1115 DisplayInRect (ALARM_X+(ALARM_WIDTH/2), ALARM_Y, 10, 14, "OFF", Red, (unsigned char*)Arial12x12);
sulymarco 0:7077d8f28b3e 1116 }
sulymarco 0:7077d8f28b3e 1117
sulymarco 0:7077d8f28b3e 1118
sulymarco 0:7077d8f28b3e 1119 if (MinMax) // alarm when temperature < threshold
sulymarco 0:7077d8f28b3e 1120 { // draw ">" on red background
sulymarco 0:7077d8f28b3e 1121 // and ">"" on black background
sulymarco 0:7077d8f28b3e 1122 DisplayInRect (ALARM_X, ALARM_Y+ALARM_HEIGHT, 10, 9, ">", Red, (unsigned char*)Arial28x28);
sulymarco 0:7077d8f28b3e 1123 DisplayInRect (ALARM_X+(ALARM_WIDTH/2), ALARM_Y+ALARM_HEIGHT, 10, 9, "<", Black, (unsigned char*)Arial28x28);
sulymarco 0:7077d8f28b3e 1124 }
sulymarco 0:7077d8f28b3e 1125 else // alarm when temperature > threshold
sulymarco 0:7077d8f28b3e 1126 { // draw ">" on black background
sulymarco 0:7077d8f28b3e 1127 // and ">"" on red background
sulymarco 0:7077d8f28b3e 1128 DisplayInRect (ALARM_X, ALARM_Y+ALARM_HEIGHT, 10, 9, ">", Black, (unsigned char*)Arial28x28);
sulymarco 0:7077d8f28b3e 1129 DisplayInRect (ALARM_X+(ALARM_WIDTH/2), ALARM_Y+ALARM_HEIGHT, 10, 9, "<", Red, (unsigned char*)Arial28x28);
sulymarco 0:7077d8f28b3e 1130 }
sulymarco 0:7077d8f28b3e 1131
sulymarco 0:7077d8f28b3e 1132 DrawOnlyThreshold(fThreshold, OnOff, MinMax);
sulymarco 0:7077d8f28b3e 1133 }
sulymarco 0:7077d8f28b3e 1134
sulymarco 0:7077d8f28b3e 1135
sulymarco 0:7077d8f28b3e 1136 //---- draw only the threshold setting -----------------------------------------
sulymarco 0:7077d8f28b3e 1137
sulymarco 0:7077d8f28b3e 1138 void DrawOnlyThreshold(float fThreshold, bool OnOff, bool MinMax) // this function is used to update
sulymarco 0:7077d8f28b3e 1139 { // only the threshold value not to
sulymarco 0:7077d8f28b3e 1140 // flicker the TFT, when "+" or
sulymarco 0:7077d8f28b3e 1141 // "-" are tapped
sulymarco 0:7077d8f28b3e 1142
sulymarco 0:7077d8f28b3e 1143 TFT.foreground(Yellow); // draw the alarm threshold
sulymarco 0:7077d8f28b3e 1144 TFT.set_font((unsigned char*) Arial12x12); // in digital form
sulymarco 0:7077d8f28b3e 1145 TFT.locate(ALARM_X+26, ALARM_Y+14+(ALARM_HEIGHT*2)); //
sulymarco 0:7077d8f28b3e 1146 TFT.printf(" "); //
sulymarco 0:7077d8f28b3e 1147 TFT.locate(ALARM_X+26, ALARM_Y+14+(ALARM_HEIGHT*2)); //
sulymarco 0:7077d8f28b3e 1148 TFT.printf("%+3.1f", fThreshold); //
sulymarco 0:7077d8f28b3e 1149
sulymarco 0:7077d8f28b3e 1150 if (fThreshold > 68) // limit the value for the
sulymarco 0:7077d8f28b3e 1151 fThreshold = 68; // analog visualization
sulymarco 0:7077d8f28b3e 1152 //
sulymarco 0:7077d8f28b3e 1153 if (fThreshold < -15) //
sulymarco 0:7077d8f28b3e 1154 fThreshold = -15; //
sulymarco 0:7077d8f28b3e 1155
sulymarco 0:7077d8f28b3e 1156 int LenAlarmBar = fThreshold * 2;
sulymarco 0:7077d8f28b3e 1157
sulymarco 0:7077d8f28b3e 1158 if (OnOff) // alarm on
sulymarco 0:7077d8f28b3e 1159 { //
sulymarco 0:7077d8f28b3e 1160 if (MinMax) // fill the threshold bar
sulymarco 0:7077d8f28b3e 1161 { // in accordance with the MinMax setting
sulymarco 0:7077d8f28b3e 1162 TFT.fillrect(ALARM_X-29, ALARM_Y+1, ALARM_X-26, ALARM_Y+167-LenAlarmBar-30, Green);
sulymarco 0:7077d8f28b3e 1163 TFT.fillrect(ALARM_X-29, ALARM_Y+167-LenAlarmBar-30, ALARM_X-26, ALARM_Y+167, Red);
sulymarco 0:7077d8f28b3e 1164 } //
sulymarco 0:7077d8f28b3e 1165 else //
sulymarco 0:7077d8f28b3e 1166 { //
sulymarco 0:7077d8f28b3e 1167 TFT.fillrect(ALARM_X-29, ALARM_Y+1, ALARM_X-26, ALARM_Y+167-LenAlarmBar-30, Red);
sulymarco 0:7077d8f28b3e 1168 TFT.fillrect(ALARM_X-29, ALARM_Y+167-LenAlarmBar-30, ALARM_X-26, ALARM_Y+167, Green);
sulymarco 0:7077d8f28b3e 1169 } //
sulymarco 0:7077d8f28b3e 1170 }
sulymarco 0:7077d8f28b3e 1171
sulymarco 0:7077d8f28b3e 1172 else // alarm off
sulymarco 0:7077d8f28b3e 1173 { //
sulymarco 0:7077d8f28b3e 1174 // clear the threshold bar
sulymarco 0:7077d8f28b3e 1175 TFT.fillrect(ALARM_X-29, ALARM_Y+1, ALARM_X-26, ALARM_Y+167, Black);
sulymarco 0:7077d8f28b3e 1176 } //
sulymarco 0:7077d8f28b3e 1177 }
sulymarco 0:7077d8f28b3e 1178
sulymarco 0:7077d8f28b3e 1179
sulymarco 0:7077d8f28b3e 1180 //---- draw the blinking alarm signal ------------------------------------------
sulymarco 0:7077d8f28b3e 1181
sulymarco 0:7077d8f28b3e 1182 void DrawAlarmStatus(bool Alarm)
sulymarco 0:7077d8f28b3e 1183 {
sulymarco 0:7077d8f28b3e 1184 bool static PrevAlarmVisu;
sulymarco 0:7077d8f28b3e 1185
sulymarco 0:7077d8f28b3e 1186 TFT.set_font((unsigned char*) Arial28x28);
sulymarco 0:7077d8f28b3e 1187 TFT.foreground(Red);
sulymarco 0:7077d8f28b3e 1188 TFT.locate(TERMO_X+90, TERMO_Y+28);
sulymarco 0:7077d8f28b3e 1189
sulymarco 0:7077d8f28b3e 1190 if (Alarm && Blink && !PrevAlarmVisu)
sulymarco 0:7077d8f28b3e 1191 {
sulymarco 0:7077d8f28b3e 1192 TFT.printf("ALARM !");
sulymarco 0:7077d8f28b3e 1193 PrevAlarmVisu = true;
sulymarco 0:7077d8f28b3e 1194 }
sulymarco 0:7077d8f28b3e 1195 else if ((!Alarm && PrevAlarmVisu) || (Alarm && !Blink && PrevAlarmVisu))
sulymarco 0:7077d8f28b3e 1196 {
sulymarco 0:7077d8f28b3e 1197 TFT.printf(" ");
sulymarco 0:7077d8f28b3e 1198 PrevAlarmVisu = false;
sulymarco 0:7077d8f28b3e 1199 }
sulymarco 0:7077d8f28b3e 1200 }
sulymarco 0:7077d8f28b3e 1201
sulymarco 0:7077d8f28b3e 1202
sulymarco 0:7077d8f28b3e 1203 //----- draw a rectangle with text and colored background ----------------------
sulymarco 0:7077d8f28b3e 1204
sulymarco 0:7077d8f28b3e 1205 void DisplayInRect (int X, int Y, int X_off, int Y_off, char* Value, int BackColor, unsigned char* Font)
sulymarco 0:7077d8f28b3e 1206 {
sulymarco 0:7077d8f28b3e 1207 TFT.set_font(Font);
sulymarco 0:7077d8f28b3e 1208 TFT.foreground(Green);
sulymarco 0:7077d8f28b3e 1209
sulymarco 0:7077d8f28b3e 1210 TFT.fillrect(X+1, Y+1, X+(MENU_WIDTH/2)-1, Y+MENU_HEIGHT-1, BackColor);
sulymarco 0:7077d8f28b3e 1211
sulymarco 0:7077d8f28b3e 1212 TFT.locate(X+X_off , Y+Y_off);
sulymarco 0:7077d8f28b3e 1213 TFT.background(BackColor);
sulymarco 0:7077d8f28b3e 1214 TFT.printf("%s", Value );
sulymarco 0:7077d8f28b3e 1215 TFT.background(Black);
sulymarco 0:7077d8f28b3e 1216 }
sulymarco 0:7077d8f28b3e 1217
sulymarco 0:7077d8f28b3e 1218
sulymarco 0:7077d8f28b3e 1219
sulymarco 0:7077d8f28b3e 1220
sulymarco 0:7077d8f28b3e 1221 //****** slave 2 functions *****************************************************
sulymarco 0:7077d8f28b3e 1222
sulymarco 0:7077d8f28b3e 1223 //------------------------------------------------------------------------------
sulymarco 0:7077d8f28b3e 1224
sulymarco 0:7077d8f28b3e 1225 void DrawButtonsValue (uint8_t Value)
sulymarco 0:7077d8f28b3e 1226 {
sulymarco 0:7077d8f28b3e 1227 uint8_t Slope;
sulymarco 0:7077d8f28b3e 1228 int i;
sulymarco 0:7077d8f28b3e 1229
sulymarco 0:7077d8f28b3e 1230 for (i=0; i<3; i++)
sulymarco 0:7077d8f28b3e 1231 {
sulymarco 0:7077d8f28b3e 1232 if ((Value & 0x04) == 0x04)
sulymarco 0:7077d8f28b3e 1233 Slope = BUTTONS_R;
sulymarco 0:7077d8f28b3e 1234 else
sulymarco 0:7077d8f28b3e 1235 Slope = 16;
sulymarco 0:7077d8f28b3e 1236
sulymarco 0:7077d8f28b3e 1237 TFT.fillrect(BUTTONS_X+(i*BUTTONS_STEP), BUTTONS_Y-16-1, BUTTONS_X+BUTTONS_WIDTH+(i*BUTTONS_STEP), BUTTONS_Y-BUTTONS_R-1, Black);
sulymarco 0:7077d8f28b3e 1238
sulymarco 0:7077d8f28b3e 1239 TFT.line(BUTTONS_X+(i*BUTTONS_STEP), BUTTONS_Y-BUTTONS_R-1, BUTTONS_X+BUTTONS_WIDTH+(i*BUTTONS_STEP), BUTTONS_Y-Slope-1, Red);
sulymarco 0:7077d8f28b3e 1240
sulymarco 0:7077d8f28b3e 1241 Value = Value << 1;
sulymarco 0:7077d8f28b3e 1242 }
sulymarco 0:7077d8f28b3e 1243 }
sulymarco 0:7077d8f28b3e 1244
sulymarco 0:7077d8f28b3e 1245
sulymarco 0:7077d8f28b3e 1246 //------------------------------------------------------------------------------
sulymarco 0:7077d8f28b3e 1247
sulymarco 0:7077d8f28b3e 1248 void DrawSegmentsValue(uint8_t Value)
sulymarco 0:7077d8f28b3e 1249 {
sulymarco 0:7077d8f28b3e 1250 int i;
sulymarco 0:7077d8f28b3e 1251 int Color;
sulymarco 0:7077d8f28b3e 1252
sulymarco 0:7077d8f28b3e 1253 for (i=0; i<4; i++)
sulymarco 0:7077d8f28b3e 1254 {
sulymarco 0:7077d8f28b3e 1255 if ((Value & 0x08) == 0x08)
sulymarco 0:7077d8f28b3e 1256 Color = Red;
sulymarco 0:7077d8f28b3e 1257 else
sulymarco 0:7077d8f28b3e 1258 Color = Black;
sulymarco 0:7077d8f28b3e 1259
sulymarco 0:7077d8f28b3e 1260 TFT.fillrect(SEG_X+(i*SEG_STEP)+1, SEG_Y+1, SEG_X+SEG_WIDTH+(i*SEG_STEP)-1, SEG_Y+SEG_HEIGHT-1, Color);
sulymarco 0:7077d8f28b3e 1261
sulymarco 0:7077d8f28b3e 1262 Value = Value << 1;
sulymarco 0:7077d8f28b3e 1263 }
sulymarco 0:7077d8f28b3e 1264 }
sulymarco 0:7077d8f28b3e 1265
sulymarco 0:7077d8f28b3e 1266
sulymarco 0:7077d8f28b3e 1267 //---- draw the potentiometer value --------------------------------------------
sulymarco 0:7077d8f28b3e 1268
sulymarco 0:7077d8f28b3e 1269 void DrawPotentiometerValue (uint16_t PotValue)
sulymarco 0:7077d8f28b3e 1270 {
sulymarco 0:7077d8f28b3e 1271
sulymarco 0:7077d8f28b3e 1272 if (PotValue != PrevPotValue)
sulymarco 0:7077d8f28b3e 1273 {
sulymarco 0:7077d8f28b3e 1274 PrevPotValue = PotValue;
sulymarco 0:7077d8f28b3e 1275
sulymarco 0:7077d8f28b3e 1276 TFT.set_font((unsigned char*) Arial12x12); //
sulymarco 0:7077d8f28b3e 1277 TFT.foreground(Green); //
sulymarco 0:7077d8f28b3e 1278 TFT.locate(ANALOG_X+170, ANALOG_Y+ANALOG_HEIGHT+12); //
sulymarco 0:7077d8f28b3e 1279 TFT.printf("%4d", (int)PotValue); //
sulymarco 0:7077d8f28b3e 1280 }
sulymarco 0:7077d8f28b3e 1281
sulymarco 0:7077d8f28b3e 1282
sulymarco 0:7077d8f28b3e 1283 if (++Graph_x > ANALOG_WIDTH-3)
sulymarco 0:7077d8f28b3e 1284 {
sulymarco 0:7077d8f28b3e 1285 Graph_x = 0;
sulymarco 0:7077d8f28b3e 1286 }
sulymarco 0:7077d8f28b3e 1287
sulymarco 0:7077d8f28b3e 1288 PotValue = PotValue / (1023/(ANALOG_HEIGHT-2));
sulymarco 0:7077d8f28b3e 1289
sulymarco 0:7077d8f28b3e 1290 TFT.pixel(ANALOG_X+Graph_x+1, ANALOG_Y+ANALOG_HEIGHT-PotValue-1, Green);
sulymarco 0:7077d8f28b3e 1291
sulymarco 0:7077d8f28b3e 1292 int Overflow = (ANALOG_WIDTH-2) - (Graph_x+16);
sulymarco 0:7077d8f28b3e 1293 if (Overflow < 0)
sulymarco 0:7077d8f28b3e 1294 {
sulymarco 0:7077d8f28b3e 1295 TFT.fillrect(ANALOG_X+Graph_x+2, ANALOG_Y+1, ANALOG_X+Graph_x+16+Overflow, ANALOG_Y+ANALOG_HEIGHT-1, Black);
sulymarco 0:7077d8f28b3e 1296 TFT.fillrect(ANALOG_X+1, ANALOG_Y+1, ANALOG_X+1-Overflow, ANALOG_Y+ANALOG_HEIGHT-1, Black);
sulymarco 0:7077d8f28b3e 1297 }
sulymarco 0:7077d8f28b3e 1298 else
sulymarco 0:7077d8f28b3e 1299 {
sulymarco 0:7077d8f28b3e 1300 TFT.fillrect(ANALOG_X+Graph_x+2, ANALOG_Y+1, ANALOG_X+Graph_x+16, ANALOG_Y+ANALOG_HEIGHT-1, Black);
sulymarco 0:7077d8f28b3e 1301 }
sulymarco 0:7077d8f28b3e 1302 }
sulymarco 0:7077d8f28b3e 1303
sulymarco 0:7077d8f28b3e 1304
sulymarco 0:7077d8f28b3e 1305 //****** slave 3 functions EL2004 **********************************************
sulymarco 0:7077d8f28b3e 1306 /*
sulymarco 0:7077d8f28b3e 1307
sulymarco 0:7077d8f28b3e 1308 //------------------------------------------------------------------------------
sulymarco 0:7077d8f28b3e 1309
sulymarco 0:7077d8f28b3e 1310 void DrawOutputsValue(uint8_t Value)
sulymarco 0:7077d8f28b3e 1311 {
sulymarco 0:7077d8f28b3e 1312 int i;
sulymarco 0:7077d8f28b3e 1313 int Color;
sulymarco 0:7077d8f28b3e 1314
sulymarco 0:7077d8f28b3e 1315 for (i=0; i<4; i++)
sulymarco 0:7077d8f28b3e 1316 {
sulymarco 0:7077d8f28b3e 1317 if ((Value & 0x08) == 0x08)
sulymarco 0:7077d8f28b3e 1318 Color = Green;
sulymarco 0:7077d8f28b3e 1319 else
sulymarco 0:7077d8f28b3e 1320 Color = Black;
sulymarco 0:7077d8f28b3e 1321
sulymarco 0:7077d8f28b3e 1322 TFT.fillrect(OUT_X+(i*OUT_STEP)+1, OUT_Y+1, OUT_X+OUT_WIDTH+(i*OUT_STEP)-1, OUT_Y+OUT_HEIGHT-1, Color);
sulymarco 0:7077d8f28b3e 1323
sulymarco 0:7077d8f28b3e 1324 Value = Value << 1;
sulymarco 0:7077d8f28b3e 1325 }
sulymarco 0:7077d8f28b3e 1326 }
sulymarco 0:7077d8f28b3e 1327
sulymarco 0:7077d8f28b3e 1328 //****** slave 4 functions *****************************************************
sulymarco 0:7077d8f28b3e 1329
sulymarco 0:7077d8f28b3e 1330 //------------------------------------------------------------------------------
sulymarco 0:7077d8f28b3e 1331
sulymarco 0:7077d8f28b3e 1332 void DrawInputsValue (uint8_t Value)
sulymarco 0:7077d8f28b3e 1333 {
sulymarco 0:7077d8f28b3e 1334 uint8_t Slope;
sulymarco 0:7077d8f28b3e 1335 int i;
sulymarco 0:7077d8f28b3e 1336
sulymarco 0:7077d8f28b3e 1337 for (i=0; i<4; i++)
sulymarco 0:7077d8f28b3e 1338 {
sulymarco 0:7077d8f28b3e 1339 if ((Value & 0x08) == 0x08)
sulymarco 0:7077d8f28b3e 1340 Slope = INPUTS_R;
sulymarco 0:7077d8f28b3e 1341 else
sulymarco 0:7077d8f28b3e 1342 Slope = 16;
sulymarco 0:7077d8f28b3e 1343
sulymarco 0:7077d8f28b3e 1344 TFT.fillrect(INPUTS_X+(i*INPUTS_STEP), INPUTS_Y-16-1, INPUTS_X+INPUTS_WIDTH+(i*INPUTS_STEP), INPUTS_Y-INPUTS_R-1, Black);
sulymarco 0:7077d8f28b3e 1345
sulymarco 0:7077d8f28b3e 1346 TFT.line(INPUTS_X+(i*INPUTS_STEP), INPUTS_Y-INPUTS_R-1, INPUTS_X+INPUTS_WIDTH+(i*INPUTS_STEP), INPUTS_Y-Slope-1, Red);
sulymarco 0:7077d8f28b3e 1347
sulymarco 0:7077d8f28b3e 1348 Value = Value << 1;
sulymarco 0:7077d8f28b3e 1349 }
sulymarco 0:7077d8f28b3e 1350 }
sulymarco 0:7077d8f28b3e 1351 */
sulymarco 0:7077d8f28b3e 1352
sulymarco 0:7077d8f28b3e 1353
sulymarco 0:7077d8f28b3e 1354 //****** touchscreen functions *************************************************
sulymarco 0:7077d8f28b3e 1355
sulymarco 0:7077d8f28b3e 1356 //----- read touchscreen status ------------------------------------------------
sulymarco 0:7077d8f28b3e 1357
sulymarco 0:7077d8f28b3e 1358 bool TouchRead(uint16_t* X, uint16_t* Y)
sulymarco 0:7077d8f28b3e 1359 {
sulymarco 0:7077d8f28b3e 1360 bool Result = false;
sulymarco 0:7077d8f28b3e 1361
sulymarco 0:7077d8f28b3e 1362 {
sulymarco 0:7077d8f28b3e 1363 if (TouchRead_Z()) // if the touchscreen is tapped
sulymarco 0:7077d8f28b3e 1364 { //
sulymarco 0:7077d8f28b3e 1365 *X = TouchRead_X(); // read also the X and Y axis
sulymarco 0:7077d8f28b3e 1366 *Y = TouchRead_Y(); //
sulymarco 0:7077d8f28b3e 1367
sulymarco 0:7077d8f28b3e 1368 wait_us (1000);
sulymarco 0:7077d8f28b3e 1369
sulymarco 0:7077d8f28b3e 1370 if (TouchRead_Z()) // if the touchscreen is still tapped
sulymarco 0:7077d8f28b3e 1371 { // we assume that the result is good
sulymarco 0:7077d8f28b3e 1372 Result = true; //
sulymarco 0:7077d8f28b3e 1373
sulymarco 0:7077d8f28b3e 1374 // TFT.pixel (*X, *Y, White); //debug - draw the touched point on the TFT
sulymarco 0:7077d8f28b3e 1375 }
sulymarco 0:7077d8f28b3e 1376 }
sulymarco 0:7077d8f28b3e 1377 }
sulymarco 0:7077d8f28b3e 1378
sulymarco 0:7077d8f28b3e 1379 return Result;
sulymarco 0:7077d8f28b3e 1380 }
sulymarco 0:7077d8f28b3e 1381
sulymarco 0:7077d8f28b3e 1382
sulymarco 0:7077d8f28b3e 1383 //----- read touchscreen X axis ------------------------------------------------
sulymarco 0:7077d8f28b3e 1384
sulymarco 0:7077d8f28b3e 1385 uint16_t TouchRead_X()
sulymarco 0:7077d8f28b3e 1386 {
sulymarco 0:7077d8f28b3e 1387 float fValue;
sulymarco 0:7077d8f28b3e 1388
sulymarco 0:7077d8f28b3e 1389 DigitalIn Ym(PIN_YM); // set the I/O
sulymarco 0:7077d8f28b3e 1390 Ym.mode(PullDown); //
sulymarco 0:7077d8f28b3e 1391 //
sulymarco 0:7077d8f28b3e 1392 DigitalOut Xp(PIN_XP); //
sulymarco 0:7077d8f28b3e 1393 Xp = 1; //
sulymarco 0:7077d8f28b3e 1394 //
sulymarco 0:7077d8f28b3e 1395 DigitalOut Xm(PIN_XM); //
sulymarco 0:7077d8f28b3e 1396 Xm = 0; //
sulymarco 0:7077d8f28b3e 1397 //
sulymarco 0:7077d8f28b3e 1398 AnalogIn Yp(PIN_YP); //
sulymarco 0:7077d8f28b3e 1399
sulymarco 0:7077d8f28b3e 1400 fValue = ReadAnalog(Yp); // read the axis
sulymarco 0:7077d8f28b3e 1401
sulymarco 0:7077d8f28b3e 1402 fValue -= TOUCH_X_OFFSET; // rectify offsett and gain
sulymarco 0:7077d8f28b3e 1403 if (fValue <0 ) //
sulymarco 0:7077d8f28b3e 1404 fValue = 0; //
sulymarco 0:7077d8f28b3e 1405 //
sulymarco 0:7077d8f28b3e 1406 fValue *= TOUCH_X_GAIN; //
sulymarco 0:7077d8f28b3e 1407
sulymarco 0:7077d8f28b3e 1408 return (uint16_t)fValue;
sulymarco 0:7077d8f28b3e 1409 }
sulymarco 0:7077d8f28b3e 1410
sulymarco 0:7077d8f28b3e 1411
sulymarco 0:7077d8f28b3e 1412 //----- read touchscreen Y axis ------------------------------------------------
sulymarco 0:7077d8f28b3e 1413
sulymarco 0:7077d8f28b3e 1414 uint16_t TouchRead_Y()
sulymarco 0:7077d8f28b3e 1415 {
sulymarco 0:7077d8f28b3e 1416 float fValue;
sulymarco 0:7077d8f28b3e 1417
sulymarco 0:7077d8f28b3e 1418 DigitalIn Xm(PIN_XM); // set the I/O
sulymarco 0:7077d8f28b3e 1419 Xm.mode(PullDown); //
sulymarco 0:7077d8f28b3e 1420 //
sulymarco 0:7077d8f28b3e 1421 DigitalOut Yp(PIN_YP); //
sulymarco 0:7077d8f28b3e 1422 Yp = 1; //
sulymarco 0:7077d8f28b3e 1423 //
sulymarco 0:7077d8f28b3e 1424 DigitalOut Ym(PIN_YM); //
sulymarco 0:7077d8f28b3e 1425 Ym = 0; //
sulymarco 0:7077d8f28b3e 1426 //
sulymarco 0:7077d8f28b3e 1427 AnalogIn Xp(PIN_XP); //
sulymarco 0:7077d8f28b3e 1428
sulymarco 0:7077d8f28b3e 1429 fValue = ReadAnalog(Xp); // read the axis
sulymarco 0:7077d8f28b3e 1430
sulymarco 0:7077d8f28b3e 1431 fValue -= TOUCH_Y_OFFSET; // rectify offset and gain
sulymarco 0:7077d8f28b3e 1432 if (fValue <0 ) //
sulymarco 0:7077d8f28b3e 1433 fValue = 0; //
sulymarco 0:7077d8f28b3e 1434 //
sulymarco 0:7077d8f28b3e 1435 fValue *= TOUCH_Y_GAIN; //
sulymarco 0:7077d8f28b3e 1436
sulymarco 0:7077d8f28b3e 1437 return (uint16_t)fValue;
sulymarco 0:7077d8f28b3e 1438 }
sulymarco 0:7077d8f28b3e 1439
sulymarco 0:7077d8f28b3e 1440
sulymarco 0:7077d8f28b3e 1441 //----- read touchscreen Z axis ------------------------------------------------
sulymarco 0:7077d8f28b3e 1442
sulymarco 0:7077d8f28b3e 1443 bool TouchRead_Z() // read the Z axis to see if the
sulymarco 0:7077d8f28b3e 1444 { // touchscreen has been tapped
sulymarco 0:7077d8f28b3e 1445 float fValue = 0;
sulymarco 0:7077d8f28b3e 1446 bool Result;
sulymarco 0:7077d8f28b3e 1447
sulymarco 0:7077d8f28b3e 1448 DigitalIn Yp(PIN_YP); // set the I/O
sulymarco 0:7077d8f28b3e 1449 Yp.mode(PullUp); //
sulymarco 0:7077d8f28b3e 1450 //
sulymarco 0:7077d8f28b3e 1451 AnalogIn Ym(PIN_YM); //
sulymarco 0:7077d8f28b3e 1452 //
sulymarco 0:7077d8f28b3e 1453 DigitalOut Xm(PIN_XM); //
sulymarco 0:7077d8f28b3e 1454 Xm = 0; //
sulymarco 0:7077d8f28b3e 1455 //
sulymarco 0:7077d8f28b3e 1456 DigitalOut Xp(PIN_XP); //
sulymarco 0:7077d8f28b3e 1457 Xp = 0; //
sulymarco 0:7077d8f28b3e 1458
sulymarco 0:7077d8f28b3e 1459 for (int i = 0; i<TOUCH_SAMPLES; i++) // read the axis several times
sulymarco 0:7077d8f28b3e 1460 { // and average the result
sulymarco 0:7077d8f28b3e 1461 wait_us(10); //
sulymarco 0:7077d8f28b3e 1462 //
sulymarco 0:7077d8f28b3e 1463 fValue += Ym.read(); //
sulymarco 0:7077d8f28b3e 1464 } //
sulymarco 0:7077d8f28b3e 1465 fValue /= TOUCH_SAMPLES; //
sulymarco 0:7077d8f28b3e 1466
sulymarco 0:7077d8f28b3e 1467 if (fValue < TOUCH_THRESHOLD) // compare the result with
sulymarco 0:7077d8f28b3e 1468 Result = true; // the threshold
sulymarco 0:7077d8f28b3e 1469 else //
sulymarco 0:7077d8f28b3e 1470 Result = false; //
sulymarco 0:7077d8f28b3e 1471
sulymarco 0:7077d8f28b3e 1472 return Result; //
sulymarco 0:7077d8f28b3e 1473 }
sulymarco 0:7077d8f28b3e 1474
sulymarco 0:7077d8f28b3e 1475
sulymarco 0:7077d8f28b3e 1476 //----- read touchscreen X or Y axis with a window filter ----------------------
sulymarco 0:7077d8f28b3e 1477
sulymarco 0:7077d8f28b3e 1478 float ReadAnalog (AnalogIn AnaCh) // check that consecutive readings
sulymarco 0:7077d8f28b3e 1479 { // fall in the acceptance window
sulymarco 0:7077d8f28b3e 1480 float fArray[TOUCH_SAMPLES]; //
sulymarco 0:7077d8f28b3e 1481 float fResult;
sulymarco 0:7077d8f28b3e 1482 float fDiff;
sulymarco 0:7077d8f28b3e 1483
sulymarco 0:7077d8f28b3e 1484 int Rounds = TOUCH_MAX_ROUNDS; // maximum number of attempts
sulymarco 0:7077d8f28b3e 1485
sulymarco 0:7077d8f28b3e 1486 for (int i=0; i<TOUCH_SAMPLES; i++)
sulymarco 0:7077d8f28b3e 1487 {
sulymarco 0:7077d8f28b3e 1488 wait_us(10);
sulymarco 0:7077d8f28b3e 1489
sulymarco 0:7077d8f28b3e 1490 fResult = AnaCh.read();
sulymarco 0:7077d8f28b3e 1491
sulymarco 0:7077d8f28b3e 1492 if (i>0)
sulymarco 0:7077d8f28b3e 1493 {
sulymarco 0:7077d8f28b3e 1494 fDiff = abs(fResult - fArray[i-1]);
sulymarco 0:7077d8f28b3e 1495
sulymarco 0:7077d8f28b3e 1496 if (fDiff > TOUCH_WINDOW)
sulymarco 0:7077d8f28b3e 1497 i= -1;
sulymarco 0:7077d8f28b3e 1498 else
sulymarco 0:7077d8f28b3e 1499 fArray[i] = fResult;
sulymarco 0:7077d8f28b3e 1500
sulymarco 0:7077d8f28b3e 1501 if (Rounds-- < 0)
sulymarco 0:7077d8f28b3e 1502 {
sulymarco 0:7077d8f28b3e 1503 fResult = 0;
sulymarco 0:7077d8f28b3e 1504 return fResult;
sulymarco 0:7077d8f28b3e 1505 }
sulymarco 0:7077d8f28b3e 1506 }
sulymarco 0:7077d8f28b3e 1507
sulymarco 0:7077d8f28b3e 1508 else
sulymarco 0:7077d8f28b3e 1509 {
sulymarco 0:7077d8f28b3e 1510 fArray[i] = fResult;
sulymarco 0:7077d8f28b3e 1511 }
sulymarco 0:7077d8f28b3e 1512 }
sulymarco 0:7077d8f28b3e 1513
sulymarco 0:7077d8f28b3e 1514 fResult =0;
sulymarco 0:7077d8f28b3e 1515
sulymarco 0:7077d8f28b3e 1516 for (int i=0; i<TOUCH_SAMPLES; i++)
sulymarco 0:7077d8f28b3e 1517 {
sulymarco 0:7077d8f28b3e 1518 fResult += fArray[i];
sulymarco 0:7077d8f28b3e 1519 }
sulymarco 0:7077d8f28b3e 1520
sulymarco 0:7077d8f28b3e 1521 return fResult /= TOUCH_SAMPLES;
sulymarco 0:7077d8f28b3e 1522 }
sulymarco 0:7077d8f28b3e 1523
sulymarco 0:7077d8f28b3e 1524
sulymarco 0:7077d8f28b3e 1525