mirror of
				https://github.com/s00500/ESPUI.git
				synced 2025-10-31 07:13:24 +00:00 
			
		
		
		
	Adding Labels and Pads
This commit is contained in:
		| @@ -295,6 +295,7 @@ | |||||||
|  |  | ||||||
|   /* Lists |   /* Lists | ||||||
|   –––––––––––––––––––––––––––––––––––––––––––––––––– */ |   –––––––––––––––––––––––––––––––––––––––––––––––––– */ | ||||||
|  | /* | ||||||
|   ul { |   ul { | ||||||
|     list-style: circle inside; } |     list-style: circle inside; } | ||||||
|   ol { |   ol { | ||||||
| @@ -310,7 +311,7 @@ | |||||||
|     font-size: 90%; } |     font-size: 90%; } | ||||||
|   li { |   li { | ||||||
|     margin-bottom: 1rem; } |     margin-bottom: 1rem; } | ||||||
|  | */ | ||||||
|  |  | ||||||
|   /* Code |   /* Code | ||||||
|   –––––––––––––––––––––––––––––––––––––––––––––––––– */ |   –––––––––––––––––––––––––––––––––––––––––––––––––– */ | ||||||
| @@ -398,3 +399,85 @@ | |||||||
|     content: ""; |     content: ""; | ||||||
|     display: table; |     display: table; | ||||||
|     clear: both; } |     clear: both; } | ||||||
|  |  | ||||||
|  |   /* ButtonPad | ||||||
|  |   –––––––––––––––––––––––––––––––––––––––––––––––––– */ | ||||||
|  |  | ||||||
|  |   .control { | ||||||
|  |   background-color: #ddd; | ||||||
|  |   background-image: linear-gradient(hsla(0,0%,0%,.1), hsla(0,0%,100%,.1)); | ||||||
|  |   border-radius: 50%; | ||||||
|  |   box-shadow: inset 0 1px 1px 1px hsla(0,0%,100%,.5), | ||||||
|  |               0 0 1px 1px hsla(0,0%,100%,.75), | ||||||
|  |               0 0 1px 2px hsla(0,0%,100%,.25), | ||||||
|  |               0 0 1px 3px hsla(0,0%,100%,.25), | ||||||
|  |               0 0 1px 4px hsla(0,0%,100%,.25), | ||||||
|  |               0 0 1px 6px hsla(0,0%,0%,.75); | ||||||
|  |   height: 9em; | ||||||
|  |   margin: 3em auto; | ||||||
|  |   position: relative; | ||||||
|  |   width: 9em; | ||||||
|  | } | ||||||
|  | .control ul { | ||||||
|  |   height: 100%; | ||||||
|  |   padding: 0; | ||||||
|  |   transform: rotate(45deg); | ||||||
|  | } | ||||||
|  | .control li { | ||||||
|  |   border-radius: 100% 0 0 0; | ||||||
|  |   box-shadow: inset -1px -1px 1px hsla(0,0%,100%,.5), | ||||||
|  |               0 0 1px hsla(0,0%,0%,.75); | ||||||
|  |   display: inline-block; | ||||||
|  |   height: 50%; | ||||||
|  |   overflow: hidden; | ||||||
|  |   width: 50%; | ||||||
|  | } | ||||||
|  | .control ul li:nth-child(2) { | ||||||
|  |   transform: rotate(90deg); | ||||||
|  | } | ||||||
|  | .control ul li:nth-child(3) { | ||||||
|  |   transform: rotate(-90deg); | ||||||
|  | } | ||||||
|  | .control ul li:nth-child(4) { | ||||||
|  |   transform: rotate(180deg); | ||||||
|  | } | ||||||
|  | .control ul a { | ||||||
|  |   height: 200%; | ||||||
|  |   position: relative; | ||||||
|  |   transform: rotate(-45deg); | ||||||
|  |   width: 200%; | ||||||
|  | } | ||||||
|  | .control a:hover, | ||||||
|  | .control a:focus { | ||||||
|  |   background-color: hsla(0,0%,100%,.25); | ||||||
|  | } | ||||||
|  | .control a { | ||||||
|  |   border-radius: 50%; | ||||||
|  |   color: #333; | ||||||
|  |   display: block; | ||||||
|  |   font: bold 1em/3 sans-serif; | ||||||
|  |   text-align: center; | ||||||
|  |   text-decoration: none; | ||||||
|  |   text-shadow: 0 1px 1px hsla(0,0%,100%,.4); | ||||||
|  |   transition: .15s; | ||||||
|  | } | ||||||
|  | .control .confirm { | ||||||
|  |   background-color: #ddd; | ||||||
|  |   background-image: linear-gradient(hsla(0,0%,0%,.15), hsla(0,0%,100%,.25)); | ||||||
|  |   box-shadow: inset 0 1px 1px 1px hsla(0,0%,100%,.5), | ||||||
|  |               0 0 1px 1px hsla(0,0%,100%,.25), | ||||||
|  |               0 0 1px 2px hsla(0,0%,100%,.25), | ||||||
|  |               0 0 1px 3px hsla(0,0%,100%,.25), | ||||||
|  |               0 0 1px 4px hsla(0,0%,100%,.25), | ||||||
|  |               0 0 1px 6px hsla(0,0%,0%,.85); | ||||||
|  |   left: 50%; | ||||||
|  |   line-height: 3; | ||||||
|  |   margin: -1.5em; | ||||||
|  |   position: absolute; | ||||||
|  |   top: 50%; | ||||||
|  |   width: 3em; | ||||||
|  | } | ||||||
|  | .control .confirm:hover, | ||||||
|  | .control .confirm:focus { | ||||||
|  |   background-color: #eee; | ||||||
|  | } | ||||||
|   | |||||||
| @@ -5,17 +5,18 @@ | |||||||
|     <title>Control</title> |     <title>Control</title> | ||||||
|     <meta name="viewport" content="width=device-width, initial-scale=1"> |     <meta name="viewport" content="width=device-width, initial-scale=1"> | ||||||
|   <link rel="shortcut icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAPFBMVEUAAACA1VWR21qQ2liR3FqR3FqS3VuR3VqR3VuR3VqO21mS21uS3FqS3FqS21uJ2GKQ21qR3FuR3FoAAAB/3Gu7AAAAEnRSTlMABoA3kPBwz8i5Kzioxg4NVcU3uEJHAAAAAWJLR0QAiAUdSAAAAAlwSFlzAAAN1wAADdcBQiibeAAAAAd0SU1FB+EFEhcEM+HpYwQAAABYSURBVBjThY/JDsAgCESt4lpX/v9jLQZJ6qF9t3khAyj1xXUKbQ4BVowDwqOYgExkkW4iY6lPaF06RqM8YItOuRbMaz6xjbsusDAW/drplBg47jP696cXE8bPA1eUDeK2AAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE3LTA1LTE4VDIzOjA0OjUxKzAyOjAwxE59ewAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNy0wNS0xOFQyMzowNDo1MSswMjowMLUTxccAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb7jwaAAAAAElFTkSuQmCC"/> |   <link rel="shortcut icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAPFBMVEUAAACA1VWR21qQ2liR3FqR3FqS3VuR3VqR3VuR3VqO21mS21uS3FqS3FqS21uJ2GKQ21qR3FuR3FoAAAB/3Gu7AAAAEnRSTlMABoA3kPBwz8i5Kzioxg4NVcU3uEJHAAAAAWJLR0QAiAUdSAAAAAlwSFlzAAAN1wAADdcBQiibeAAAAAd0SU1FB+EFEhcEM+HpYwQAAABYSURBVBjThY/JDsAgCESt4lpX/v9jLQZJ6qF9t3khAyj1xXUKbQ4BVowDwqOYgExkkW4iY6lPaF06RqM8YItOuRbMaz6xjbsusDAW/drplBg47jP696cXE8bPA1eUDeK2AAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE3LTA1LTE4VDIzOjA0OjUxKzAyOjAwxE59ewAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNy0wNS0xOFQyMzowNDo1MSswMjowMLUTxccAAAAZdEVYdFNvZnR3YXJlAHd3dy5pbmtzY2FwZS5vcmeb7jwaAAAAAElFTkSuQmCC"/> | ||||||
|  |  | ||||||
|     <link rel="stylesheet" href="/css/normalize.css"> |     <link rel="stylesheet" href="/css/normalize.css"> | ||||||
|     <link rel="stylesheet" href="/css/style.css"> |     <link rel="stylesheet" href="/css/style.css"> | ||||||
|     </head> |     </head> | ||||||
|     <body onload="javascript:start();"> |     <body onload="javascript:start();"> | ||||||
|       <div><h4 id="mainHeader">Control<span id="conStatus" class="label">Offline</span></h4></div> |  | ||||||
|  |       <div><h4><div id="mainHeader">Control</div> <span id="conStatus" class="label">Offline</span></h4></div> | ||||||
|       <hr /> |       <hr /> | ||||||
|       <div class="container"> |       <div class="container"> | ||||||
|         <div id="row" class="row u-full-width"> |         <div id="row" class="row u-full-width"> | ||||||
|         </div> |         </div> | ||||||
|       </div> |       </div> | ||||||
|  |        | ||||||
|      <script src="/js/zepto.js"></script> |      <script src="/js/zepto.js"></script> | ||||||
|      <script src="/js/controls.js"></script> |      <script src="/js/controls.js"></script> | ||||||
|     </body> |     </body> | ||||||
|   | |||||||
							
								
								
									
										118
									
								
								examples/softAP_UI_Test/data/js/controls.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										118
									
								
								examples/softAP_UI_Test/data/js/controls.js
									
									
									
									
										vendored
									
									
								
							| @@ -1,9 +1,20 @@ | |||||||
| // TASKS: | // Roadmap: | ||||||
|  |  | ||||||
| // Roadmap |  | ||||||
| // Build changeable Labels |  | ||||||
| // Build a serial Console? | // Build a serial Console? | ||||||
|  |  | ||||||
|  | const UI_TITEL = 0; | ||||||
|  | const UI_LABEL = 1; | ||||||
|  | const UI_BUTTON = 2; | ||||||
|  | const UI_SWITCHER = 3; | ||||||
|  | const UI_PAD = 4; | ||||||
|  | const UI_CPAD = 5; | ||||||
|  | const UPDATE_LABEL = 6; | ||||||
|  |  | ||||||
|  | const FOR = 0; | ||||||
|  | const BACK = 1; | ||||||
|  | const LEFT = 2; | ||||||
|  | const RIGHT = 3; | ||||||
|  | const CENTER = 4; | ||||||
|  |  | ||||||
| var websock; | var websock; | ||||||
| function start() { | function start() { | ||||||
|   websock = new WebSocket('ws://' + window.location.hostname + '/ws'); |   websock = new WebSocket('ws://' + window.location.hostname + '/ws'); | ||||||
| @@ -27,29 +38,88 @@ function start() { | |||||||
|   websock.onmessage = function(evt) { |   websock.onmessage = function(evt) { | ||||||
|     console.log(evt); |     console.log(evt); | ||||||
|     var data = JSON.parse(evt.data); |     var data = JSON.parse(evt.data); | ||||||
|     console.log(data); |  | ||||||
|     var e = document.body; |     var e = document.body; | ||||||
|     if (data.type === 'domButton') { |     var center = ""; | ||||||
|       //initial rendering of the Buttons |     switch(data.type){ | ||||||
|       $('#row').append("<div class='two columns card'><h5>"+data.label+"</h5><hr/><button onClick='buttonclick(this)'' id="+data.id+"></button></div>"); |       case UI_TITEL: | ||||||
|     } |         document.title = data.label; | ||||||
|     if (data.type === 'domLabel') { |         $('#mainHeader').html(data.label); | ||||||
|       //initial rendering of the Labels |       break; | ||||||
|       $('#row').append("<div class='two columns card'><h5>"+data.l_title+"</h5><hr /><h3><span class='label'>"+data.label+"</span></h3></div>"); |       case UI_LABEL: | ||||||
|     } |         $('#row').append("<div class='two columns card'><h5 id='"+data.id+"'>"+data.label+"</h5></div>"); | ||||||
|     else if (data.type === 'value') { |       break; | ||||||
|       // Display some kind of value |       case UI_BUTTON: | ||||||
|     } |         $('#row').append("<div class='two columns card'><h5>"+data.label+"</h5><hr/><button onmousedown='buttonclick("+data.id+", true)' onmouseup='buttonclick("+data.id+", false)' id='"+data.id+"'></button></div>"); | ||||||
|     else { |         $('#'+data.id).on({ 'touchstart' : function(e){e.preventDefault(); buttonclick(data.id, true) } }); | ||||||
|       console.log('unknown event'); |         $('#'+data.id).on({ 'touchend' : function(e){e.preventDefault(); buttonclick(data.id, false) } }); | ||||||
|  |       break; | ||||||
|  |       case UI_CPAD: | ||||||
|  |       center = "<a class='confirm' onmousedown='padclick(CENTER, "+data.id+", true)' onmouseup='padclick(CENTER, "+data.id+", false)' href='#' id='c"+data.id+"'>OK</a>"; | ||||||
|  |       //NO BREAK | ||||||
|  |       case UI_PAD: | ||||||
|  |       $('#row').append( | ||||||
|  |       "<div class='two columns card'><h5>"+data.label+"</h5><hr/>"+ | ||||||
|  |       "<nav class='control'>"+ | ||||||
|  |       "<ul>"+ | ||||||
|  |       "<li><a onmousedown='padclick(FOR, "+data.id+", true)' onmouseup='padclick(FOR, "+data.id+", false)' href='#' id='f"+data.id+"'>▲</a></li>" + | ||||||
|  |       "<li><a onmousedown='padclick(RIGHT, "+data.id+", true)' onmouseup='padclick(RIGHT, "+data.id+", false)' href='#' id='r"+data.id+"'>▲</a></li>" + | ||||||
|  |       "<li><a onmousedown='padclick(LEFT, "+data.id+", true)' onmouseup='padclick(LEFT, "+data.id+", false)' href='#' id='l"+data.id+"'>▲</a></li>" + | ||||||
|  |       "<li><a onmousedown='padclick(BACK, "+data.id+", true)' onmouseup='padclick(BACK, "+data.id+", false)' href='#' id='b"+data.id+"'>▲</a></li>" + | ||||||
|  |       "</ul>"+ | ||||||
|  |       center + | ||||||
|  |       "</nav>"+ | ||||||
|  |       "</div>"); | ||||||
|  |  | ||||||
|  |       $('#f'+data.id).on({ 'touchstart' : function(e){e.preventDefault(); padclick(FOR, data.id, true) } }); | ||||||
|  |       $('#f'+data.id).on({ 'touchend' : function(e){e.preventDefault(); padclick(FOR, data.id, false) } }); | ||||||
|  |       $('#l'+data.id).on({ 'touchstart' : function(e){e.preventDefault(); padclick(LEFT, data.id, true) } }); | ||||||
|  |       $('#l'+data.id).on({ 'touchend' : function(e){e.preventDefault(); padclick(LEFT, data.id, false) } }); | ||||||
|  |       $('#r'+data.id).on({ 'touchstart' : function(e){e.preventDefault(); padclick(RIGHT, data.id, true) } }); | ||||||
|  |       $('#r'+data.id).on({ 'touchend' : function(e){e.preventDefault(); padclick(RIGHT, data.id, false) } }); | ||||||
|  |       $('#b'+data.id).on({ 'touchstart' : function(e){e.preventDefault(); padclick(BACK, data.id, true) } }); | ||||||
|  |       $('#b'+data.id).on({ 'touchend' : function(e){e.preventDefault(); padclick(BACK,data.id, false) } }); | ||||||
|  |       $('#c'+data.id).on({ 'touchstart' : function(e){e.preventDefault(); padclick(CENTER, data.id, true) } }); | ||||||
|  |       $('#c'+data.id).on({ 'touchend' : function(e){e.preventDefault(); padclick(CENTER,data.id, false) } }); | ||||||
|  |  | ||||||
|  |       break; | ||||||
|  |       case UPDATE_LABEL: | ||||||
|  |       $('#'+data.id).html(data.label); | ||||||
|  |       break; | ||||||
|  |       default: | ||||||
|  |         console.error('Unknown type or event'); | ||||||
|  |       break; | ||||||
|     } |     } | ||||||
|   }; |   }; | ||||||
| } | } | ||||||
|  |  | ||||||
| function buttonclick(e) { |  | ||||||
|   websock.send("bdown:"+e.id); | function buttonclick(number, isdown) { | ||||||
|   /* |   if(isdown)websock.send("bdown:"+number); | ||||||
|   if release |   else websock.send("bup:"+number); | ||||||
|   websock.send("bup:"+e.id); | } | ||||||
|   */ |  | ||||||
|  | function padclick(type, number, isdown) { | ||||||
|  |   switch(type){ | ||||||
|  |     case CENTER: | ||||||
|  |       if(isdown)websock.send("pcdown:"+number); | ||||||
|  |       else websock.send("pcup:"+number); | ||||||
|  |     break; | ||||||
|  |     case FOR: | ||||||
|  |       if(isdown)websock.send("pfdown:"+number); | ||||||
|  |       else websock.send("pfup:"+number); | ||||||
|  |     break; | ||||||
|  |     case BACK: | ||||||
|  |       if(isdown)websock.send("pbdown:"+number); | ||||||
|  |       else websock.send("pbup:"+number); | ||||||
|  |     break; | ||||||
|  |     case LEFT: | ||||||
|  |       if(isdown)websock.send("pldown:"+number); | ||||||
|  |       else websock.send("plup:"+number); | ||||||
|  |     break; | ||||||
|  |     case RIGHT: | ||||||
|  |       if(isdown)websock.send("prdown:"+number); | ||||||
|  |       else websock.send("prup:"+number); | ||||||
|  |     break; | ||||||
|  |  | ||||||
|  |   } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,36 +1,94 @@ | |||||||
| #include <WiFi.h> | #include <WiFi.h> | ||||||
| #include <EasyUI.h> | #include <EasyUI.h> | ||||||
|  |  | ||||||
| const char* ssid = "EasyUI"; | const char* ssid = "LARSUI"; | ||||||
| const char* password = ""; | const char* password = ""; | ||||||
|  |  | ||||||
|  | long oldTime = 0; | ||||||
|  |  | ||||||
| void setup(void) { | void setup(void) { | ||||||
|   Serial.begin(115200); |   Serial.begin(115200); | ||||||
|   WiFi.mode(WIFI_AP); |   WiFi.mode(WIFI_AP); | ||||||
|   WiFi.softAP(ssid, password); |   WiFi.setHostname(ssid); | ||||||
|  |   WiFi.softAP(ssid); | ||||||
|  |   //WiFi.softAP(ssid, password); | ||||||
|   Serial.println(""); |   Serial.println(""); | ||||||
|   Serial.print("IP address: "); |   Serial.print("IP address: "); | ||||||
|   Serial.println(WiFi.softAPIP()); |   Serial.println(WiFi.softAPIP()); | ||||||
|  |  | ||||||
|   EasyUI.title("LARSControl"); |   EasyUI.label("Status: Maxim Stop"); | ||||||
|  |   EasyUI.label("0"); | ||||||
|  |   EasyUI.button("MaximDance Button", &callback2); | ||||||
|  |   EasyUI.pad("center", true, &callback3); | ||||||
|  |   EasyUI.pad("NoCenter", false, &callback3); | ||||||
|  |  | ||||||
|  |   EasyUI.begin("LARS Control"); | ||||||
|  |  | ||||||
|   EasyUI.label("Label","123"); |  | ||||||
|   EasyUI.label("Label2","456"); |  | ||||||
|   EasyUI.label("Label3","789"); |  | ||||||
|   EasyUI.button("LED", &callback1); |  | ||||||
|   EasyUI.begin(); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| void loop(void) { | void loop(void) { | ||||||
|  |   if(millis()-oldTime> 5000){ | ||||||
|  |     EasyUI.print(1, String(millis())); | ||||||
|  |     oldTime = millis(); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void callback1(void) { | void callback1(int id, int type) { | ||||||
|   Serial.println("CALLBACK UNO"); |   switch (type) { | ||||||
|  |     case B_DOWN: | ||||||
|  |       Serial.println("Button DOWN"); | ||||||
|  |       break; | ||||||
|  |     case B_UP: | ||||||
|  |       Serial.println("Button UP"); | ||||||
|  |       break; | ||||||
|  |   } | ||||||
|  |  | ||||||
| } | } | ||||||
| void callback2(void) { |  | ||||||
|   Serial.println("CALLBACK DOS"); | void callback2(int id, int type) { | ||||||
|  |   switch (type) { | ||||||
|  |     case B_DOWN: | ||||||
|  |       Serial.println("Maxim Start DAnce######################"); | ||||||
|  |       EasyUI.print(0, "Status: Maxim Start"); | ||||||
|  |       break; | ||||||
|  |     case B_UP: | ||||||
|  |       Serial.println("Maxim STOP DAnce######################"); | ||||||
|  |       EasyUI.print(0, "Status: Maxim Start"); | ||||||
|  |       break; | ||||||
|  |   } | ||||||
| } | } | ||||||
| void callback3(void) { | void callback3(int id, int value) { | ||||||
|   Serial.println("CALLBACK TRES"); |   switch (value) { | ||||||
|  |     case P_LEFT_DOWN: | ||||||
|  |       Serial.println("left down"); | ||||||
|  |       break; | ||||||
|  |     case P_LEFT_UP: | ||||||
|  |       Serial.println("left up"); | ||||||
|  |       break; | ||||||
|  |     case P_RIGHT_DOWN: | ||||||
|  |       Serial.println("right down"); | ||||||
|  |       break; | ||||||
|  |     case P_RIGHT_UP: | ||||||
|  |       Serial.println("right up"); | ||||||
|  |       break; | ||||||
|  |     case P_FOR_DOWN: | ||||||
|  |       Serial.println("for down"); | ||||||
|  |       break; | ||||||
|  |     case P_FOR_UP: | ||||||
|  |       Serial.println("for up"); | ||||||
|  |       break; | ||||||
|  |     case P_BACK_DOWN: | ||||||
|  |       Serial.println("back down"); | ||||||
|  |       break; | ||||||
|  |     case P_BACK_UP: | ||||||
|  |       Serial.println("back up"); | ||||||
|  |       break; | ||||||
|  |     case P_CENTER_DOWN: | ||||||
|  |       Serial.println("center down"); | ||||||
|  |       break; | ||||||
|  |     case P_CENTER_UP: | ||||||
|  |       Serial.println("center up"); | ||||||
|  |       break; | ||||||
|  |   } | ||||||
|  |   Serial.println(id); | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										220
									
								
								src/EasyUI.cpp
									
									
									
									
									
								
							
							
						
						
									
										220
									
								
								src/EasyUI.cpp
									
									
									
									
									
								
							| @@ -16,168 +16,124 @@ void onWsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventT | |||||||
|             } |             } | ||||||
|             break; |             break; | ||||||
|         case WS_EVT_DATA: |         case WS_EVT_DATA: | ||||||
|           Serial.print("WS Event"); |  | ||||||
|           String msg = ""; |           String msg = ""; | ||||||
|           for (size_t i = 0; i < len; i++) { |           for (size_t i = 0; i < len; i++) { | ||||||
|             msg += (char) data[i]; |             msg += (char) data[i]; | ||||||
|           } |           } | ||||||
|           Serial.println(msg); |           if(msg.startsWith("bdown:")){ | ||||||
|           StaticJsonBuffer<200> jsonBuffer; |             EasyUI.controls[msg.substring(6).toInt()]->callback(msg.substring(6).toInt(), B_DOWN); | ||||||
|           JsonObject& root = jsonBuffer.parseObject(msg); |           }else if(msg.startsWith("bup:")){ | ||||||
|              String type = root["type"]; |             EasyUI.controls[msg.substring(4).toInt()]->callback(msg.substring(4).toInt(), B_UP); | ||||||
|              if(type == "t"){ |           }else if(msg.startsWith("pfdown:")){ | ||||||
|                //Button Action |             EasyUI.controls[msg.substring(7).toInt()]->callback(msg.substring(7).toInt(), P_FOR_DOWN); | ||||||
|                //TODO: get Button here |           }else if(msg.startsWith("pfup:")){ | ||||||
|                EasyUI.buttons[0]->callback(); |             EasyUI.controls[msg.substring(5).toInt()]->callback(msg.substring(5).toInt(), P_FOR_UP); | ||||||
|                //EasyUI.tbuttonStatus(); |           }else if(msg.startsWith("pldown:")){ | ||||||
|              } |             EasyUI.controls[msg.substring(7).toInt()]->callback(msg.substring(7).toInt(), P_LEFT_DOWN); | ||||||
|              /* |           }else if(msg.startsWith("plup:")){ | ||||||
|              else if(mode == "tb_click"){ |             EasyUI.controls[msg.substring(5).toInt()]->callback(msg.substring(5).toInt(), P_LEFT_UP); | ||||||
|                String status = root["status"]; |           }else if(msg.startsWith("prdown:")){ | ||||||
|                String index = root["index"]; |             EasyUI.controls[msg.substring(7).toInt()]->callback(msg.substring(7).toInt(), P_RIGHT_DOWN); | ||||||
|               //EasyUI.tbClick(index, status); |           }else if(msg.startsWith("prup:")){ | ||||||
|              } |             EasyUI.controls[msg.substring(5).toInt()]->callback(msg.substring(5).toInt(), P_RIGHT_UP); | ||||||
|              */ |           }else if(msg.startsWith("pbdown:")){ | ||||||
|             break; |             EasyUI.controls[msg.substring(7).toInt()]->callback(msg.substring(7).toInt(), P_BACK_DOWN); | ||||||
|  |           }else if(msg.startsWith("pbup:")){ | ||||||
|  |             EasyUI.controls[msg.substring(5).toInt()]->callback(msg.substring(5).toInt(), P_BACK_UP); | ||||||
|  |           }else if(msg.startsWith("pcdown:")){ | ||||||
|  |             EasyUI.controls[msg.substring(7).toInt()]->callback(msg.substring(7).toInt(), P_CENTER_DOWN); | ||||||
|  |           }else if(msg.startsWith("pcup:")){ | ||||||
|  |             EasyUI.controls[msg.substring(5).toInt()]->callback(msg.substring(5).toInt(), P_CENTER_UP); | ||||||
|  |           } | ||||||
|  |           break; | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| void EasyUIClass::title(const char* _title){ | void EasyUIClass::label(const char* label){ | ||||||
|   ui_title = _title; |   Control* newL = new Control(); | ||||||
|  |   newL->type = UI_LABEL; | ||||||
|  |   newL->label = label; | ||||||
|  |   newL->oldValue = label; | ||||||
|  |   newL->callback = NULL; | ||||||
|  |   controls[cIndex] = newL; | ||||||
|  |   cIndex++; | ||||||
| } | } | ||||||
|  |  | ||||||
| // Create Labels | void EasyUIClass::button(const char* label, void(* callBack)(int, int)){ | ||||||
| void EasyUIClass::label(const char* label_name,const char*  label_val){ |   Control* newB = new Control(); | ||||||
|   label_value[l_index] = label_val; |   newB->type = UI_BUTTON; | ||||||
|   label_title[l_index] = label_name; |   newB->label = label; | ||||||
|   l_index++; |  | ||||||
| } |  | ||||||
| /* |  | ||||||
| // Create Toggle Buttons |  | ||||||
| void EasyUIClass::toggleButton(uint8_t  pin, const char* tbutton_label, int start_state, bool swap_state){ |  | ||||||
|   pinMode(pin, OUTPUT); |  | ||||||
|   digitalWrite(pin, start_state); |  | ||||||
|   tbutton_swap[tb_index] = swap_state; |  | ||||||
|   tbutton_pinout[tb_index] = pin; |  | ||||||
|   tbuttontitle[tb_index] = tbutton_label; |  | ||||||
|   tb_index++; |  | ||||||
| } |  | ||||||
| */ |  | ||||||
| // Create a generic Button |  | ||||||
| void EasyUIClass::button(const char* bLabel, void(* callBack)()){ |  | ||||||
|  |  | ||||||
| //TODO: Implement |  | ||||||
|   Button* newB = new Button(); |  | ||||||
|  |  | ||||||
|   newB->label = bLabel; |  | ||||||
|   newB->callback = callBack; |   newB->callback = callBack; | ||||||
|   buttons[bIndex] = newB; |   controls[cIndex] = newB; | ||||||
|   bIndex++; |   cIndex++; | ||||||
| } | } | ||||||
| /* |  | ||||||
| // Check Toggle Buttons States and Transfer to Webpage |  | ||||||
| void EasyUIClass::tbuttonStatus(){ |  | ||||||
|   String json; |  | ||||||
|   StaticJsonBuffer<200> jsonBuffer; |  | ||||||
|   JsonObject& root = jsonBuffer.createObject(); |  | ||||||
|   root["mode"] = "t_button_startup"; |  | ||||||
|   root["index"] = tb_index; |  | ||||||
|     for(int i=0; i<tb_index; i++){ |  | ||||||
|       String name = "tb"+String(i); |  | ||||||
|       int stat = digitalRead(tbutton_pinout[i]); |  | ||||||
|     if(tbutton_swap[i]){ |  | ||||||
|       if(stat == HIGH) |  | ||||||
|       root[name] = "0"; |  | ||||||
|      else if(stat == LOW) |  | ||||||
|       root[name] = "1"; |  | ||||||
|      else |  | ||||||
|      root[name] = "unknown"; |  | ||||||
|    } |  | ||||||
|    else{ |  | ||||||
|     if(stat == HIGH) |  | ||||||
|      root[name] = "1"; |  | ||||||
|     else if(stat == LOW) |  | ||||||
|      root[name] = "0"; |  | ||||||
|     else |  | ||||||
|     root[name] = "unknown"; |  | ||||||
|    } |  | ||||||
| } |  | ||||||
|     root.printTo(json); |  | ||||||
|   webSocket->broadcastTXT(json); |  | ||||||
| } |  | ||||||
| */ |  | ||||||
|  |  | ||||||
| /* | void EasyUIClass::switcher(const char* label, int start_state, void(* callBack)(int, int)){ | ||||||
| // Handle Toggle Button Click Response |   Control* newS = new Control(); | ||||||
| void EasyUIClass::tbClick(String _index, String _status){ |   newS->type = UI_SWITCHER; | ||||||
|   String json; |   newS->label = label; | ||||||
|   StaticJsonBuffer<200> jsonBuffer; |   newS->callback = callBack; | ||||||
|   JsonObject& root = jsonBuffer.createObject(); |   controls[cIndex] = newS; | ||||||
|   String name = "tb"+_index; |   cIndex++; | ||||||
|   root["mode"] = "t_button_click"; |   //TODO: implement switch state buffer | ||||||
|   root["index"] = _index; |   //tbutton_swap[tb_index] = swap_state; | ||||||
|  | } | ||||||
|  |  | ||||||
|   if(_status == "on"){ | void EasyUIClass::pad(const char* label, bool center, void(* callBack)(int, int)){ | ||||||
|     root[name] = "1"; |   Control* newP = new Control(); | ||||||
|  |   if(center)newP->type = UI_CPAD; | ||||||
|  |   else newP->type = UI_PAD; | ||||||
|  |   newP->label = label; | ||||||
|  |   newP->callback = callBack; | ||||||
|  |   controls[cIndex] = newP; | ||||||
|  |   cIndex++; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void EasyUIClass::print(int labelid, String value){ | ||||||
|  |   if(labelid<cIndex && controls[labelid]->type == UI_LABEL){ | ||||||
|  |     controls[labelid]->oldValue = value; | ||||||
|  |     String json; | ||||||
|  |     StaticJsonBuffer<200> jsonBuffer; | ||||||
|  |     JsonObject& root = jsonBuffer.createObject(); | ||||||
|  |     root["type"] = UPDATE_LABEL; | ||||||
|  |     root["label"] = value; | ||||||
|  |     root["id"] = String(labelid); | ||||||
|     root.printTo(json); |     root.printTo(json); | ||||||
|     webSocket->broadcastTXT(json); |     this->ws->textAll(json); | ||||||
|     if(tbutton_swap[_index.toInt()]){ |  | ||||||
|       digitalWrite(tbutton_pinout[_index.toInt()], LOW); |  | ||||||
|     }else{ |  | ||||||
|       digitalWrite(tbutton_pinout[_index.toInt()], HIGH); |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|   else if(_status == "off"){ |  | ||||||
|     root[name] = "0"; |  | ||||||
|     root.printTo(json); |  | ||||||
|     webSocket->broadcastTXT(json); |  | ||||||
|   if(tbutton_swap[_index.toInt()]){ |  | ||||||
|     digitalWrite(tbutton_pinout[_index.toInt()], HIGH); |  | ||||||
|   }else{ |   }else{ | ||||||
|     digitalWrite(tbutton_pinout[_index.toInt()], LOW); |     Serial.println(String("Error: ")+ String(labelid) +String(" is no label")); | ||||||
|   } |  | ||||||
|   } |   } | ||||||
| } | } | ||||||
| */ |  | ||||||
|  |  | ||||||
| // Convert & Transfer Arduino elements to JSON elements | // Convert & Transfer Arduino elements to JSON elements | ||||||
| void EasyUIClass::jsonDom(AsyncWebSocketClient * client){ | void EasyUIClass::jsonDom(AsyncWebSocketClient * client){ | ||||||
|   //SiteTitle |   for(int i=-1; i<cIndex; i++){ | ||||||
|   //TODO: emit here |  | ||||||
|   // Labels |  | ||||||
|   for(int i=0; i<l_index; i++){ |  | ||||||
|     String json; |     String json; | ||||||
|     StaticJsonBuffer<200> jsonBuffer1; |     StaticJsonBuffer<200> jsonBuffer; | ||||||
|     JsonObject& root1 = jsonBuffer1.createObject(); |     JsonObject& root = jsonBuffer.createObject(); | ||||||
|     root1["type"] = "domLabel"; |     if(i == -1){ | ||||||
|     root1["l_title"] = String(label_title[i]); |       root["type"] = UI_TITEL; | ||||||
|     root1["label"] = String(label_value[i]); |       root["label"] = String(ui_title); | ||||||
|     root1.printTo(json); |     }else{ | ||||||
|  |       root["type"] = controls[i]->type; | ||||||
|  |       root["label"] = String(controls[i]->label); | ||||||
|  |       root["id"] = String(i); | ||||||
|  |       if(controls[i]->type == UI_LABEL)root["label"] = controls[i]->oldValue; | ||||||
|  |     } | ||||||
|  |     root.printTo(json); | ||||||
|     client->text(json); |     client->text(json); | ||||||
|   } |   } | ||||||
|   //  Buttons |  | ||||||
|   for(int i=0; i<bIndex; i++){ |  | ||||||
|     String json; |  | ||||||
|     StaticJsonBuffer<200> jsonBuffer2; |  | ||||||
|     JsonObject& root2 = jsonBuffer2.createObject(); |  | ||||||
|     root2["type"] = "domButton"; |  | ||||||
|     root2["index"] = String(i); |  | ||||||
|     root2["label"] = buttons[i]->label; |  | ||||||
|     root2.printTo(json); |  | ||||||
|     client->text(json); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| void EasyUIClass::begin(){ | void EasyUIClass::begin(const char * _title){ | ||||||
|  |   ui_title = _title; | ||||||
|   server = new AsyncWebServer(80); |   server = new AsyncWebServer(80); | ||||||
|   ws = new AsyncWebSocket("/ws"); |   ws = new AsyncWebSocket("/ws"); | ||||||
|   SPIFFS.begin(false); |   SPIFFS.begin(); | ||||||
|  |  | ||||||
|   ws->onEvent(onWsEvent); |   ws->onEvent(onWsEvent); | ||||||
|   server->addHandler(ws); |   server->addHandler(ws); | ||||||
|  |  | ||||||
|   server->serveStatic("/", SPIFFS, "/").setDefaultFile("index.htm"); |   server->serveStatic("/", SPIFFS, "/").setDefaultFile("index.htm"); | ||||||
|  |  | ||||||
|   //Heap for general Servertest |   //Heap for general Servertest | ||||||
|   | |||||||
							
								
								
									
										69
									
								
								src/EasyUI.h
									
									
									
									
									
								
							
							
						
						
									
										69
									
								
								src/EasyUI.h
									
									
									
									
									
								
							| @@ -16,38 +16,61 @@ | |||||||
| #include <AsyncTCP.h> | #include <AsyncTCP.h> | ||||||
| #include <ESPAsyncWebServer.h> | #include <ESPAsyncWebServer.h> | ||||||
|  |  | ||||||
| typedef struct Button | typedef struct Control | ||||||
| { | { | ||||||
|  |     unsigned int type; | ||||||
|     const char *label; |     const char *label; | ||||||
|     void (*callback)(); |     void (*callback)(int, int); | ||||||
| } Button; |     String oldValue; | ||||||
|  | } Control; | ||||||
|  |  | ||||||
|  | // Types | ||||||
|  | #define UI_TITEL 0 | ||||||
|  | #define UI_LABEL 1 | ||||||
|  | #define UI_BUTTON 2 | ||||||
|  | #define UI_SWITCHER 3 | ||||||
|  | #define UI_PAD 4 | ||||||
|  | #define UI_CPAD 5 | ||||||
|  | #define UPDATE_LABEL 6 | ||||||
|  |  | ||||||
|  | // Values | ||||||
|  | #define B_DOWN -1 | ||||||
|  | #define B_UP  1 | ||||||
|  |  | ||||||
|  | #define P_LEFT_DOWN -2 | ||||||
|  | #define P_LEFT_UP 2 | ||||||
|  | #define P_RIGHT_DOWN -3 | ||||||
|  | #define P_RIGHT_UP 3 | ||||||
|  | #define P_FOR_DOWN -4 | ||||||
|  | #define P_FOR_UP 4 | ||||||
|  | #define P_BACK_DOWN -5 | ||||||
|  | #define P_BACK_UP 5 | ||||||
|  | #define P_CENTER_DOWN -6 | ||||||
|  | #define P_CENTER_UP 6 | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| class EasyUIClass{ | class EasyUIClass{ | ||||||
|  |  | ||||||
| public: | public: | ||||||
|   void begin();   // Begin HTTP Server + WebSocketsServer & Initalize All Elements |   void begin(const char* _title);   // Setup servers and page | ||||||
|   void title(const char* _title);  // Define Webpage Header Name and title |  | ||||||
|   //void toggleButton(uint8_t  pin, const char* tbutton_label, int start_state = 0, bool swap_state = false);   // Create Toggle Button |   // Creating Elements | ||||||
|   void button(const char* tbutton_label, void(* callBack)());   // Create Event Button |   void label(const char* label); // Create Label | ||||||
|   void label(const char* label_name, const char*  label_val); // Create Label |   void button(const char* label, void(* callBack)(int, int));   // Create Event Button | ||||||
|  |   void switcher(const char* label, int start_state, void(* callBack)(int, int));   // Create Toggle Button | ||||||
|  |   void pad(const char* label, bool centerButton, void(* callBack)(int, int));   // Create Pad Control | ||||||
|  |  | ||||||
|  |   // Update Elements | ||||||
|  |   void print(int labelid, String value); | ||||||
|  |  | ||||||
|   // Variables --- |   // Variables --- | ||||||
|   const char* ui_title = "EasyUI"; // Store UI Title and Header Name |   const char* ui_title = "ESPUI"; // Store UI Title and Header Name | ||||||
|   int bIndex;   // How Many Buttons |   int cIndex;   // Control index | ||||||
|   int l_index;    // How Many Labels |   Control* controls[25]; | ||||||
|  |  | ||||||
|   bool tbutton_swap[10]; |  | ||||||
|   Button* buttons[10]; |  | ||||||
|  |  | ||||||
|   const char*  label_value[10];      // Stores Label Values - MAX 10 |  | ||||||
|   const char* label_title[10];    // Stores Label Titles - MAX 10 |  | ||||||
|  |  | ||||||
|   String webpage;                      // Coverts Arduino elements to JSON elements |  | ||||||
|  |  | ||||||
|   void tbClick(String _index, String _status); |  | ||||||
|   void tbuttonStatus(); |  | ||||||
|   void jsonDom(AsyncWebSocketClient * client); |   void jsonDom(AsyncWebSocketClient * client); | ||||||
|  |  | ||||||
|  private: | private: | ||||||
|   AsyncWebServer* server; |   AsyncWebServer* server; | ||||||
|   AsyncWebSocket* ws; |   AsyncWebSocket* ws; | ||||||
| }; | }; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user