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:
EasyCAT
Date:
Tue Jun 11 10:46:17 2019 +0000
Revision:
2:7d4fd6354015
Parent:
0:7077d8f28b3e
Child:
3:6ee00ee90d4c
First release

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 //---- local functions ---------------------------------------------------------
sulymarco 0:7077d8f28b3e 134
sulymarco 0:7077d8f28b3e 135 void DrawBanner();
sulymarco 0:7077d8f28b3e 136 void DrawSlaveFixedParts();
sulymarco 0:7077d8f28b3e 137 void DrawSideMenu (uint8_t Slave);
sulymarco 0:7077d8f28b3e 138
sulymarco 0:7077d8f28b3e 139 void DrawTemperatureValue(float fValue);
sulymarco 0:7077d8f28b3e 140 void DrawAlarmSettings(float fThreshold, bool OnOff, bool MinMax);
sulymarco 0:7077d8f28b3e 141 void DrawOnlyThreshold(float fThreshold, bool OnOff, bool MinMax);
sulymarco 0:7077d8f28b3e 142 void DrawAlarmStatus(bool Alarm);
sulymarco 0:7077d8f28b3e 143 void DisplayInRect(int X, int Y, int X_off, int Y_off, char* Value, int BackColor, unsigned char* Font);
sulymarco 0:7077d8f28b3e 144
sulymarco 0:7077d8f28b3e 145 void DrawButtonsValue(uint8_t Value);
sulymarco 0:7077d8f28b3e 146 void DrawSegmentsValue(uint8_t Value);
sulymarco 0:7077d8f28b3e 147 void DrawPotentiometerValue(uint16_t PotValue);
sulymarco 0:7077d8f28b3e 148
sulymarco 0:7077d8f28b3e 149
sulymarco 0:7077d8f28b3e 150 float ReadAnalog(AnalogIn Ana);
sulymarco 0:7077d8f28b3e 151
sulymarco 0:7077d8f28b3e 152
sulymarco 0:7077d8f28b3e 153 void Application();
sulymarco 0:7077d8f28b3e 154
sulymarco 0:7077d8f28b3e 155 void TouchScreenManagement();
sulymarco 0:7077d8f28b3e 156 bool TouchRead(uint16_t* X, uint16_t* Y);
sulymarco 0:7077d8f28b3e 157 uint16_t TouchRead_X();
sulymarco 0:7077d8f28b3e 158 uint16_t TouchRead_Y();
sulymarco 0:7077d8f28b3e 159 bool TouchRead_Z();
sulymarco 0:7077d8f28b3e 160
sulymarco 0:7077d8f28b3e 161
sulymarco 0:7077d8f28b3e 162
sulymarco 0:7077d8f28b3e 163 //---- global variables --------------------------------------------------------
sulymarco 0:7077d8f28b3e 164
sulymarco 0:7077d8f28b3e 165
sulymarco 0:7077d8f28b3e 166 bool TouchWasReleased;
sulymarco 0:7077d8f28b3e 167
sulymarco 0:7077d8f28b3e 168 bool FirstRound;
sulymarco 0:7077d8f28b3e 169
sulymarco 0:7077d8f28b3e 170 //------------------------------------------------------------------------------
sulymarco 0:7077d8f28b3e 171
sulymarco 0:7077d8f28b3e 172 SPI_TFT_ILI9341 TFT(PIN_MOSI, PIN_MISO, PIN_SCLK, PIN_CS_TFT, NC, PIN_DC_TFT);
sulymarco 0:7077d8f28b3e 173
sulymarco 0:7077d8f28b3e 174 Ticker SampleTicker;
sulymarco 0:7077d8f28b3e 175 Thread thread;
sulymarco 0:7077d8f28b3e 176
sulymarco 0:7077d8f28b3e 177 DigitalOut Test_1(D1); // debug test points
sulymarco 0:7077d8f28b3e 178 DigitalOut Test_2(D2); //
sulymarco 0:7077d8f28b3e 179 DigitalOut Test_3(D3); //
sulymarco 0:7077d8f28b3e 180 DigitalOut Test_4(D4); //
sulymarco 0:7077d8f28b3e 181
sulymarco 0:7077d8f28b3e 182
sulymarco 0:7077d8f28b3e 183 //------------------------------------------------------------------------------
sulymarco 0:7077d8f28b3e 184
sulymarco 0:7077d8f28b3e 185 float fAlarmThreshold;
sulymarco 0:7077d8f28b3e 186 bool AlarmOnOff;
sulymarco 0:7077d8f28b3e 187 bool AlarmMinMax;
sulymarco 0:7077d8f28b3e 188
sulymarco 0:7077d8f28b3e 189
sulymarco 0:7077d8f28b3e 190 uint16_t PotValue;
sulymarco 0:7077d8f28b3e 191 uint16_t PrevPotValue;
sulymarco 0:7077d8f28b3e 192 uint8_t Buttons;
sulymarco 0:7077d8f28b3e 193 uint8_t PrevButtons;
sulymarco 0:7077d8f28b3e 194 uint8_t Segments;
sulymarco 0:7077d8f28b3e 195 uint8_t PrevSegments;
sulymarco 0:7077d8f28b3e 196 int16_t Graph_x;
sulymarco 0:7077d8f28b3e 197
sulymarco 0:7077d8f28b3e 198 uint8_t Outputs;
sulymarco 0:7077d8f28b3e 199 uint8_t PrevOutputs;
sulymarco 0:7077d8f28b3e 200
sulymarco 0:7077d8f28b3e 201 uint8_t Inputs;
sulymarco 0:7077d8f28b3e 202 uint8_t PrevInputs;
sulymarco 0:7077d8f28b3e 203
sulymarco 0:7077d8f28b3e 204
sulymarco 0:7077d8f28b3e 205 int8_t VisuSlave;
sulymarco 0:7077d8f28b3e 206
sulymarco 0:7077d8f28b3e 207
sulymarco 0:7077d8f28b3e 208 //------------------------------------------------------------------------------
sulymarco 0:7077d8f28b3e 209
sulymarco 0:7077d8f28b3e 210 uint32_t Time;
sulymarco 0:7077d8f28b3e 211 uint32_t TimeBlink;
sulymarco 0:7077d8f28b3e 212 uint32_t TimeAutoRepeat;
sulymarco 0:7077d8f28b3e 213 uint32_t TimeAutoRepRepeat;
sulymarco 0:7077d8f28b3e 214 uint32_t TimePotentiometer;
sulymarco 0:7077d8f28b3e 215 uint32_t TimeTouchReleased;
sulymarco 0:7077d8f28b3e 216
sulymarco 0:7077d8f28b3e 217 bool Blink;
sulymarco 0:7077d8f28b3e 218
sulymarco 0:7077d8f28b3e 219 uint8_t TouchAxes = 0;
sulymarco 0:7077d8f28b3e 220 uint8_t Action = 0;
sulymarco 0:7077d8f28b3e 221
sulymarco 0:7077d8f28b3e 222 uint16_t X;
sulymarco 0:7077d8f28b3e 223 uint16_t Y;
sulymarco 0:7077d8f28b3e 224
sulymarco 0:7077d8f28b3e 225 float fTemperature;
sulymarco 0:7077d8f28b3e 226 float static fPrevTemperature;
sulymarco 0:7077d8f28b3e 227
sulymarco 0:7077d8f28b3e 228 int ExpectWorkCounter;
sulymarco 0:7077d8f28b3e 229 int WorkCounter;
sulymarco 0:7077d8f28b3e 230 int WorkCounterSafe;
sulymarco 0:7077d8f28b3e 231 bool NetworkError;
sulymarco 0:7077d8f28b3e 232 bool NetworkErrorSafe;
sulymarco 0:7077d8f28b3e 233
sulymarco 0:7077d8f28b3e 234 #define DATA_EXCHANGE_FLAG (1UL << 0)
sulymarco 0:7077d8f28b3e 235 #define APPLICATION_FLAG (1UL << 1)
sulymarco 0:7077d8f28b3e 236
sulymarco 0:7077d8f28b3e 237 EventFlags event_flags;
sulymarco 0:7077d8f28b3e 238
sulymarco 0:7077d8f28b3e 239 Mutex IO_data;
sulymarco 0:7077d8f28b3e 240
sulymarco 0:7077d8f28b3e 241
sulymarco 0:7077d8f28b3e 242 //---- data exchange thread ----------------------------------------------------
sulymarco 0:7077d8f28b3e 243
sulymarco 0:7077d8f28b3e 244 void ExchangeMaster()
sulymarco 0:7077d8f28b3e 245 {
sulymarco 0:7077d8f28b3e 246 while (true)
sulymarco 0:7077d8f28b3e 247 {
sulymarco 0:7077d8f28b3e 248
sulymarco 0:7077d8f28b3e 249
sulymarco 0:7077d8f28b3e 250 event_flags.wait_any(DATA_EXCHANGE_FLAG); // the thread waits for the synchronization flag
sulymarco 0:7077d8f28b3e 251
sulymarco 0:7077d8f28b3e 252 //Test_1 = 1;
sulymarco 0:7077d8f28b3e 253
sulymarco 0:7077d8f28b3e 254 IO_data.lock(); // Ethercat data exchange
sulymarco 0:7077d8f28b3e 255 ec_send_processdata(); //
sulymarco 0:7077d8f28b3e 256 WorkCounter = ec_receive_processdata(EC_TIMEOUTRET);
sulymarco 0:7077d8f28b3e 257
sulymarco 0:7077d8f28b3e 258 if (WorkCounter != ExpectWorkCounter)
sulymarco 0:7077d8f28b3e 259 NetworkError = true;
sulymarco 0:7077d8f28b3e 260 else
sulymarco 0:7077d8f28b3e 261 NetworkError = false;
sulymarco 0:7077d8f28b3e 262
sulymarco 0:7077d8f28b3e 263 IO_data.unlock(); //
sulymarco 0:7077d8f28b3e 264 event_flags.set(APPLICATION_FLAG); // synchronize the application
sulymarco 0:7077d8f28b3e 265
sulymarco 0:7077d8f28b3e 266 //Test_1 = 0;
sulymarco 0:7077d8f28b3e 267 }
sulymarco 0:7077d8f28b3e 268 }
sulymarco 0:7077d8f28b3e 269
sulymarco 0:7077d8f28b3e 270
sulymarco 0:7077d8f28b3e 271 //----- thicker generated sample time ------------------------------------------
sulymarco 0:7077d8f28b3e 272
sulymarco 0:7077d8f28b3e 273 void SampleIsr() // set the event that starts
sulymarco 0:7077d8f28b3e 274 { // the data exchange
sulymarco 0:7077d8f28b3e 275 event_flags.set(DATA_EXCHANGE_FLAG); //
sulymarco 0:7077d8f28b3e 276 } //
sulymarco 0:7077d8f28b3e 277
sulymarco 0:7077d8f28b3e 278
sulymarco 0:7077d8f28b3e 279 //****** initialization ********************************************************
sulymarco 0:7077d8f28b3e 280
sulymarco 0:7077d8f28b3e 281 int main()
sulymarco 0:7077d8f28b3e 282 {
sulymarco 0:7077d8f28b3e 283 int i;
sulymarco 0:7077d8f28b3e 284
sulymarco 0:7077d8f28b3e 285 printf("Start \n");
sulymarco 0:7077d8f28b3e 286
sulymarco 0:7077d8f28b3e 287 Test_1 = 0;
sulymarco 0:7077d8f28b3e 288 Test_2 = 0;
sulymarco 0:7077d8f28b3e 289 Test_3 = 0;
sulymarco 0:7077d8f28b3e 290 Test_4 = 0;
sulymarco 0:7077d8f28b3e 291
sulymarco 0:7077d8f28b3e 292 TFT.background(Black); // init TFT
sulymarco 0:7077d8f28b3e 293 TFT.cls(); //
sulymarco 0:7077d8f28b3e 294 TFT.set_orientation(3); //
sulymarco 0:7077d8f28b3e 295
sulymarco 0:7077d8f28b3e 296 DrawBanner();
sulymarco 0:7077d8f28b3e 297
sulymarco 0:7077d8f28b3e 298 NetworkError = false;
sulymarco 0:7077d8f28b3e 299 VisuSlave = LAB_1;
sulymarco 0:7077d8f28b3e 300
sulymarco 0:7077d8f28b3e 301 AlarmOnOff = true;
sulymarco 0:7077d8f28b3e 302 AlarmMinMax = false;
sulymarco 0:7077d8f28b3e 303 fAlarmThreshold = 28.8;
sulymarco 0:7077d8f28b3e 304 fTemperature = 0;
sulymarco 0:7077d8f28b3e 305 TouchWasReleased = true;
sulymarco 0:7077d8f28b3e 306
sulymarco 0:7077d8f28b3e 307
sulymarco 0:7077d8f28b3e 308 if (ec_init(NULL)) // init SOEM
sulymarco 0:7077d8f28b3e 309 {
sulymarco 0:7077d8f28b3e 310 printf("ec_init succeeded.\n");
sulymarco 0:7077d8f28b3e 311 printf("Scanning the network\n");
sulymarco 0:7077d8f28b3e 312
sulymarco 0:7077d8f28b3e 313 TFT.cls();
sulymarco 0:7077d8f28b3e 314
sulymarco 0:7077d8f28b3e 315 TFT.set_font((unsigned char*) Arial12x12);
sulymarco 0:7077d8f28b3e 316 TFT.foreground(Green);
sulymarco 0:7077d8f28b3e 317 TFT.locate(0, 0);
sulymarco 0:7077d8f28b3e 318
sulymarco 0:7077d8f28b3e 319 TFT.printf("Scanning the network\n");
sulymarco 0:7077d8f28b3e 320
sulymarco 0:7077d8f28b3e 321 if (network_scanning())
sulymarco 0:7077d8f28b3e 322 {
sulymarco 0:7077d8f28b3e 323 if (network_configuration()) // check network configuration
sulymarco 0:7077d8f28b3e 324 {
sulymarco 0:7077d8f28b3e 325 ec_config_map(&IOmap); // map the I/O
sulymarco 0:7077d8f28b3e 326 MapLocalStructures();
sulymarco 0:7077d8f28b3e 327
sulymarco 0:7077d8f28b3e 328 printf("\nSlaves mapped, state to SAFE_OP.\n");
sulymarco 0:7077d8f28b3e 329 // wait for all slaves to reach SAFE_OP state
sulymarco 0:7077d8f28b3e 330 ec_statecheck(0, EC_STATE_SAFE_OP, EC_TIMEOUTSTATE);
sulymarco 0:7077d8f28b3e 331
sulymarco 0:7077d8f28b3e 332 printf("Request operational state for all slaves\n");
sulymarco 0:7077d8f28b3e 333 ec_slave[0].state = EC_STATE_OPERATIONAL;
sulymarco 0:7077d8f28b3e 334
sulymarco 0:7077d8f28b3e 335 ec_send_processdata(); // send one valid process data to make outputs in slaves happy
sulymarco 0:7077d8f28b3e 336 ExpectWorkCounter = ec_receive_processdata(EC_TIMEOUTRET);
sulymarco 0:7077d8f28b3e 337
sulymarco 0:7077d8f28b3e 338 ec_writestate(0); // request OP state for all slaves
sulymarco 0:7077d8f28b3e 339
sulymarco 0:7077d8f28b3e 340 // wait for all slaves to reach OP state
sulymarco 0:7077d8f28b3e 341 ec_statecheck(0, EC_STATE_OPERATIONAL, EC_TIMEOUTSTATE);
sulymarco 0:7077d8f28b3e 342 if (ec_slave[0].state == EC_STATE_OPERATIONAL )
sulymarco 0:7077d8f28b3e 343 {
sulymarco 0:7077d8f28b3e 344 printf("Operational state reached for all slaves.\n");
sulymarco 0:7077d8f28b3e 345 }
sulymarco 0:7077d8f28b3e 346 else
sulymarco 0:7077d8f28b3e 347 {
sulymarco 0:7077d8f28b3e 348 printf("Not all slaves reached operational state.\n");
sulymarco 0:7077d8f28b3e 349 ec_readstate();
sulymarco 0:7077d8f28b3e 350 for(i = 1; i<=ec_slavecount ; i++)
sulymarco 0:7077d8f28b3e 351 {
sulymarco 0:7077d8f28b3e 352 if(ec_slave[i].state != EC_STATE_OPERATIONAL)
sulymarco 0:7077d8f28b3e 353 {
sulymarco 0:7077d8f28b3e 354 printf("Slave %d State=0x%04x StatusCode=0x%04x\n",
sulymarco 0:7077d8f28b3e 355 i, ec_slave[i].state, ec_slave[i].ALstatuscode);
sulymarco 0:7077d8f28b3e 356 }
sulymarco 0:7077d8f28b3e 357 }
sulymarco 0:7077d8f28b3e 358
sulymarco 0:7077d8f28b3e 359 TFT.foreground(Red);
sulymarco 0:7077d8f28b3e 360 TFT.locate(0, 0);
sulymarco 0:7077d8f28b3e 361 TFT.printf("Not all slaves reached operational state!");
sulymarco 0:7077d8f28b3e 362 while(1){}
sulymarco 0:7077d8f28b3e 363 }
sulymarco 0:7077d8f28b3e 364
sulymarco 0:7077d8f28b3e 365 DrawSlaveFixedParts();
sulymarco 0:7077d8f28b3e 366
sulymarco 0:7077d8f28b3e 367 thread.start(ExchangeMaster);
sulymarco 0:7077d8f28b3e 368 thread.set_priority(osPriorityRealtime);
sulymarco 0:7077d8f28b3e 369
sulymarco 0:7077d8f28b3e 370 SampleTicker.attach_us(&SampleIsr, CYCLE_TIME);
sulymarco 0:7077d8f28b3e 371
sulymarco 0:7077d8f28b3e 372 Application();
sulymarco 0:7077d8f28b3e 373 }
sulymarco 0:7077d8f28b3e 374
sulymarco 0:7077d8f28b3e 375 else
sulymarco 0:7077d8f28b3e 376 {
sulymarco 0:7077d8f28b3e 377 printf("Mismatch of network units!\n");
sulymarco 0:7077d8f28b3e 378 TFT.foreground(Red);
sulymarco 0:7077d8f28b3e 379 TFT.locate(0, 0);
sulymarco 0:7077d8f28b3e 380 TFT.printf("Mismatch of network units!");
sulymarco 0:7077d8f28b3e 381
sulymarco 0:7077d8f28b3e 382 while(1){}
sulymarco 0:7077d8f28b3e 383 }
sulymarco 0:7077d8f28b3e 384 }
sulymarco 0:7077d8f28b3e 385
sulymarco 0:7077d8f28b3e 386 else
sulymarco 0:7077d8f28b3e 387 {
sulymarco 0:7077d8f28b3e 388 printf("No slaves found!\n");
sulymarco 0:7077d8f28b3e 389 TFT.foreground(Red);
sulymarco 0:7077d8f28b3e 390 TFT.printf("No slaves found!");
sulymarco 0:7077d8f28b3e 391
sulymarco 0:7077d8f28b3e 392 while(1){}
sulymarco 0:7077d8f28b3e 393 }
sulymarco 0:7077d8f28b3e 394 }
sulymarco 0:7077d8f28b3e 395 else
sulymarco 0:7077d8f28b3e 396 {
sulymarco 0:7077d8f28b3e 397 printf("Ethernet interface init failed!");
sulymarco 0:7077d8f28b3e 398 TFT.foreground(Red);
sulymarco 0:7077d8f28b3e 399 TFT.locate(0, 0);
sulymarco 0:7077d8f28b3e 400 TFT.printf("Ethernet interface init failed!");
sulymarco 0:7077d8f28b3e 401 while(1){}
sulymarco 0:7077d8f28b3e 402 }
sulymarco 0:7077d8f28b3e 403 }
sulymarco 0:7077d8f28b3e 404
sulymarco 0:7077d8f28b3e 405
sulymarco 0:7077d8f28b3e 406 //****** user master application **********************************************
sulymarco 0:7077d8f28b3e 407
sulymarco 0:7077d8f28b3e 408 void Application()
sulymarco 0:7077d8f28b3e 409 {
sulymarco 0:7077d8f28b3e 410
sulymarco 0:7077d8f28b3e 411 while(1)
sulymarco 0:7077d8f28b3e 412 {
sulymarco 0:7077d8f28b3e 413 event_flags.wait_any(APPLICATION_FLAG); // the application waits for the synchronization flag
sulymarco 0:7077d8f28b3e 414
sulymarco 0:7077d8f28b3e 415 //Test_2 = 1;
sulymarco 0:7077d8f28b3e 416
sulymarco 0:7077d8f28b3e 417 IO_data.lock(); // copy the Ethercat data to a safe buffer
sulymarco 0:7077d8f28b3e 418 memcpy(&IOmapSafe[0], &IOmap[0], IO_MAP_SIZE); //
sulymarco 0:7077d8f28b3e 419 //
sulymarco 0:7077d8f28b3e 420 if (NetworkError) //
sulymarco 0:7077d8f28b3e 421 { //
sulymarco 0:7077d8f28b3e 422 NetworkErrorSafe = NetworkError; //
sulymarco 0:7077d8f28b3e 423 WorkCounterSafe = WorkCounter; //
sulymarco 0:7077d8f28b3e 424 } //
sulymarco 0:7077d8f28b3e 425 IO_data.unlock(); //
sulymarco 0:7077d8f28b3e 426
sulymarco 0:7077d8f28b3e 427 if (NetworkErrorSafe)
sulymarco 0:7077d8f28b3e 428 {
sulymarco 0:7077d8f28b3e 429 TFT.rect(35,50, 285, 182, Red);
sulymarco 0:7077d8f28b3e 430 TFT.fillrect(36,51, 284, 181, Black);
sulymarco 0:7077d8f28b3e 431 TFT.foreground(Red);
sulymarco 0:7077d8f28b3e 432 TFT.set_font((unsigned char*) Arial28x28);
sulymarco 0:7077d8f28b3e 433 TFT.locate(58, 65);
sulymarco 0:7077d8f28b3e 434 TFT.printf("Network error!");
sulymarco 0:7077d8f28b3e 435 printf("Network error!\n");
sulymarco 0:7077d8f28b3e 436 TFT.foreground(Magenta);
sulymarco 0:7077d8f28b3e 437 TFT.set_font((unsigned char*) Arial12x12);
sulymarco 0:7077d8f28b3e 438 TFT.locate(58, 106);
sulymarco 0:7077d8f28b3e 439
sulymarco 0:7077d8f28b3e 440 if(WorkCounterSafe >= 0)
sulymarco 0:7077d8f28b3e 441 {
sulymarco 0:7077d8f28b3e 442 TFT.printf("Expected working counter %d", ExpectWorkCounter);
sulymarco 0:7077d8f28b3e 443 TFT.locate(58, 118);
sulymarco 0:7077d8f28b3e 444 TFT.printf("Actual working counter %d", WorkCounterSafe);
sulymarco 0:7077d8f28b3e 445 printf("Expected working counter %d\n", ExpectWorkCounter);
sulymarco 0:7077d8f28b3e 446 printf("Actual working counter %d\n", WorkCounterSafe);
sulymarco 0:7077d8f28b3e 447 }
sulymarco 0:7077d8f28b3e 448 else
sulymarco 0:7077d8f28b3e 449 {
sulymarco 0:7077d8f28b3e 450 TFT.printf("Timeout");
sulymarco 0:7077d8f28b3e 451 printf("Timeout\n");
sulymarco 0:7077d8f28b3e 452 }
sulymarco 0:7077d8f28b3e 453
sulymarco 0:7077d8f28b3e 454 TFT.foreground(Green);
sulymarco 0:7077d8f28b3e 455 TFT.locate(58, 142);
sulymarco 0:7077d8f28b3e 456 TFT.printf("Please fix the error and");
sulymarco 0:7077d8f28b3e 457 TFT.locate(58, 154);
sulymarco 0:7077d8f28b3e 458 TFT.printf("press the reset button");
sulymarco 0:7077d8f28b3e 459 printf("Please fix the error and press the reset button \n");
sulymarco 0:7077d8f28b3e 460
sulymarco 0:7077d8f28b3e 461 SampleTicker.detach(); // stop the sample interrupt
sulymarco 0:7077d8f28b3e 462 while(1){} // and loop for ever
sulymarco 0:7077d8f28b3e 463 }
sulymarco 0:7077d8f28b3e 464
sulymarco 0:7077d8f28b3e 465 //----- slave 1 data management ------------
sulymarco 0:7077d8f28b3e 466
sulymarco 0:7077d8f28b3e 467 fTemperature = in_LAB_1->Temperature; // read the temperature
sulymarco 0:7077d8f28b3e 468
sulymarco 0:7077d8f28b3e 469 if (fTemperature != fPrevTemperature) // check if the temperature has changed
sulymarco 0:7077d8f28b3e 470 {
sulymarco 0:7077d8f28b3e 471 fPrevTemperature = fTemperature; // remember the current temperature value
sulymarco 0:7077d8f28b3e 472
sulymarco 0:7077d8f28b3e 473 if (VisuSlave == LAB_1) // if the HMI is setted to slave 1
sulymarco 0:7077d8f28b3e 474 { // visualize it
sulymarco 0:7077d8f28b3e 475 DrawTemperatureValue (fTemperature); //
sulymarco 0:7077d8f28b3e 476 }
sulymarco 0:7077d8f28b3e 477 }
sulymarco 0:7077d8f28b3e 478
sulymarco 0:7077d8f28b3e 479 bool AlarmStatus;
sulymarco 0:7077d8f28b3e 480 if (AlarmOnOff) // check if we are in alarm
sulymarco 0:7077d8f28b3e 481 { //
sulymarco 0:7077d8f28b3e 482 if ((AlarmMinMax && (fTemperature < fAlarmThreshold)) || (!AlarmMinMax && (fTemperature > fAlarmThreshold)))
sulymarco 0:7077d8f28b3e 483 {
sulymarco 0:7077d8f28b3e 484 out_LAB_1->Alarm = 0x01; // signal the alarm condition to the slave
sulymarco 0:7077d8f28b3e 485 AlarmStatus = true; // and to remember it
sulymarco 0:7077d8f28b3e 486 }
sulymarco 0:7077d8f28b3e 487 else
sulymarco 0:7077d8f28b3e 488 {
sulymarco 0:7077d8f28b3e 489 out_LAB_1->Alarm = 0x00; // signal the no alarm condition to the slave
sulymarco 0:7077d8f28b3e 490 AlarmStatus = false; // and remember it
sulymarco 0:7077d8f28b3e 491 }
sulymarco 0:7077d8f28b3e 492 }
sulymarco 0:7077d8f28b3e 493 else
sulymarco 0:7077d8f28b3e 494 {
sulymarco 0:7077d8f28b3e 495 out_LAB_1->Alarm = 0x00; // signal the no alarm condition to the slave
sulymarco 0:7077d8f28b3e 496 AlarmStatus = false; // and remember it
sulymarco 0:7077d8f28b3e 497 }
sulymarco 0:7077d8f28b3e 498
sulymarco 0:7077d8f28b3e 499 if (VisuSlave == LAB_1) // if the HMI is set to slave 1
sulymarco 0:7077d8f28b3e 500 { //
sulymarco 0:7077d8f28b3e 501 DrawAlarmStatus(AlarmStatus); // update the alarm status on the TFT
sulymarco 0:7077d8f28b3e 502 }
sulymarco 0:7077d8f28b3e 503
sulymarco 0:7077d8f28b3e 504 if (VisuSlave == LAB_1 && FirstRound) // if the HMI is set to slave 1
sulymarco 0:7077d8f28b3e 505 { // and it is the first time
sulymarco 0:7077d8f28b3e 506 FirstRound = false; //
sulymarco 0:7077d8f28b3e 507 DrawTemperatureValue (fTemperature); // draw the current temperature value
sulymarco 0:7077d8f28b3e 508 DrawAlarmSettings(fAlarmThreshold, AlarmOnOff, AlarmMinMax); // draw the alarm settings
sulymarco 0:7077d8f28b3e 509 }
sulymarco 0:7077d8f28b3e 510
sulymarco 0:7077d8f28b3e 511 //----- end LAB_1 ------------------------
sulymarco 0:7077d8f28b3e 512
sulymarco 0:7077d8f28b3e 513
sulymarco 0:7077d8f28b3e 514 //----- slave 2 data management ------------
sulymarco 0:7077d8f28b3e 515
sulymarco 0:7077d8f28b3e 516 PotValue = in_LAB_2->Potentiometer; // read the potentiometer value
sulymarco 0:7077d8f28b3e 517
sulymarco 0:7077d8f28b3e 518 if (VisuSlave == LAB_2) // if the HMI is setted to slave 2
sulymarco 0:7077d8f28b3e 519 { //
sulymarco 0:7077d8f28b3e 520 Time = SysMilliS(); // and the visualization timer is elapsed
sulymarco 0:7077d8f28b3e 521 if (Time-TimePotentiometer > TIME_POTENTIOMETER) //
sulymarco 0:7077d8f28b3e 522 { // draw the potentiometer value
sulymarco 0:7077d8f28b3e 523 TimePotentiometer = Time; //
sulymarco 0:7077d8f28b3e 524 DrawPotentiometerValue(PotValue); //
sulymarco 0:7077d8f28b3e 525 } //
sulymarco 0:7077d8f28b3e 526 }
sulymarco 0:7077d8f28b3e 527
sulymarco 0:7077d8f28b3e 528 Buttons = in_LAB_2->Buttons; // read the buttons status from the slave
sulymarco 0:7077d8f28b3e 529
sulymarco 0:7077d8f28b3e 530 if (Buttons != PrevButtons) // check if the buttons value has changed
sulymarco 0:7077d8f28b3e 531 {
sulymarco 0:7077d8f28b3e 532 PrevButtons = Buttons; // remember the current buttons value
sulymarco 0:7077d8f28b3e 533
sulymarco 0:7077d8f28b3e 534 if (VisuSlave == LAB_2) // if the HMI is setted to slave 2
sulymarco 0:7077d8f28b3e 535 { //
sulymarco 0:7077d8f28b3e 536 DrawButtonsValue(Buttons); // draw the current buttons value
sulymarco 0:7077d8f28b3e 537 } //
sulymarco 0:7077d8f28b3e 538 }
sulymarco 0:7077d8f28b3e 539
sulymarco 0:7077d8f28b3e 540 if (Segments != PrevSegments) // check if the segments value has changed
sulymarco 0:7077d8f28b3e 541 {
sulymarco 0:7077d8f28b3e 542 PrevSegments = Segments; // remember the current segments value
sulymarco 0:7077d8f28b3e 543
sulymarco 0:7077d8f28b3e 544 if (VisuSlave == LAB_2) // if the HMI is setted to slave 2
sulymarco 0:7077d8f28b3e 545 { //
sulymarco 0:7077d8f28b3e 546 DrawSegmentsValue(Segments); // draw the current segments value
sulymarco 0:7077d8f28b3e 547 } //
sulymarco 0:7077d8f28b3e 548 }
sulymarco 0:7077d8f28b3e 549
sulymarco 0:7077d8f28b3e 550 if (VisuSlave == LAB_2 && FirstRound) // if the HMI is set to slave 2
sulymarco 0:7077d8f28b3e 551 { // and it is the first time
sulymarco 0:7077d8f28b3e 552 FirstRound = false; //
sulymarco 0:7077d8f28b3e 553 //
sulymarco 0:7077d8f28b3e 554 DrawButtonsValue(Buttons); // draw the current buttons value
sulymarco 0:7077d8f28b3e 555 DrawSegmentsValue(Segments); // draw the current segments value
sulymarco 0:7077d8f28b3e 556 }
sulymarco 0:7077d8f28b3e 557
sulymarco 0:7077d8f28b3e 558 out_LAB_2->Segments = Segments; // send the segments status to the slave
sulymarco 0:7077d8f28b3e 559
sulymarco 0:7077d8f28b3e 560
sulymarco 0:7077d8f28b3e 561 //----- end LAB_2 ------------------------
sulymarco 0:7077d8f28b3e 562
EasyCAT 2:7d4fd6354015 563
sulymarco 0:7077d8f28b3e 564 TouchScreenManagement(); // check if the touchscreen is tapped
sulymarco 0:7077d8f28b3e 565 // and handle it
sulymarco 0:7077d8f28b3e 566
sulymarco 0:7077d8f28b3e 567 Time = SysMilliS(); // toggle the variable Blink every
sulymarco 0:7077d8f28b3e 568 if ((Time-TimeBlink) > TIME_BLINK) // TIME_BLINK mS
sulymarco 0:7077d8f28b3e 569 { //
sulymarco 0:7077d8f28b3e 570 TimeBlink = Time; // we use it to blink a field on the TFT
sulymarco 0:7077d8f28b3e 571 Blink = !Blink; //
sulymarco 0:7077d8f28b3e 572 }
sulymarco 0:7077d8f28b3e 573
sulymarco 0:7077d8f28b3e 574 IO_data.lock(); // copy the IO data from the safe area
sulymarco 0:7077d8f28b3e 575 memcpy(&IOmap[0], &IOmapSafe[0], IO_MAP_SIZE); // to the EtherCAT buffer
sulymarco 0:7077d8f28b3e 576 IO_data.unlock(); //
sulymarco 0:7077d8f28b3e 577
sulymarco 0:7077d8f28b3e 578 //Test_2 = 0;
sulymarco 0:7077d8f28b3e 579 }
sulymarco 0:7077d8f28b3e 580 }
sulymarco 0:7077d8f28b3e 581
sulymarco 0:7077d8f28b3e 582
sulymarco 0:7077d8f28b3e 583 //******************************************************************************
sulymarco 0:7077d8f28b3e 584
sulymarco 0:7077d8f28b3e 585
sulymarco 0:7077d8f28b3e 586
sulymarco 0:7077d8f28b3e 587 //******* general functions ****************************************************
sulymarco 0:7077d8f28b3e 588
sulymarco 0:7077d8f28b3e 589
sulymarco 0:7077d8f28b3e 590 //------ touchscreen management ------------------------------------------------
sulymarco 0:7077d8f28b3e 591
sulymarco 0:7077d8f28b3e 592 void TouchScreenManagement()
sulymarco 0:7077d8f28b3e 593 {
sulymarco 0:7077d8f28b3e 594 uint16_t X;
sulymarco 0:7077d8f28b3e 595 uint16_t Y;
sulymarco 0:7077d8f28b3e 596
sulymarco 0:7077d8f28b3e 597 int i;
sulymarco 0:7077d8f28b3e 598
sulymarco 0:7077d8f28b3e 599
sulymarco 0:7077d8f28b3e 600 if (TouchRead(&X, &Y)) // the touchscreen has been tapped
sulymarco 0:7077d8f28b3e 601 {
sulymarco 0:7077d8f28b3e 602 TimeTouchReleased = SysMilliS();
sulymarco 0:7077d8f28b3e 603 // check if it is the side menu
sulymarco 0:7077d8f28b3e 604 // decrement slave button
sulymarco 0:7077d8f28b3e 605 if ((X>MENU_X) && (X>MENU_X+MENU_WIDTH/2) && (Y>MENU_HEIGHT) && (Y<MENU_HEIGHT*2))
sulymarco 0:7077d8f28b3e 606 { //
sulymarco 0:7077d8f28b3e 607 VisuSlave--;
sulymarco 0:7077d8f28b3e 608
sulymarco 0:7077d8f28b3e 609 if (VisuSlave == 0) //
sulymarco 0:7077d8f28b3e 610 VisuSlave = SLAVE_NUM; //
sulymarco 0:7077d8f28b3e 611 // the visualized slave has changed
sulymarco 0:7077d8f28b3e 612 DrawSlaveFixedParts(); // draw the new slave fixed parts
sulymarco 0:7077d8f28b3e 613 } //
sulymarco 0:7077d8f28b3e 614
sulymarco 0:7077d8f28b3e 615 // check if it is the side menu
sulymarco 0:7077d8f28b3e 616 // increment slave button
sulymarco 0:7077d8f28b3e 617 if ((X>MENU_X) && (X<MENU_X+MENU_WIDTH/2) && (Y>MENU_HEIGHT) && (Y<MENU_HEIGHT*2))
sulymarco 0:7077d8f28b3e 618 { //
sulymarco 0:7077d8f28b3e 619 VisuSlave++;
sulymarco 0:7077d8f28b3e 620
sulymarco 0:7077d8f28b3e 621 if (VisuSlave > SLAVE_NUM) //
sulymarco 0:7077d8f28b3e 622 VisuSlave = LAB_1; //
sulymarco 0:7077d8f28b3e 623 // the visualized slave has changed
sulymarco 0:7077d8f28b3e 624 DrawSlaveFixedParts(); // draw the new slave fixed parts
sulymarco 0:7077d8f28b3e 625 } //
sulymarco 0:7077d8f28b3e 626
sulymarco 0:7077d8f28b3e 627 switch (VisuSlave) // check which slave is visualized on the TFT
sulymarco 0:7077d8f28b3e 628 {
sulymarco 0:7077d8f28b3e 629 case (LAB_1): //-------------- slave 1 -----------------------
sulymarco 0:7077d8f28b3e 630
sulymarco 0:7077d8f28b3e 631
sulymarco 0:7077d8f28b3e 632 if(TouchWasReleased) // first check if the touch was
sulymarco 0:7077d8f28b3e 633 { // not tapped in the previous rounds
sulymarco 0:7077d8f28b3e 634 TouchWasReleased = false; // because for the following fields
sulymarco 0:7077d8f28b3e 635 TimeTouchReleased = SysMilliS(); // we don't want autorepeat
sulymarco 0:7077d8f28b3e 636
sulymarco 0:7077d8f28b3e 637 TimeAutoRepeat = SysMilliS(); // reload the autorepeat time
sulymarco 0:7077d8f28b3e 638
sulymarco 0:7077d8f28b3e 639 // handle taps on the ">" and "<" buttons
sulymarco 0:7077d8f28b3e 640 if ((X>ALARM_X) && (X<ALARM_X+(ALARM_WIDTH/2)) && (Y>ALARM_Y+ALARM_HEIGHT) && (Y<ALARM_Y+ALARM_HEIGHT*2))
sulymarco 0:7077d8f28b3e 641 { //
sulymarco 0:7077d8f28b3e 642 AlarmMinMax = true; //
sulymarco 0:7077d8f28b3e 643 DrawAlarmSettings(fAlarmThreshold, AlarmOnOff, AlarmMinMax);
sulymarco 0:7077d8f28b3e 644 } //
sulymarco 0:7077d8f28b3e 645 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 646 { //
sulymarco 0:7077d8f28b3e 647 AlarmMinMax = false; //
sulymarco 0:7077d8f28b3e 648 DrawAlarmSettings(fAlarmThreshold, AlarmOnOff, AlarmMinMax);
sulymarco 0:7077d8f28b3e 649 }
sulymarco 0:7077d8f28b3e 650
sulymarco 0:7077d8f28b3e 651 // handle taps on the "ON" and "OFF" buttons
sulymarco 0:7077d8f28b3e 652 if ((X>ALARM_X) && (X<ALARM_X+(ALARM_WIDTH/2)) && (Y>ALARM_Y) && (Y<ALARM_Y+ALARM_HEIGHT))
sulymarco 0:7077d8f28b3e 653 { //
sulymarco 0:7077d8f28b3e 654 AlarmOnOff = true; //
sulymarco 0:7077d8f28b3e 655 DrawAlarmSettings(fAlarmThreshold, AlarmOnOff, AlarmMinMax);
sulymarco 0:7077d8f28b3e 656 } //
sulymarco 0:7077d8f28b3e 657 if ((X>ALARM_X+(ALARM_WIDTH/2)) && (X<ALARM_X+(ALARM_WIDTH)) && (Y>ALARM_Y) && (Y<ALARM_Y+ALARM_HEIGHT))
sulymarco 0:7077d8f28b3e 658 { //
sulymarco 0:7077d8f28b3e 659 AlarmOnOff = false; //
sulymarco 0:7077d8f28b3e 660 DrawAlarmSettings(fAlarmThreshold, AlarmOnOff, AlarmMinMax);
sulymarco 0:7077d8f28b3e 661 }
sulymarco 0:7077d8f28b3e 662
sulymarco 0:7077d8f28b3e 663 // handle taps on the "+" and "-" buttons
sulymarco 0:7077d8f28b3e 664 // here we don't use the autorepeat to increment
sulymarco 0:7077d8f28b3e 665 // or decrement the threshold by 0.1
sulymarco 0:7077d8f28b3e 666 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 667 { //
sulymarco 0:7077d8f28b3e 668 fAlarmThreshold += 0.1; //
sulymarco 0:7077d8f28b3e 669 DrawOnlyThreshold(fAlarmThreshold, AlarmOnOff, AlarmMinMax);
sulymarco 0:7077d8f28b3e 670 } //
sulymarco 0:7077d8f28b3e 671 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 672 { //
sulymarco 0:7077d8f28b3e 673 fAlarmThreshold -= 0.1; //
sulymarco 0:7077d8f28b3e 674 DrawOnlyThreshold(fAlarmThreshold, AlarmOnOff, AlarmMinMax);
sulymarco 0:7077d8f28b3e 675 } //
sulymarco 0:7077d8f28b3e 676 }
sulymarco 0:7077d8f28b3e 677
sulymarco 0:7077d8f28b3e 678 else // autorepeat management
sulymarco 0:7077d8f28b3e 679 { //
sulymarco 0:7077d8f28b3e 680 Time = SysMilliS(); //
sulymarco 0:7077d8f28b3e 681 if (Time-TimeAutoRepeat > TIME_AUTO_REP_START) //
sulymarco 0:7077d8f28b3e 682 { //
sulymarco 0:7077d8f28b3e 683 if (Time-TimeAutoRepRepeat > TIME_AUTO_REP_REPEAT)
sulymarco 0:7077d8f28b3e 684 { //
sulymarco 0:7077d8f28b3e 685 TimeAutoRepRepeat = Time; //
sulymarco 0:7077d8f28b3e 686
sulymarco 0:7077d8f28b3e 687 // handle taps on the "+" and "-" buttons
sulymarco 0:7077d8f28b3e 688 // here we use the autorepeat to increment
sulymarco 0:7077d8f28b3e 689 // or decrement the threshold by 1
sulymarco 0:7077d8f28b3e 690 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 691 { //
sulymarco 0:7077d8f28b3e 692 fAlarmThreshold += 1; //
sulymarco 0:7077d8f28b3e 693 DrawOnlyThreshold(fAlarmThreshold, AlarmOnOff, AlarmMinMax);
sulymarco 0:7077d8f28b3e 694 } //
sulymarco 0:7077d8f28b3e 695 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 696 { //
sulymarco 0:7077d8f28b3e 697 fAlarmThreshold -= 1; //
sulymarco 0:7077d8f28b3e 698 DrawOnlyThreshold(fAlarmThreshold, AlarmOnOff, AlarmMinMax);
sulymarco 0:7077d8f28b3e 699 }
sulymarco 0:7077d8f28b3e 700 }
sulymarco 0:7077d8f28b3e 701 }
sulymarco 0:7077d8f28b3e 702 }
sulymarco 0:7077d8f28b3e 703
sulymarco 0:7077d8f28b3e 704 break; //-------------- end slave 1 -------------------
sulymarco 0:7077d8f28b3e 705
sulymarco 0:7077d8f28b3e 706
sulymarco 0:7077d8f28b3e 707
sulymarco 0:7077d8f28b3e 708 case (LAB_2): //-------------- slave 2 -----------------------
sulymarco 0:7077d8f28b3e 709
sulymarco 0:7077d8f28b3e 710 if(TouchWasReleased) // first check if the touch was
sulymarco 0:7077d8f28b3e 711 { // not tapped in the previous rounds
sulymarco 0:7077d8f28b3e 712 TouchWasReleased = false; // because for the following fields
sulymarco 0:7077d8f28b3e 713 TimeTouchReleased = SysMilliS(); // we don't want autorepeat
sulymarco 0:7077d8f28b3e 714
sulymarco 0:7077d8f28b3e 715 uint8_t Mask = 0x08; // check if one of the segment is tapped
sulymarco 0:7077d8f28b3e 716 //
sulymarco 0:7077d8f28b3e 717 for (i=0; i<4; i++) //
sulymarco 0:7077d8f28b3e 718 { //
sulymarco 0:7077d8f28b3e 719 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 720 { //
sulymarco 0:7077d8f28b3e 721 Segments ^= Mask >> i; //
sulymarco 0:7077d8f28b3e 722 } //
sulymarco 0:7077d8f28b3e 723 } //
sulymarco 0:7077d8f28b3e 724 }
sulymarco 0:7077d8f28b3e 725 break; //----------------- end slave 2 ----------------
sulymarco 0:7077d8f28b3e 726 }
sulymarco 0:7077d8f28b3e 727 }
sulymarco 0:7077d8f28b3e 728
sulymarco 0:7077d8f28b3e 729 else
sulymarco 0:7077d8f28b3e 730 {
sulymarco 0:7077d8f28b3e 731 if ( SysMilliS()-TimeTouchReleased > TIME_TOUCH_RELEASED) // if the touchscreen was not
sulymarco 0:7077d8f28b3e 732 { // tapped for enought time
sulymarco 0:7077d8f28b3e 733 TouchWasReleased = true; // remember it
sulymarco 0:7077d8f28b3e 734
sulymarco 0:7077d8f28b3e 735 }
sulymarco 0:7077d8f28b3e 736 }
sulymarco 0:7077d8f28b3e 737 }
sulymarco 0:7077d8f28b3e 738
sulymarco 0:7077d8f28b3e 739
sulymarco 0:7077d8f28b3e 740 //----- draw the fixed part of the visualized slave ----------------------------
sulymarco 0:7077d8f28b3e 741
sulymarco 0:7077d8f28b3e 742 void DrawSlaveFixedParts()
sulymarco 0:7077d8f28b3e 743 {
sulymarco 0:7077d8f28b3e 744 int i;
sulymarco 0:7077d8f28b3e 745 int Offset;
sulymarco 0:7077d8f28b3e 746
sulymarco 0:7077d8f28b3e 747 TFT.cls(); // clear screen
sulymarco 0:7077d8f28b3e 748 DrawSideMenu(VisuSlave); // draw the side menu
sulymarco 0:7077d8f28b3e 749
sulymarco 0:7077d8f28b3e 750 switch (VisuSlave) // check which slave is visualized on the TFT
sulymarco 0:7077d8f28b3e 751 {
sulymarco 0:7077d8f28b3e 752 case (LAB_1): //-------------- slave 1 ---------------------------
sulymarco 0:7077d8f28b3e 753
sulymarco 0:7077d8f28b3e 754 TFT.foreground(Yellow); // draw the thermometer
sulymarco 0:7077d8f28b3e 755
sulymarco 0:7077d8f28b3e 756 TFT.circle(TERMO_X, TERMO_Y, 18, Yellow); // bowl
sulymarco 0:7077d8f28b3e 757 TFT.fillcircle(TERMO_X, TERMO_Y, 17, Red); //
sulymarco 0:7077d8f28b3e 758
sulymarco 0:7077d8f28b3e 759 // tube
sulymarco 0:7077d8f28b3e 760 TFT.rect(TERMO_X-8, TERMO_Y-185, TERMO_X+8, TERMO_Y-18, Yellow);
sulymarco 0:7077d8f28b3e 761 TFT.fillrect(TERMO_X-7, TERMO_Y-18, TERMO_X+7, TERMO_Y-16, Red);
sulymarco 0:7077d8f28b3e 762
sulymarco 0:7077d8f28b3e 763 for (i=0; i<8; i++) // scale
sulymarco 0:7077d8f28b3e 764 { //
sulymarco 0:7077d8f28b3e 765 if (i <1) //
sulymarco 0:7077d8f28b3e 766 Offset = 5; //
sulymarco 0:7077d8f28b3e 767 else //
sulymarco 0:7077d8f28b3e 768 Offset = 0; //
sulymarco 0:7077d8f28b3e 769 //
sulymarco 0:7077d8f28b3e 770 TFT.line(TERMO_X-8, (TERMO_Y-28)-(i *20), TERMO_X-18,(TERMO_Y-28)-(i*20), Yellow);
sulymarco 0:7077d8f28b3e 771 TFT.locate(TERMO_X-48+Offset, TERMO_Y-(i*20)-32); //
sulymarco 0:7077d8f28b3e 772 TFT.set_font((unsigned char*) Arial12x12); //
sulymarco 0:7077d8f28b3e 773 TFT.printf("%3d",(i*10)-10); //
sulymarco 0:7077d8f28b3e 774 }
sulymarco 0:7077d8f28b3e 775
sulymarco 0:7077d8f28b3e 776 TFT.foreground(Green); //
sulymarco 0:7077d8f28b3e 777 TFT.set_font((unsigned char*) Arial28x28); //
sulymarco 0:7077d8f28b3e 778 TFT.locate(TERMO_X+25, TERMO_Y+28); //
sulymarco 0:7077d8f28b3e 779 TFT.printf("C"); //
sulymarco 0:7077d8f28b3e 780
sulymarco 0:7077d8f28b3e 781 // draw the alarm control panel
sulymarco 0:7077d8f28b3e 782
sulymarco 0:7077d8f28b3e 783 // frame
sulymarco 0:7077d8f28b3e 784 TFT.rect(ALARM_X, ALARM_Y, ALARM_X+ALARM_WIDTH, ALARM_Y+(ALARM_HEIGHT*4), Magenta);
sulymarco 0:7077d8f28b3e 785 //
sulymarco 0:7077d8f28b3e 786 for (i=0; i<3; i++) //
sulymarco 0:7077d8f28b3e 787 { //
sulymarco 0:7077d8f28b3e 788 TFT.line(ALARM_X, ALARM_Y+((i+1)*ALARM_HEIGHT) , ALARM_X+ALARM_WIDTH, ALARM_Y+((i+1)*ALARM_HEIGHT), Magenta);
sulymarco 0:7077d8f28b3e 789 } //
sulymarco 0:7077d8f28b3e 790 //
sulymarco 0:7077d8f28b3e 791 TFT.line(ALARM_X+(ALARM_WIDTH/2), ALARM_Y, ALARM_X+(ALARM_WIDTH/2), ALARM_Y+(ALARM_HEIGHT*2), Magenta);
sulymarco 0:7077d8f28b3e 792 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 793
sulymarco 0:7077d8f28b3e 794 TFT.set_font((unsigned char*) Arial28x28); // "+" and "-"
sulymarco 0:7077d8f28b3e 795 TFT.foreground(Green); //
sulymarco 0:7077d8f28b3e 796 TFT.locate(ALARM_X+11, ALARM_Y+(ALARM_HEIGHT*3)+9); //
sulymarco 0:7077d8f28b3e 797 TFT.printf("+"); //
sulymarco 0:7077d8f28b3e 798 TFT.locate(ALARM_X+(ALARM_WIDTH/2)+14, ALARM_Y+(ALARM_HEIGHT*3)+9);
sulymarco 0:7077d8f28b3e 799 TFT.printf("-"); //
sulymarco 0:7077d8f28b3e 800
sulymarco 0:7077d8f28b3e 801 // alarm bar
sulymarco 0:7077d8f28b3e 802 TFT.rect(ALARM_X-30, ALARM_Y, ALARM_X-25, ALARM_Y+168, Yellow);
sulymarco 0:7077d8f28b3e 803
sulymarco 0:7077d8f28b3e 804 TFT.set_font((unsigned char*) Arial12x12); // draw "ALARM SETTINGS"
sulymarco 0:7077d8f28b3e 805 TFT.foreground(Yellow); //
sulymarco 0:7077d8f28b3e 806 TFT.locate(ALARM_X-35, ALARM_Y+14+(ALARM_HEIGHT*4)); //
sulymarco 0:7077d8f28b3e 807 TFT.printf("ALARM SETTINGS"); //
sulymarco 0:7077d8f28b3e 808
sulymarco 0:7077d8f28b3e 809 break;
sulymarco 0:7077d8f28b3e 810
sulymarco 0:7077d8f28b3e 811
sulymarco 0:7077d8f28b3e 812
sulymarco 0:7077d8f28b3e 813
sulymarco 0:7077d8f28b3e 814 case (LAB_2): //-------------- slave 2 ---------------------------
sulymarco 0:7077d8f28b3e 815
sulymarco 0:7077d8f28b3e 816 TFT.foreground(Yellow);
sulymarco 0:7077d8f28b3e 817
sulymarco 0:7077d8f28b3e 818 for (i=0; i<4; i++) // draw the segments fixed parts
sulymarco 0:7077d8f28b3e 819 { //
sulymarco 0:7077d8f28b3e 820 TFT.rect(SEG_X+(i*SEG_STEP), SEG_Y, SEG_X+SEG_WIDTH+(i*SEG_STEP), SEG_Y+SEG_HEIGHT, Yellow);
sulymarco 0:7077d8f28b3e 821 //
sulymarco 0:7077d8f28b3e 822 TFT.set_font((unsigned char*) Arial12x12); //
sulymarco 0:7077d8f28b3e 823 TFT.locate(SEG_X+44, SEG_Y+SEG_HEIGHT+12); //
sulymarco 0:7077d8f28b3e 824 TFT.printf("MIDDLE SEGMENTS"); //
sulymarco 0:7077d8f28b3e 825 } //
sulymarco 0:7077d8f28b3e 826
sulymarco 0:7077d8f28b3e 827 for (i=0; i<3; i++) // draw the buttons fixed parts
sulymarco 0:7077d8f28b3e 828 { //
sulymarco 0:7077d8f28b3e 829 TFT.circle(BUTTONS_X+(i*BUTTONS_STEP), BUTTONS_Y, BUTTONS_R, Red);
sulymarco 0:7077d8f28b3e 830 TFT.circle(BUTTONS_X+BUTTONS_WIDTH+(i*BUTTONS_STEP), BUTTONS_Y, BUTTONS_R, Red);
sulymarco 0:7077d8f28b3e 831 //
sulymarco 0:7077d8f28b3e 832 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 833 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 834 } //
sulymarco 0:7077d8f28b3e 835 //
sulymarco 0:7077d8f28b3e 836 TFT.set_font((unsigned char*) Arial12x12); //
sulymarco 0:7077d8f28b3e 837 TFT.locate(BUTTONS_X+38, BUTTONS_Y+12); //
sulymarco 0:7077d8f28b3e 838 TFT.printf("BUTTONS"); //
sulymarco 0:7077d8f28b3e 839
sulymarco 0:7077d8f28b3e 840 // draw the potentiometer window fixed parts
sulymarco 0:7077d8f28b3e 841 TFT.rect(ANALOG_X, ANALOG_Y, ANALOG_X+ANALOG_WIDTH, ANALOG_Y+ANALOG_HEIGHT, Magenta);
sulymarco 0:7077d8f28b3e 842 //
sulymarco 0:7077d8f28b3e 843 TFT.set_font((unsigned char*) Arial12x12); //
sulymarco 0:7077d8f28b3e 844 TFT.locate(ANALOG_X+35, ANALOG_Y+ANALOG_HEIGHT+12); //
sulymarco 0:7077d8f28b3e 845 TFT.printf("POTENTIOMETER"); //
sulymarco 0:7077d8f28b3e 846
sulymarco 0:7077d8f28b3e 847 Graph_x = 0;
sulymarco 0:7077d8f28b3e 848
sulymarco 0:7077d8f28b3e 849 DrawSegmentsValue(Segments); // draw the segments status
sulymarco 0:7077d8f28b3e 850 DrawButtonsValue (Buttons); // draw the buttons status
sulymarco 0:7077d8f28b3e 851 DrawPotentiometerValue(PotValue); // draw the potentiometer value
EasyCAT 2:7d4fd6354015 852 break;
sulymarco 0:7077d8f28b3e 853 }
sulymarco 0:7077d8f28b3e 854
sulymarco 0:7077d8f28b3e 855 FirstRound = true;
sulymarco 0:7077d8f28b3e 856 }
sulymarco 0:7077d8f28b3e 857
sulymarco 0:7077d8f28b3e 858
sulymarco 0:7077d8f28b3e 859 //---- draw the menu on the upper right part of the TFT ------------------------
sulymarco 0:7077d8f28b3e 860
sulymarco 0:7077d8f28b3e 861 void DrawSideMenu(uint8_t Slave)
sulymarco 0:7077d8f28b3e 862 { // draw the side menu frame
sulymarco 0:7077d8f28b3e 863 TFT.rect(MENU_X, MENU_Y, MENU_X+MENU_WIDTH, MENU_Y+MENU_HEIGHT*2, Green);
sulymarco 0:7077d8f28b3e 864 TFT.line(MENU_X, MENU_HEIGHT, MENU_X+MENU_WIDTH, MENU_HEIGHT, Green);
sulymarco 0:7077d8f28b3e 865 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 866
sulymarco 0:7077d8f28b3e 867 // draw the slave number
sulymarco 0:7077d8f28b3e 868 TFT.fillrect(MENU_X+1, MENU_Y+1, MENU_X+MENU_WIDTH-1, MENU_Y+MENU_HEIGHT-1, Red);
sulymarco 0:7077d8f28b3e 869 TFT.set_font((unsigned char*) Arial12x12); //
sulymarco 0:7077d8f28b3e 870 TFT.foreground(Yellow); //
sulymarco 0:7077d8f28b3e 871 TFT.locate(MENU_X+8 , MENU_Y+18); //
sulymarco 0:7077d8f28b3e 872 TFT.background(Red); //
sulymarco 0:7077d8f28b3e 873 TFT.printf("SLAVE %d", Slave); //
sulymarco 0:7077d8f28b3e 874 TFT.background(Black); //
sulymarco 0:7077d8f28b3e 875
sulymarco 0:7077d8f28b3e 876 TFT.set_font((unsigned char*) Arial28x28); // draw "+" and "-"
sulymarco 0:7077d8f28b3e 877 TFT.foreground(Green); //
sulymarco 0:7077d8f28b3e 878 TFT.locate (MENU_X+11, MENU_Y+MENU_HEIGHT+9); //
sulymarco 0:7077d8f28b3e 879 TFT.printf("+"); //
sulymarco 0:7077d8f28b3e 880 TFT.locate (MENU_X+(MENU_WIDTH/2)+14, MENU_Y+MENU_HEIGHT+9); //
sulymarco 0:7077d8f28b3e 881 TFT.printf("-"); //
sulymarco 0:7077d8f28b3e 882
sulymarco 0:7077d8f28b3e 883 TFT.set_font((unsigned char*) Arial12x12); // draw the slave name
sulymarco 0:7077d8f28b3e 884 TFT.foreground(Red); //
sulymarco 0:7077d8f28b3e 885 //
sulymarco 0:7077d8f28b3e 886 TFT.locate(MENU_X, MENU_Y+(MENU_HEIGHT*2)+12); //
sulymarco 0:7077d8f28b3e 887 TFT.printf("%.9s", ec_slave[Slave].name); //
sulymarco 0:7077d8f28b3e 888 }
sulymarco 0:7077d8f28b3e 889
sulymarco 0:7077d8f28b3e 890
sulymarco 0:7077d8f28b3e 891 //---- draw the starting banner ------------------------------------------------
sulymarco 0:7077d8f28b3e 892
sulymarco 0:7077d8f28b3e 893 void DrawBanner()
sulymarco 0:7077d8f28b3e 894 {
sulymarco 0:7077d8f28b3e 895 TFT.set_font((unsigned char*) Arial24x23);
sulymarco 0:7077d8f28b3e 896 TFT.foreground(Red);
sulymarco 0:7077d8f28b3e 897 TFT.locate(30, 50);
sulymarco 0:7077d8f28b3e 898 TFT.printf("EasyCAT");
sulymarco 0:7077d8f28b3e 899 TFT.locate(30, 80);
sulymarco 0:7077d8f28b3e 900 TFT.printf("SOEM MASTER");
sulymarco 0:7077d8f28b3e 901
sulymarco 0:7077d8f28b3e 902 TFT.set_font((unsigned char*) Arial12x12);
sulymarco 0:7077d8f28b3e 903 TFT.foreground(Green);
sulymarco 0:7077d8f28b3e 904 TFT.locate(30, 140);
sulymarco 0:7077d8f28b3e 905 TFT.printf("www.bausano.net");
sulymarco 0:7077d8f28b3e 906
sulymarco 0:7077d8f28b3e 907 TFT.foreground(Green);
sulymarco 0:7077d8f28b3e 908 TFT.locate(30, 160);
sulymarco 0:7077d8f28b3e 909 TFT.printf("www.easycatshield.com");
sulymarco 0:7077d8f28b3e 910
sulymarco 0:7077d8f28b3e 911 TFT.locate(30, 180);
sulymarco 0:7077d8f28b3e 912 TFT.printf("https://openethercatsociety.github.io/");
sulymarco 0:7077d8f28b3e 913 }
sulymarco 0:7077d8f28b3e 914
sulymarco 0:7077d8f28b3e 915
sulymarco 0:7077d8f28b3e 916
sulymarco 0:7077d8f28b3e 917 //****** slave 1 functions *****************************************************
sulymarco 0:7077d8f28b3e 918
sulymarco 0:7077d8f28b3e 919 //---- draw the temperature value both in analog and in digital form ------------
sulymarco 0:7077d8f28b3e 920
sulymarco 0:7077d8f28b3e 921 void DrawTemperatureValue(float fValue)
sulymarco 0:7077d8f28b3e 922 {
sulymarco 0:7077d8f28b3e 923 TFT.set_font((unsigned char*) Arial28x28); // digital visualization
sulymarco 0:7077d8f28b3e 924 TFT.foreground(Green); //
sulymarco 0:7077d8f28b3e 925 TFT.locate(TERMO_X-45, TERMO_Y+28); //
sulymarco 0:7077d8f28b3e 926 TFT.printf("%4.1f", fValue); //
sulymarco 0:7077d8f28b3e 927
sulymarco 0:7077d8f28b3e 928 if (fValue > 68) // limit the value for the
sulymarco 0:7077d8f28b3e 929 fValue = 68; // analog visualization
sulymarco 0:7077d8f28b3e 930 //
sulymarco 0:7077d8f28b3e 931 if (fValue < -15) //
sulymarco 0:7077d8f28b3e 932 fValue = -15; //
sulymarco 0:7077d8f28b3e 933
sulymarco 0:7077d8f28b3e 934 int LenColonnina = fValue * 2; // analog visualization
sulymarco 0:7077d8f28b3e 935 TFT.fillrect(TERMO_X-7, TERMO_Y-184, TERMO_X+7, TERMO_Y-18-LenColonnina-30-1, Black);
sulymarco 0:7077d8f28b3e 936 TFT.fillrect(TERMO_X-7, TERMO_Y-18-LenColonnina-30, TERMO_X+7, TERMO_Y-18, Red);
sulymarco 0:7077d8f28b3e 937 }
sulymarco 0:7077d8f28b3e 938
sulymarco 0:7077d8f28b3e 939
sulymarco 0:7077d8f28b3e 940 //---- draw the current parameter of the temperature alarm ---------------------
sulymarco 0:7077d8f28b3e 941
sulymarco 0:7077d8f28b3e 942 void DrawAlarmSettings(float fThreshold, bool OnOff, bool MinMax)
sulymarco 0:7077d8f28b3e 943 {
sulymarco 0:7077d8f28b3e 944
sulymarco 0:7077d8f28b3e 945 if (OnOff) // alarm on
sulymarco 0:7077d8f28b3e 946 { // draw "ON" on red background
sulymarco 0:7077d8f28b3e 947 // and "OFF"" on black background
sulymarco 0:7077d8f28b3e 948 DisplayInRect (ALARM_X, ALARM_Y, 10, 14, "ON", Red, (unsigned char*)Arial12x12);
sulymarco 0:7077d8f28b3e 949 DisplayInRect (ALARM_X+(ALARM_WIDTH/2), ALARM_Y, 10, 14, "OFF", Black, (unsigned char*)Arial12x12);
sulymarco 0:7077d8f28b3e 950 }
sulymarco 0:7077d8f28b3e 951 else // alarm off
sulymarco 0:7077d8f28b3e 952 { // and "ON"" on black background
sulymarco 0:7077d8f28b3e 953 // draw "OFF" on red background
sulymarco 0:7077d8f28b3e 954 DisplayInRect (ALARM_X, ALARM_Y, 10, 14, "ON", Black, (unsigned char*)Arial12x12);
sulymarco 0:7077d8f28b3e 955 DisplayInRect (ALARM_X+(ALARM_WIDTH/2), ALARM_Y, 10, 14, "OFF", Red, (unsigned char*)Arial12x12);
sulymarco 0:7077d8f28b3e 956 }
sulymarco 0:7077d8f28b3e 957
sulymarco 0:7077d8f28b3e 958
sulymarco 0:7077d8f28b3e 959 if (MinMax) // alarm when temperature < threshold
sulymarco 0:7077d8f28b3e 960 { // draw ">" on red background
sulymarco 0:7077d8f28b3e 961 // and ">"" on black background
sulymarco 0:7077d8f28b3e 962 DisplayInRect (ALARM_X, ALARM_Y+ALARM_HEIGHT, 10, 9, ">", Red, (unsigned char*)Arial28x28);
sulymarco 0:7077d8f28b3e 963 DisplayInRect (ALARM_X+(ALARM_WIDTH/2), ALARM_Y+ALARM_HEIGHT, 10, 9, "<", Black, (unsigned char*)Arial28x28);
sulymarco 0:7077d8f28b3e 964 }
sulymarco 0:7077d8f28b3e 965 else // alarm when temperature > threshold
sulymarco 0:7077d8f28b3e 966 { // draw ">" on black background
sulymarco 0:7077d8f28b3e 967 // and ">"" on red background
sulymarco 0:7077d8f28b3e 968 DisplayInRect (ALARM_X, ALARM_Y+ALARM_HEIGHT, 10, 9, ">", Black, (unsigned char*)Arial28x28);
sulymarco 0:7077d8f28b3e 969 DisplayInRect (ALARM_X+(ALARM_WIDTH/2), ALARM_Y+ALARM_HEIGHT, 10, 9, "<", Red, (unsigned char*)Arial28x28);
sulymarco 0:7077d8f28b3e 970 }
sulymarco 0:7077d8f28b3e 971
sulymarco 0:7077d8f28b3e 972 DrawOnlyThreshold(fThreshold, OnOff, MinMax);
sulymarco 0:7077d8f28b3e 973 }
sulymarco 0:7077d8f28b3e 974
sulymarco 0:7077d8f28b3e 975
sulymarco 0:7077d8f28b3e 976 //---- draw only the threshold setting -----------------------------------------
sulymarco 0:7077d8f28b3e 977
sulymarco 0:7077d8f28b3e 978 void DrawOnlyThreshold(float fThreshold, bool OnOff, bool MinMax) // this function is used to update
sulymarco 0:7077d8f28b3e 979 { // only the threshold value not to
sulymarco 0:7077d8f28b3e 980 // flicker the TFT, when "+" or
sulymarco 0:7077d8f28b3e 981 // "-" are tapped
sulymarco 0:7077d8f28b3e 982
sulymarco 0:7077d8f28b3e 983 TFT.foreground(Yellow); // draw the alarm threshold
sulymarco 0:7077d8f28b3e 984 TFT.set_font((unsigned char*) Arial12x12); // in digital form
sulymarco 0:7077d8f28b3e 985 TFT.locate(ALARM_X+26, ALARM_Y+14+(ALARM_HEIGHT*2)); //
sulymarco 0:7077d8f28b3e 986 TFT.printf(" "); //
sulymarco 0:7077d8f28b3e 987 TFT.locate(ALARM_X+26, ALARM_Y+14+(ALARM_HEIGHT*2)); //
sulymarco 0:7077d8f28b3e 988 TFT.printf("%+3.1f", fThreshold); //
sulymarco 0:7077d8f28b3e 989
sulymarco 0:7077d8f28b3e 990 if (fThreshold > 68) // limit the value for the
sulymarco 0:7077d8f28b3e 991 fThreshold = 68; // analog visualization
sulymarco 0:7077d8f28b3e 992 //
sulymarco 0:7077d8f28b3e 993 if (fThreshold < -15) //
sulymarco 0:7077d8f28b3e 994 fThreshold = -15; //
sulymarco 0:7077d8f28b3e 995
sulymarco 0:7077d8f28b3e 996 int LenAlarmBar = fThreshold * 2;
sulymarco 0:7077d8f28b3e 997
sulymarco 0:7077d8f28b3e 998 if (OnOff) // alarm on
sulymarco 0:7077d8f28b3e 999 { //
sulymarco 0:7077d8f28b3e 1000 if (MinMax) // fill the threshold bar
sulymarco 0:7077d8f28b3e 1001 { // in accordance with the MinMax setting
sulymarco 0:7077d8f28b3e 1002 TFT.fillrect(ALARM_X-29, ALARM_Y+1, ALARM_X-26, ALARM_Y+167-LenAlarmBar-30, Green);
sulymarco 0:7077d8f28b3e 1003 TFT.fillrect(ALARM_X-29, ALARM_Y+167-LenAlarmBar-30, ALARM_X-26, ALARM_Y+167, Red);
sulymarco 0:7077d8f28b3e 1004 } //
sulymarco 0:7077d8f28b3e 1005 else //
sulymarco 0:7077d8f28b3e 1006 { //
sulymarco 0:7077d8f28b3e 1007 TFT.fillrect(ALARM_X-29, ALARM_Y+1, ALARM_X-26, ALARM_Y+167-LenAlarmBar-30, Red);
sulymarco 0:7077d8f28b3e 1008 TFT.fillrect(ALARM_X-29, ALARM_Y+167-LenAlarmBar-30, ALARM_X-26, ALARM_Y+167, Green);
sulymarco 0:7077d8f28b3e 1009 } //
sulymarco 0:7077d8f28b3e 1010 }
sulymarco 0:7077d8f28b3e 1011
sulymarco 0:7077d8f28b3e 1012 else // alarm off
sulymarco 0:7077d8f28b3e 1013 { //
sulymarco 0:7077d8f28b3e 1014 // clear the threshold bar
sulymarco 0:7077d8f28b3e 1015 TFT.fillrect(ALARM_X-29, ALARM_Y+1, ALARM_X-26, ALARM_Y+167, Black);
sulymarco 0:7077d8f28b3e 1016 } //
sulymarco 0:7077d8f28b3e 1017 }
sulymarco 0:7077d8f28b3e 1018
sulymarco 0:7077d8f28b3e 1019
sulymarco 0:7077d8f28b3e 1020 //---- draw the blinking alarm signal ------------------------------------------
sulymarco 0:7077d8f28b3e 1021
sulymarco 0:7077d8f28b3e 1022 void DrawAlarmStatus(bool Alarm)
sulymarco 0:7077d8f28b3e 1023 {
sulymarco 0:7077d8f28b3e 1024 bool static PrevAlarmVisu;
sulymarco 0:7077d8f28b3e 1025
sulymarco 0:7077d8f28b3e 1026 TFT.set_font((unsigned char*) Arial28x28);
sulymarco 0:7077d8f28b3e 1027 TFT.foreground(Red);
sulymarco 0:7077d8f28b3e 1028 TFT.locate(TERMO_X+90, TERMO_Y+28);
sulymarco 0:7077d8f28b3e 1029
sulymarco 0:7077d8f28b3e 1030 if (Alarm && Blink && !PrevAlarmVisu)
sulymarco 0:7077d8f28b3e 1031 {
sulymarco 0:7077d8f28b3e 1032 TFT.printf("ALARM !");
sulymarco 0:7077d8f28b3e 1033 PrevAlarmVisu = true;
sulymarco 0:7077d8f28b3e 1034 }
sulymarco 0:7077d8f28b3e 1035 else if ((!Alarm && PrevAlarmVisu) || (Alarm && !Blink && PrevAlarmVisu))
sulymarco 0:7077d8f28b3e 1036 {
sulymarco 0:7077d8f28b3e 1037 TFT.printf(" ");
sulymarco 0:7077d8f28b3e 1038 PrevAlarmVisu = false;
sulymarco 0:7077d8f28b3e 1039 }
sulymarco 0:7077d8f28b3e 1040 }
sulymarco 0:7077d8f28b3e 1041
sulymarco 0:7077d8f28b3e 1042
sulymarco 0:7077d8f28b3e 1043 //----- draw a rectangle with text and colored background ----------------------
sulymarco 0:7077d8f28b3e 1044
sulymarco 0:7077d8f28b3e 1045 void DisplayInRect (int X, int Y, int X_off, int Y_off, char* Value, int BackColor, unsigned char* Font)
sulymarco 0:7077d8f28b3e 1046 {
sulymarco 0:7077d8f28b3e 1047 TFT.set_font(Font);
sulymarco 0:7077d8f28b3e 1048 TFT.foreground(Green);
sulymarco 0:7077d8f28b3e 1049
sulymarco 0:7077d8f28b3e 1050 TFT.fillrect(X+1, Y+1, X+(MENU_WIDTH/2)-1, Y+MENU_HEIGHT-1, BackColor);
sulymarco 0:7077d8f28b3e 1051
sulymarco 0:7077d8f28b3e 1052 TFT.locate(X+X_off , Y+Y_off);
sulymarco 0:7077d8f28b3e 1053 TFT.background(BackColor);
sulymarco 0:7077d8f28b3e 1054 TFT.printf("%s", Value );
sulymarco 0:7077d8f28b3e 1055 TFT.background(Black);
sulymarco 0:7077d8f28b3e 1056 }
sulymarco 0:7077d8f28b3e 1057
sulymarco 0:7077d8f28b3e 1058
sulymarco 0:7077d8f28b3e 1059
sulymarco 0:7077d8f28b3e 1060
sulymarco 0:7077d8f28b3e 1061 //****** slave 2 functions *****************************************************
sulymarco 0:7077d8f28b3e 1062
sulymarco 0:7077d8f28b3e 1063 //------------------------------------------------------------------------------
sulymarco 0:7077d8f28b3e 1064
sulymarco 0:7077d8f28b3e 1065 void DrawButtonsValue (uint8_t Value)
sulymarco 0:7077d8f28b3e 1066 {
sulymarco 0:7077d8f28b3e 1067 uint8_t Slope;
sulymarco 0:7077d8f28b3e 1068 int i;
sulymarco 0:7077d8f28b3e 1069
sulymarco 0:7077d8f28b3e 1070 for (i=0; i<3; i++)
sulymarco 0:7077d8f28b3e 1071 {
sulymarco 0:7077d8f28b3e 1072 if ((Value & 0x04) == 0x04)
sulymarco 0:7077d8f28b3e 1073 Slope = BUTTONS_R;
sulymarco 0:7077d8f28b3e 1074 else
sulymarco 0:7077d8f28b3e 1075 Slope = 16;
sulymarco 0:7077d8f28b3e 1076
sulymarco 0:7077d8f28b3e 1077 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 1078
sulymarco 0:7077d8f28b3e 1079 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 1080
sulymarco 0:7077d8f28b3e 1081 Value = Value << 1;
sulymarco 0:7077d8f28b3e 1082 }
sulymarco 0:7077d8f28b3e 1083 }
sulymarco 0:7077d8f28b3e 1084
sulymarco 0:7077d8f28b3e 1085
sulymarco 0:7077d8f28b3e 1086 //------------------------------------------------------------------------------
sulymarco 0:7077d8f28b3e 1087
sulymarco 0:7077d8f28b3e 1088 void DrawSegmentsValue(uint8_t Value)
sulymarco 0:7077d8f28b3e 1089 {
sulymarco 0:7077d8f28b3e 1090 int i;
sulymarco 0:7077d8f28b3e 1091 int Color;
sulymarco 0:7077d8f28b3e 1092
sulymarco 0:7077d8f28b3e 1093 for (i=0; i<4; i++)
sulymarco 0:7077d8f28b3e 1094 {
sulymarco 0:7077d8f28b3e 1095 if ((Value & 0x08) == 0x08)
sulymarco 0:7077d8f28b3e 1096 Color = Red;
sulymarco 0:7077d8f28b3e 1097 else
sulymarco 0:7077d8f28b3e 1098 Color = Black;
sulymarco 0:7077d8f28b3e 1099
sulymarco 0:7077d8f28b3e 1100 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 1101
sulymarco 0:7077d8f28b3e 1102 Value = Value << 1;
sulymarco 0:7077d8f28b3e 1103 }
sulymarco 0:7077d8f28b3e 1104 }
sulymarco 0:7077d8f28b3e 1105
sulymarco 0:7077d8f28b3e 1106
sulymarco 0:7077d8f28b3e 1107 //---- draw the potentiometer value --------------------------------------------
sulymarco 0:7077d8f28b3e 1108
sulymarco 0:7077d8f28b3e 1109 void DrawPotentiometerValue (uint16_t PotValue)
sulymarco 0:7077d8f28b3e 1110 {
sulymarco 0:7077d8f28b3e 1111
sulymarco 0:7077d8f28b3e 1112 if (PotValue != PrevPotValue)
sulymarco 0:7077d8f28b3e 1113 {
sulymarco 0:7077d8f28b3e 1114 PrevPotValue = PotValue;
sulymarco 0:7077d8f28b3e 1115
sulymarco 0:7077d8f28b3e 1116 TFT.set_font((unsigned char*) Arial12x12); //
sulymarco 0:7077d8f28b3e 1117 TFT.foreground(Green); //
sulymarco 0:7077d8f28b3e 1118 TFT.locate(ANALOG_X+170, ANALOG_Y+ANALOG_HEIGHT+12); //
sulymarco 0:7077d8f28b3e 1119 TFT.printf("%4d", (int)PotValue); //
sulymarco 0:7077d8f28b3e 1120 }
sulymarco 0:7077d8f28b3e 1121
sulymarco 0:7077d8f28b3e 1122
sulymarco 0:7077d8f28b3e 1123 if (++Graph_x > ANALOG_WIDTH-3)
sulymarco 0:7077d8f28b3e 1124 {
sulymarco 0:7077d8f28b3e 1125 Graph_x = 0;
sulymarco 0:7077d8f28b3e 1126 }
sulymarco 0:7077d8f28b3e 1127
sulymarco 0:7077d8f28b3e 1128 PotValue = PotValue / (1023/(ANALOG_HEIGHT-2));
sulymarco 0:7077d8f28b3e 1129
sulymarco 0:7077d8f28b3e 1130 TFT.pixel(ANALOG_X+Graph_x+1, ANALOG_Y+ANALOG_HEIGHT-PotValue-1, Green);
sulymarco 0:7077d8f28b3e 1131
sulymarco 0:7077d8f28b3e 1132 int Overflow = (ANALOG_WIDTH-2) - (Graph_x+16);
sulymarco 0:7077d8f28b3e 1133 if (Overflow < 0)
sulymarco 0:7077d8f28b3e 1134 {
sulymarco 0:7077d8f28b3e 1135 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 1136 TFT.fillrect(ANALOG_X+1, ANALOG_Y+1, ANALOG_X+1-Overflow, ANALOG_Y+ANALOG_HEIGHT-1, Black);
sulymarco 0:7077d8f28b3e 1137 }
sulymarco 0:7077d8f28b3e 1138 else
sulymarco 0:7077d8f28b3e 1139 {
sulymarco 0:7077d8f28b3e 1140 TFT.fillrect(ANALOG_X+Graph_x+2, ANALOG_Y+1, ANALOG_X+Graph_x+16, ANALOG_Y+ANALOG_HEIGHT-1, Black);
sulymarco 0:7077d8f28b3e 1141 }
sulymarco 0:7077d8f28b3e 1142 }
sulymarco 0:7077d8f28b3e 1143
sulymarco 0:7077d8f28b3e 1144
sulymarco 0:7077d8f28b3e 1145 //****** touchscreen functions *************************************************
sulymarco 0:7077d8f28b3e 1146
sulymarco 0:7077d8f28b3e 1147 //----- read touchscreen status ------------------------------------------------
sulymarco 0:7077d8f28b3e 1148
sulymarco 0:7077d8f28b3e 1149 bool TouchRead(uint16_t* X, uint16_t* Y)
sulymarco 0:7077d8f28b3e 1150 {
sulymarco 0:7077d8f28b3e 1151 bool Result = false;
sulymarco 0:7077d8f28b3e 1152
sulymarco 0:7077d8f28b3e 1153 {
sulymarco 0:7077d8f28b3e 1154 if (TouchRead_Z()) // if the touchscreen is tapped
sulymarco 0:7077d8f28b3e 1155 { //
sulymarco 0:7077d8f28b3e 1156 *X = TouchRead_X(); // read also the X and Y axis
sulymarco 0:7077d8f28b3e 1157 *Y = TouchRead_Y(); //
sulymarco 0:7077d8f28b3e 1158
sulymarco 0:7077d8f28b3e 1159 wait_us (1000);
sulymarco 0:7077d8f28b3e 1160
sulymarco 0:7077d8f28b3e 1161 if (TouchRead_Z()) // if the touchscreen is still tapped
sulymarco 0:7077d8f28b3e 1162 { // we assume that the result is good
sulymarco 0:7077d8f28b3e 1163 Result = true; //
sulymarco 0:7077d8f28b3e 1164
sulymarco 0:7077d8f28b3e 1165 // TFT.pixel (*X, *Y, White); //debug - draw the touched point on the TFT
sulymarco 0:7077d8f28b3e 1166 }
sulymarco 0:7077d8f28b3e 1167 }
sulymarco 0:7077d8f28b3e 1168 }
sulymarco 0:7077d8f28b3e 1169
sulymarco 0:7077d8f28b3e 1170 return Result;
sulymarco 0:7077d8f28b3e 1171 }
sulymarco 0:7077d8f28b3e 1172
sulymarco 0:7077d8f28b3e 1173
sulymarco 0:7077d8f28b3e 1174 //----- read touchscreen X axis ------------------------------------------------
sulymarco 0:7077d8f28b3e 1175
sulymarco 0:7077d8f28b3e 1176 uint16_t TouchRead_X()
sulymarco 0:7077d8f28b3e 1177 {
sulymarco 0:7077d8f28b3e 1178 float fValue;
sulymarco 0:7077d8f28b3e 1179
sulymarco 0:7077d8f28b3e 1180 DigitalIn Ym(PIN_YM); // set the I/O
sulymarco 0:7077d8f28b3e 1181 Ym.mode(PullDown); //
sulymarco 0:7077d8f28b3e 1182 //
sulymarco 0:7077d8f28b3e 1183 DigitalOut Xp(PIN_XP); //
sulymarco 0:7077d8f28b3e 1184 Xp = 1; //
sulymarco 0:7077d8f28b3e 1185 //
sulymarco 0:7077d8f28b3e 1186 DigitalOut Xm(PIN_XM); //
sulymarco 0:7077d8f28b3e 1187 Xm = 0; //
sulymarco 0:7077d8f28b3e 1188 //
sulymarco 0:7077d8f28b3e 1189 AnalogIn Yp(PIN_YP); //
sulymarco 0:7077d8f28b3e 1190
sulymarco 0:7077d8f28b3e 1191 fValue = ReadAnalog(Yp); // read the axis
sulymarco 0:7077d8f28b3e 1192
sulymarco 0:7077d8f28b3e 1193 fValue -= TOUCH_X_OFFSET; // rectify offsett and gain
sulymarco 0:7077d8f28b3e 1194 if (fValue <0 ) //
sulymarco 0:7077d8f28b3e 1195 fValue = 0; //
sulymarco 0:7077d8f28b3e 1196 //
sulymarco 0:7077d8f28b3e 1197 fValue *= TOUCH_X_GAIN; //
sulymarco 0:7077d8f28b3e 1198
sulymarco 0:7077d8f28b3e 1199 return (uint16_t)fValue;
sulymarco 0:7077d8f28b3e 1200 }
sulymarco 0:7077d8f28b3e 1201
sulymarco 0:7077d8f28b3e 1202
sulymarco 0:7077d8f28b3e 1203 //----- read touchscreen Y axis ------------------------------------------------
sulymarco 0:7077d8f28b3e 1204
sulymarco 0:7077d8f28b3e 1205 uint16_t TouchRead_Y()
sulymarco 0:7077d8f28b3e 1206 {
sulymarco 0:7077d8f28b3e 1207 float fValue;
sulymarco 0:7077d8f28b3e 1208
sulymarco 0:7077d8f28b3e 1209 DigitalIn Xm(PIN_XM); // set the I/O
sulymarco 0:7077d8f28b3e 1210 Xm.mode(PullDown); //
sulymarco 0:7077d8f28b3e 1211 //
sulymarco 0:7077d8f28b3e 1212 DigitalOut Yp(PIN_YP); //
sulymarco 0:7077d8f28b3e 1213 Yp = 1; //
sulymarco 0:7077d8f28b3e 1214 //
sulymarco 0:7077d8f28b3e 1215 DigitalOut Ym(PIN_YM); //
sulymarco 0:7077d8f28b3e 1216 Ym = 0; //
sulymarco 0:7077d8f28b3e 1217 //
sulymarco 0:7077d8f28b3e 1218 AnalogIn Xp(PIN_XP); //
sulymarco 0:7077d8f28b3e 1219
sulymarco 0:7077d8f28b3e 1220 fValue = ReadAnalog(Xp); // read the axis
sulymarco 0:7077d8f28b3e 1221
sulymarco 0:7077d8f28b3e 1222 fValue -= TOUCH_Y_OFFSET; // rectify offset and gain
sulymarco 0:7077d8f28b3e 1223 if (fValue <0 ) //
sulymarco 0:7077d8f28b3e 1224 fValue = 0; //
sulymarco 0:7077d8f28b3e 1225 //
sulymarco 0:7077d8f28b3e 1226 fValue *= TOUCH_Y_GAIN; //
sulymarco 0:7077d8f28b3e 1227
sulymarco 0:7077d8f28b3e 1228 return (uint16_t)fValue;
sulymarco 0:7077d8f28b3e 1229 }
sulymarco 0:7077d8f28b3e 1230
sulymarco 0:7077d8f28b3e 1231
sulymarco 0:7077d8f28b3e 1232 //----- read touchscreen Z axis ------------------------------------------------
sulymarco 0:7077d8f28b3e 1233
sulymarco 0:7077d8f28b3e 1234 bool TouchRead_Z() // read the Z axis to see if the
sulymarco 0:7077d8f28b3e 1235 { // touchscreen has been tapped
sulymarco 0:7077d8f28b3e 1236 float fValue = 0;
sulymarco 0:7077d8f28b3e 1237 bool Result;
sulymarco 0:7077d8f28b3e 1238
sulymarco 0:7077d8f28b3e 1239 DigitalIn Yp(PIN_YP); // set the I/O
sulymarco 0:7077d8f28b3e 1240 Yp.mode(PullUp); //
sulymarco 0:7077d8f28b3e 1241 //
sulymarco 0:7077d8f28b3e 1242 AnalogIn Ym(PIN_YM); //
sulymarco 0:7077d8f28b3e 1243 //
sulymarco 0:7077d8f28b3e 1244 DigitalOut Xm(PIN_XM); //
sulymarco 0:7077d8f28b3e 1245 Xm = 0; //
sulymarco 0:7077d8f28b3e 1246 //
sulymarco 0:7077d8f28b3e 1247 DigitalOut Xp(PIN_XP); //
sulymarco 0:7077d8f28b3e 1248 Xp = 0; //
sulymarco 0:7077d8f28b3e 1249
sulymarco 0:7077d8f28b3e 1250 for (int i = 0; i<TOUCH_SAMPLES; i++) // read the axis several times
sulymarco 0:7077d8f28b3e 1251 { // and average the result
sulymarco 0:7077d8f28b3e 1252 wait_us(10); //
sulymarco 0:7077d8f28b3e 1253 //
sulymarco 0:7077d8f28b3e 1254 fValue += Ym.read(); //
sulymarco 0:7077d8f28b3e 1255 } //
sulymarco 0:7077d8f28b3e 1256 fValue /= TOUCH_SAMPLES; //
sulymarco 0:7077d8f28b3e 1257
sulymarco 0:7077d8f28b3e 1258 if (fValue < TOUCH_THRESHOLD) // compare the result with
sulymarco 0:7077d8f28b3e 1259 Result = true; // the threshold
sulymarco 0:7077d8f28b3e 1260 else //
sulymarco 0:7077d8f28b3e 1261 Result = false; //
sulymarco 0:7077d8f28b3e 1262
sulymarco 0:7077d8f28b3e 1263 return Result; //
sulymarco 0:7077d8f28b3e 1264 }
sulymarco 0:7077d8f28b3e 1265
sulymarco 0:7077d8f28b3e 1266
sulymarco 0:7077d8f28b3e 1267 //----- read touchscreen X or Y axis with a window filter ----------------------
sulymarco 0:7077d8f28b3e 1268
sulymarco 0:7077d8f28b3e 1269 float ReadAnalog (AnalogIn AnaCh) // check that consecutive readings
sulymarco 0:7077d8f28b3e 1270 { // fall in the acceptance window
sulymarco 0:7077d8f28b3e 1271 float fArray[TOUCH_SAMPLES]; //
sulymarco 0:7077d8f28b3e 1272 float fResult;
sulymarco 0:7077d8f28b3e 1273 float fDiff;
sulymarco 0:7077d8f28b3e 1274
sulymarco 0:7077d8f28b3e 1275 int Rounds = TOUCH_MAX_ROUNDS; // maximum number of attempts
sulymarco 0:7077d8f28b3e 1276
sulymarco 0:7077d8f28b3e 1277 for (int i=0; i<TOUCH_SAMPLES; i++)
sulymarco 0:7077d8f28b3e 1278 {
sulymarco 0:7077d8f28b3e 1279 wait_us(10);
sulymarco 0:7077d8f28b3e 1280
sulymarco 0:7077d8f28b3e 1281 fResult = AnaCh.read();
sulymarco 0:7077d8f28b3e 1282
sulymarco 0:7077d8f28b3e 1283 if (i>0)
sulymarco 0:7077d8f28b3e 1284 {
sulymarco 0:7077d8f28b3e 1285 fDiff = abs(fResult - fArray[i-1]);
sulymarco 0:7077d8f28b3e 1286
sulymarco 0:7077d8f28b3e 1287 if (fDiff > TOUCH_WINDOW)
sulymarco 0:7077d8f28b3e 1288 i= -1;
sulymarco 0:7077d8f28b3e 1289 else
sulymarco 0:7077d8f28b3e 1290 fArray[i] = fResult;
sulymarco 0:7077d8f28b3e 1291
sulymarco 0:7077d8f28b3e 1292 if (Rounds-- < 0)
sulymarco 0:7077d8f28b3e 1293 {
sulymarco 0:7077d8f28b3e 1294 fResult = 0;
sulymarco 0:7077d8f28b3e 1295 return fResult;
sulymarco 0:7077d8f28b3e 1296 }
sulymarco 0:7077d8f28b3e 1297 }
sulymarco 0:7077d8f28b3e 1298
sulymarco 0:7077d8f28b3e 1299 else
sulymarco 0:7077d8f28b3e 1300 {
sulymarco 0:7077d8f28b3e 1301 fArray[i] = fResult;
sulymarco 0:7077d8f28b3e 1302 }
sulymarco 0:7077d8f28b3e 1303 }
sulymarco 0:7077d8f28b3e 1304
sulymarco 0:7077d8f28b3e 1305 fResult =0;
sulymarco 0:7077d8f28b3e 1306
sulymarco 0:7077d8f28b3e 1307 for (int i=0; i<TOUCH_SAMPLES; i++)
sulymarco 0:7077d8f28b3e 1308 {
sulymarco 0:7077d8f28b3e 1309 fResult += fArray[i];
sulymarco 0:7077d8f28b3e 1310 }
sulymarco 0:7077d8f28b3e 1311
sulymarco 0:7077d8f28b3e 1312 return fResult /= TOUCH_SAMPLES;
sulymarco 0:7077d8f28b3e 1313 }
sulymarco 0:7077d8f28b3e 1314
sulymarco 0:7077d8f28b3e 1315
sulymarco 0:7077d8f28b3e 1316