Functional.

This commit is contained in:
jmgiacalone committed 2024-02-24 22:44:48 +00:00
1 parent 03d58b549d
commit 6fffdc8743
7 files changed
+1520 -82

No files matched your search

+13
View File
@@ -0,0 +1,13 @@
/*!
* Materialize v1.0.0 (http://materializecss.com)
* Copyright 2014-2017 Materialize
* MIT License (https://raw.githubusercontent.com/Dogfalo/materialize/master/LICENSE)
*/
.materialize-red{background-color:#e51c23 !important}.materialize-red-text{color:#e51c23 !important}.materialize-red.lighten-5{background-color:#fdeaeb !important}.materialize-red-text.text-lighten-5{color:#fdeaeb !important}.materialize-red.lighten-4{background-color:#f8c1c3 !important}.materialize-red-text.text-lighten-4{color:#f8c1c3 !important}.materialize-red.lighten-3{background-color:#f3989b !important}.materialize-red-text.text-lighten-3{color:#f3989b !important}.materialize-red.lighten-2{background-color:#ee6e73 !important}.materialize-red-text.text-lighten-2{color:#ee6e73 !important}.materialize-red.lighten-1{background-color:#ea454b !important}.materialize-red-text.text-lighten-1{color:#ea454b !important}.materialize-red.darken-1{background-color:#d0181e !important}.materialize-red-text.text-darken-1{color:#d0181e !important}.materialize-red.darken-2{background-color:#b9151b !important}.materialize-red-text.text-darken-2{color:#b9151b !important}.materialize-red.darken-3{background-color:#a21318 !important}.materialize-red-text.text-darken-3{color:#a21318 !important}.materialize-red.darken-4{background-color:#8b1014 !important}.materialize-red-text.text-darken-4{color:#8b1014 !important}.red{background-color:#F44336 !important}.red-text{color:#F44336 !important}.red.lighten-5{background-color:#FFEBEE !important}.red-text.text-lighten-5{color:#FFEBEE !important}.red.lighten-4{background-color:#FFCDD2 !important}.red-text.text-lighten-4{color:#FFCDD2 !important}.red.lighten-3{background-color:#EF9A9A !important}.red-text.text-lighten-3{color:#EF9A9A !important}.red.lighten-2{background-color:#E57373 !important}.red-text.text-lighten-2{color:#E57373 !important}.red.lighten-1{background-color:#EF5350 !important}.red-text.text-lighten-1{color:#EF5350 !important}.red.darken-1{background-color:#E53935 !important}.red-text.text-darken-1{color:#E53935 !important}.red.darken-2{background-color:#D32F2F !important}.red-text.text-darken-2{color:#D32F2F !important}.red.darken-3{background-color:#C62828 !important}.red-text.text-darken-3{color:#C62828 !important}.red.darken-4{background-color:#B71C1C !important}.red-text.text-darken-4{color:#B71C1C !important}.red.accent-1{background-color:#FF8A80 !important}.red-text.text-accent-1{color:#FF8A80 !important}.red.accent-2{background-color:#FF5252 !important}.red-text.text-accent-2{color:#FF5252 !important}.red.accent-3{background-color:#FF1744 !important}.red-text.text-accent-3{color:#FF1744 !important}.red.accent-4{background-color:#D50000 !important}.red-text.text-accent-4{color:#D50000 !important}.pink{background-color:#e91e63 !important}.pink-text{color:#e91e63 !important}.pink.lighten-5{background-color:#fce4ec !important}.pink-text.text-lighten-5{color:#fce4ec !important}.pink.lighten-4{background-color:#f8bbd0 !important}.pink-text.text-lighten-4{color:#f8bbd0 !important}.pink.lighten-3{background-color:#f48fb1 !important}.pink-text.text-lighten-3{color:#f48fb1 !important}.pink.lighten-2{background-color:#f06292 !important}.pink-text.text-lighten-2{color:#f06292 !important}.pink.lighten-1{background-color:#ec407a !important}.pink-text.text-lighten-1{color:#ec407a !important}.pink.darken-1{background-color:#d81b60 !important}.pink-text.text-darken-1{color:#d81b60 !important}.pink.darken-2{background-color:#c2185b !important}.pink-text.text-darken-2{color:#c2185b !important}.pink.darken-3{background-color:#ad1457 !important}.pink-text.text-darken-3{color:#ad1457 !important}.pink.darken-4{background-color:#880e4f !important}.pink-text.text-darken-4{color:#880e4f !important}.pink.accent-1{background-color:#ff80ab !important}.pink-text.text-accent-1{color:#ff80ab !important}.pink.accent-2{background-color:#ff4081 !important}.pink-text.text-accent-2{color:#ff4081 !important}.pink.accent-3{background-color:#f50057 !important}.pink-text.text-accent-3{color:#f50057 !important}.pink.accent-4{background-color:#c51162 !important}.pink-text.text-accent-4{color:#c51162 !important}.purple{background-color:#9c27b0 !important}.purple-text{color:#9c27b0 !important}.purple.lighten-5{background-color:#f3e5f5 !important}.purple-text.text-lighten-5{color:#f3e5f5 !important}.purple.lighten-4{background-color:#e1bee7 !important}.purple-text.text-lighten-4{color:#e1bee7 !important}.purple.lighten-3{background-color:#ce93d8 !important}.purple-text.text-lighten-3{color:#ce93d8 !important}.purple.lighten-2{background-color:#ba68c8 !important}.purple-text.text-lighten-2{color:#ba68c8 !important}.purple.lighten-1{background-color:#ab47bc !important}.purple-text.text-lighten-1{color:#ab47bc !important}.purple.darken-1{background-color:#8e24aa !important}.purple-text.text-darken-1{color:#8e24aa !important}.purple.darken-2{background-color:#7b1fa2 !important}.purple-text.text-darken-2{color:#7b1fa2 !important}.purple.darken-3{background-color:#6a1b9a !important}.purple-text.text-darken-3{color:#6a1b9a !important}.purple.darken-4{background-color:#4a148c !important}.purple-text.text-darkeLine truncated
* Waves v0.6.0
* http://fian.my.id/Waves
*
* Copyright 2014 Alfiana E. Sibuea and other contributors
* Released under the MIT license
* https://github.com/fians/Waves/blob/master/LICENSE
*/.waves-effect{position:relative;cursor:pointer;display:inline-block;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;vertical-align:middle;z-index:1;-webkit-transition:.3s ease-out;transition:.3s ease-out}.waves-effect .waves-ripple{position:absolute;border-radius:50%;width:20px;height:20px;margin-top:-10px;margin-left:-10px;opacity:0;background:rgba(0,0,0,0.2);-webkit-transition:all 0.7s ease-out;transition:all 0.7s ease-out;-webkit-transition-property:opacity, -webkit-transform;transition-property:opacity, -webkit-transform;transition-property:transform, opacity;transition-property:transform, opacity, -webkit-transform;-webkit-transform:scale(0);transform:scale(0);pointer-events:none}.waves-effect.waves-light .waves-ripple{background-color:rgba(255,255,255,0.45)}.waves-effect.waves-red .waves-ripple{background-color:rgba(244,67,54,0.7)}.waves-effect.waves-yellow .waves-ripple{background-color:rgba(255,235,59,0.7)}.waves-effect.waves-orange .waves-ripple{background-color:rgba(255,152,0,0.7)}.waves-effect.waves-purple .waves-ripple{background-color:rgba(156,39,176,0.7)}.waves-effect.waves-green .waves-ripple{background-color:rgba(76,175,80,0.7)}.waves-effect.waves-teal .waves-ripple{background-color:rgba(0,150,136,0.7)}.waves-effect input[type="button"],.waves-effect input[type="reset"],.waves-effect input[type="submit"]{border:0;font-style:normal;font-size:inherit;text-transform:inherit;background:none}.waves-effect img{position:relative;z-index:-1}.waves-notransition{-webkit-transition:none !important;transition:none !important}.waves-circle{-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-mask-image:-webkit-radial-gradient(circle, white 100%, black 100%)}.waves-input-wrapper{border-radius:0.2em;vertical-align:bottom}.waves-input-wrapper .waves-button-input{position:relative;top:0;left:0;z-index:1}.waves-circle{text-align:center;width:2.5em;height:2.5em;line-height:2.5em;border-radius:50%;-webkit-mask-image:none}.waves-block{display:block}.waves-effect .waves-ripple{z-index:-1}.modal{display:none;position:fixed;left:0;right:0;background-color:#fafafa;padding:0;max-height:70%;width:55%;margin:auto;overflow-y:auto;border-radius:2px;will-change:top, opacity}.modal:focus{outline:none}@media only screen and (max-width: 992px){.modal{width:80%}}.modal h1,.modal h2,.modal h3,.modal h4{margin-top:0}.modal .modal-content{padding:24px}.modal .modal-close{cursor:pointer}.modal .modal-footer{border-radius:0 0 2px 2px;background-color:#fafafa;padding:4px 6px;height:56px;width:100%;text-align:right}.modal .modal-footer .btn,.modal .modal-footer .btn-large,.modal .modal-footer .btn-small,.modal .modal-footer .btn-flat{margin:6px 0}.modal-overlay{position:fixed;z-index:999;top:-25%;left:0;bottom:0;right:0;height:125%;width:100%;background:#000;display:none;will-change:opacity}.modal.modal-fixed-footer{padding:0;height:70%}.modal.modal-fixed-footer .modal-content{position:absolute;height:calc(100% - 56px);max-height:100%;width:100%;overflow-y:auto}.modal.modal-fixed-footer .modal-footer{border-top:1px solid rgba(0,0,0,0.1);position:absolute;bottom:0}.modal.bottom-sheet{top:auto;bottom:-100%;margin:0;width:100%;max-height:45%;border-radius:0;will-change:bottom, opacity}.collapsible{border-top:1px solid #ddd;border-right:1px solid #ddd;border-left:1px solid #ddd;margin:.5rem 0 1rem 0}.collapsible-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;cursor:pointer;-webkit-tap-highlight-color:transparent;line-height:1.5;padding:1rem;background-color:#fff;border-bottom:1px solid #ddd}.collapsible-header:focus{outline:0}.collapsible-header i{width:2rem;font-size:1.6rem;display:inline-block;text-align:center;margin-right:1rem}.keyboard-focused .collapsible-header:focus{background-color:#eee}.collapsible-body{display:none;border-bottom:1px solid #ddd;-webkit-box-sizing:border-box;box-sizing:border-box;padding:2rem}.sidenav .collapsible,.sidenav.fixed .collapsible{border:none;-webkit-box-shadow:none;box-shadow:none}.sidenav .collapsible li,.sidenav.fixed .collapsible li{padding:0}.sidenav .collapsible-header,.sidenav.fixed .collapsible-header{background-color:transparent;border:none;line-height:inherit;height:inherit;padding:0 16px}.sidenav .collapsible-header:hover,.sidenav.fixed .collapsible-header:hover{background-color:rgba(0,0,0,0.05)}.sidenav .collapsible-header i,.sidenav.fixed .collapsible-header i{line-height:inherit}.sidenav .collapsible-body,.sidenav.fixed .collapsible-body{border:0;background-color:#fff}.sidenav .collapsible-body li a,.sidenav.fixed .collapsible-body li a{padding:0 23.5px 0 31px}.collapsible.popout{border:none;-webkit-box-shadow:none;box-shadow:none}.collapsible.popout>li{-webkit-box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12);box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12);margin:0 24px;-webkit-transition:margin 0.35s cubLine truncated
+99 -15
View File
@@ -1,7 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title>eMAKER Printer Climate Control</title> <title>eMAKER Reflow Controller</title>
<!--Import Google Icon Font--> <!--Import Google Icon Font-->
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet" /> <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet" />
<!--Let browser know website is optimized for mobile--> <!--Let browser know website is optimized for mobile-->
@@ -9,27 +9,111 @@
<meta charset="utf-8" /> <meta charset="utf-8" />
<link type="text/css" rel="stylesheet" href="css/materialize.min.css" media="screen,projection" /> <link type="text/css" rel="stylesheet" href="css/materialize.min.css" media="screen,projection" />
<link rel="stylesheet" type="text/css" href="css/style.css" /> <link rel="stylesheet" type="text/css" href="css/style.css" />
<link rel="icon" type="image/x-icon" href="favicon.ico" /> <link rel="icon" type="image/x-icon" href="emaker.ico" />
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.3/Chart.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/chartjs-plugin-dragdata@0.1.0/dist/chartjs-plugin-dragData.min.js"></script>
</head> </head>
<body> <body>
<div class="container"> <div class="container">
<!-- Header row--> <!-- Header row -->
<div id="header" class="row"> <div class="row">
<div class="col 6 logo"> <div class="col 6 logo">
<img src="eMAKER.png" alt="eMAKER logo" /> <img src="eMAKER.png" alt="eMAKER" />
</div> </div>
<div class="col 6"> <div class="col 6">
<h5>Printer Climate Control</h5> <h5>Oven control</h5>
</div>
</div>
<!-- Data tabs row -->
<div class="row">
<div class="card blue-grey darken-1 z-depth-3">
<div class="card-tabs">
<ul class="tabs tabs-transparent">
<li class="tab col s3"><a href="#tabTemp">Temperature control</a>
</li>
<li class="tab col s3"><a href="#tabPID">Edit PID</a>
</li>
</ul>
</div>
<div class="card-content blue-grey darken-1">
<div id="tabTemp" class="active">
<div class="row">
<div class="input-field col s3">
<input disabled id="tempinfo" type="number" value="-1" />
<label for="tempinfo">Temperature</label>
</div>
<div class="input-field col s3">
<input disabled id="targetinfo" type="number" value="-1" />
<label for="targetinfo">Target</label>
</div>
<div class="input-field col s3">
<input disabled id="powerinfo" type="number" value="-1" />
<label for="powerinfo">Power</label>
</div>
</div>
<div class="row">
<div class="input-field col s3">
<input type="number" name="Target" id="target" />
<label for="target">Target:</label>
</div>
<div class="row">
<div class="valign-wrapper">
<h5><a class="waves-effect waves-light btn" id="btnTarget" onclick="setTarget()">Set</a></h5>
</div>
</div>
</div>
</div>
<div id="tabPID">
<div class="row">
<div class="input-field col s3">
<input type="number" name="Kp" id="kp" />
<label for="kp">Kp:</label>
</div>
<div class="input-field col s3">
<input type="number" name="Ki" id="ki" />
<label for="ki">Ki:</label>
</div>
<div class="input-field col s3">
<label for="kd">Kd:</label>
<input type="number" name="Kd" id="kd" />
</div>
</div>
<div class="row">
<div class="valign-wrapper">
<h5><a class="waves-effect waves-light btn" id="btnPID" onclick="setPID()">Submit</a></h5>
</div>
</div>
</div>
</div>
</div> </div>
</div> </div>
<!-- Data row--> <!-- Graph row -->
<div class="row"> <div class="row">
<div class="card"> <div class="card blue-grey darken-1 z-depth-3">
<div class="card-content"> <div class="card-content white-text chart-container">
<a href="/wifimanager.html">WiFi</a> <canvas id="myChart"></canvas>
</div> </div>
<div class="card-action">
<div class="row">
<div class="input-field col s3">
<input type="number" name="Xmax" id="xmax" />
<label for="Xmax">Set overall time</label>
</div>
<div class="valign-wrapper col s3">
<h5><a class="waves-effect waves-light btn tooltipped" data-position="bottom" data-tooltip="Set time period." id="btnXmax" onclick="setXmax()">Set</a></h5>
</div>
<div class="col s6">
<div class="center-align">
<h5><a class="teal waves-effect waves-light btn tooltipped" data-position="bottom" data-tooltip="Run temperature profile." id="btnRunProfile" onclick="runProfile()">Run</a></h5>
</div>
</div>
</div>
</div>
</div>
</div> </div>
<!-- Footer row -->
<div class="row">
ESP32
</div> </div>
</div> </div>
<script type="text/javascript" src="js/materialize.min.js"></script> <script type="text/javascript" src="js/materialize.min.js"></script>
+985
View File
@@ -0,0 +1,985 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<link rel="dns-prefetch" href="https://assets-cdn.github.com">
<link rel="dns-prefetch" href="https://avatars0.githubusercontent.com">
<link rel="dns-prefetch" href="https://avatars1.githubusercontent.com">
<link rel="dns-prefetch" href="https://avatars2.githubusercontent.com">
<link rel="dns-prefetch" href="https://avatars3.githubusercontent.com">
<link rel="dns-prefetch" href="https://github-cloud.s3.amazonaws.com">
<link rel="dns-prefetch" href="https://user-images.githubusercontent.com/">
<link crossorigin="anonymous" media="all" integrity="sha512-lLo2nlsdl+bHLu6PGvC2j3wfP45RnK4wKQLiPnCDcuXfU38AiD+JCdMywnF3WbJC1jaxe3lAI6AM4uJuMFBLEw==" rel="stylesheet" href="https://assets-cdn.github.com/assets/frameworks-08fc49d3bd2694c870ea23d0906f3610.css" />
<link crossorigin="anonymous" media="all" integrity="sha512-4bsutQdbWE5qcKS0bskmuRIZDiHn+kQ8XqWrj5TJLo8uttYTDt5Onp7bxAvepa2WAJl+tAtFzRgWnykPJ3zrhw==" rel="stylesheet" href="https://assets-cdn.github.com/assets/github-305db19fc42a0e30f095f7098e1b21a5.css" />
<meta name="viewport" content="width=device-width">
<title>chartjs-plugin-dragData/chartjs-plugin-dragData.min.js at master · chrispahm/chartjs-plugin-dragData</title>
<meta name="description" content="Draggable data points plugin for Chart.js. Contribute to chrispahm/chartjs-plugin-dragData development by creating an account on GitHub.">
<link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="GitHub">
<link rel="fluid-icon" href="https://github.com/fluidicon.png" title="GitHub">
<meta property="fb:app_id" content="1401488693436528">
<meta property="og:image" content="https://avatars3.githubusercontent.com/u/20703207?s=400&amp;v=4" /><meta property="og:site_name" content="GitHub" /><meta property="og:type" content="object" /><meta property="og:title" content="chrispahm/chartjs-plugin-dragData" /><meta property="og:url" content="https://github.com/chrispahm/chartjs-plugin-dragData" /><meta property="og:description" content="Draggable data points plugin for Chart.js. Contribute to chrispahm/chartjs-plugin-dragData development by creating an account on GitHub." />
<link rel="assets" href="https://assets-cdn.github.com/">
<link rel="web-socket" href="wss://live.github.com/_sockets/VjI6MzAyMTM1MTQyOjgzNDMwNzdmOTFlMTI1NTYyMDAyNzVhMmRkODUyMWZlYTFlZjM3ZjRhODdiZTc0MDRhYTE5YWY0YTJmMjg3ZGU=--a01de6b7de7414d847b0e3c0ac1554ff09371108">
<meta name="pjax-timeout" content="1000">
<link rel="sudo-modal" href="/sessions/sudo_modal">
<meta name="request-id" content="A2C8:59A8:581F51D:A16BDC4:5C090319" data-pjax-transient>
<meta name="selected-link" value="repo_source" data-pjax-transient>
<meta name="google-site-verification" content="KT5gs8h0wvaagLKAVWq8bbeNwnZZK1r1XQysX3xurLU">
<meta name="google-site-verification" content="ZzhVyEFwb7w3e0-uOTltm8Jsck2F5StVihD0exw2fsA">
<meta name="google-site-verification" content="GXs5KoUUkNCoaAZn7wPN-t01Pywp9M3sEjnt_3_ZWPc">
<meta name="octolytics-host" content="collector.githubapp.com" /><meta name="octolytics-app-id" content="github" /><meta name="octolytics-event-url" content="https://collector.githubapp.com/github-external/browser_event" /><meta name="octolytics-dimension-request_id" content="A2C8:59A8:581F51D:A16BDC4:5C090319" /><meta name="octolytics-dimension-region_edge" content="iad" /><meta name="octolytics-dimension-region_render" content="iad" /><meta name="octolytics-actor-id" content="353316" /><meta name="octolytics-actor-login" content="jmgiacalone" /><meta name="octolytics-actor-hash" content="9dff4d9dd9df5ba25f62548e0c475a7dadc47af82d33245bca30b14645a1da31" />
<meta name="analytics-location" content="/&lt;user-name&gt;/&lt;repo-name&gt;/blob/show" data-pjax-transient="true" />
<meta name="google-analytics" content="UA-3769691-2">
<meta class="js-ga-set" name="userId" content="ced5d7e119eee542cf37fa77e52ce77a" %>
<meta class="js-ga-set" name="dimension1" content="Logged In">
<meta name="hostname" content="github.com">
<meta name="user-login" content="jmgiacalone">
<meta name="expected-hostname" content="github.com">
<meta name="js-proxy-site-detection-payload" content="ZDQyYzBlNDBmOGJmZGQ0MDc2ODk2ZTUyYmRkYmE0OTcwYWE1YzY4YTNjNjgxNDJlMmMzMWY1YjI4NTgyYzdhNHx7InJlbW90ZV9hZGRyZXNzIjoiOTAuMjUzLjE0NS4xMzIiLCJyZXF1ZXN0X2lkIjoiQTJDODo1OUE4OjU4MUY1MUQ6QTE2QkRDNDo1QzA5MDMxOSIsInRpbWVzdGFtcCI6MTU0NDA5NDQ5MCwiaG9zdCI6ImdpdGh1Yi5jb20ifQ==">
<meta name="enabled-features" content="DASHBOARD_V2_LAYOUT,DASHBOARD_V2_LAYOUT_OPT_IN,EXPLORE_DISCOVER_REPOSITORIES,UNIVERSE_BANNER,MARKETPLACE_PLAN_RESTRICTION_EDITOR,NOTIFY_ON_BLOCK,TIMELINE_COMMENT_UPDATES,ISSUE_TEMPLATES_PIONEER,RELATED_ISSUES,MARKETPLACE_INSIGHTS_V2">
<meta name="html-safe-nonce" content="71bf3c346ef06e2d8e4ed3c84f7cfb657deb6ea0">
<meta http-equiv="x-pjax-version" content="35976fc262c7c0487ce907894d83cf5d">
<link href="https://github.com/chrispahm/chartjs-plugin-dragData/commits/master.atom" rel="alternate" title="Recent Commits to chartjs-plugin-dragData:master" type="application/atom+xml">
<meta name="go-import" content="github.com/chrispahm/chartjs-plugin-dragData git https://github.com/chrispahm/chartjs-plugin-dragData.git">
<meta name="octolytics-dimension-user_id" content="20703207" /><meta name="octolytics-dimension-user_login" content="chrispahm" /><meta name="octolytics-dimension-repository_id" content="115925271" /><meta name="octolytics-dimension-repository_nwo" content="chrispahm/chartjs-plugin-dragData" /><meta name="octolytics-dimension-repository_public" content="true" /><meta name="octolytics-dimension-repository_is_fork" content="false" /><meta name="octolytics-dimension-repository_network_root_id" content="115925271" /><meta name="octolytics-dimension-repository_network_root_nwo" content="chrispahm/chartjs-plugin-dragData" /><meta name="octolytics-dimension-repository_explore_github_marketplace_ci_cta_shown" content="false" />
<link rel="canonical" href="https://github.com/chrispahm/chartjs-plugin-dragData/blob/master/dist/chartjs-plugin-dragData.min.js" data-pjax-transient>
<meta name="browser-stats-url" content="https://api.github.com/_private/browser/stats">
<meta name="browser-errors-url" content="https://api.github.com/_private/browser/errors">
<link rel="mask-icon" href="https://assets-cdn.github.com/pinned-octocat.svg" color="#000000">
<link rel="icon" type="image/x-icon" class="js-site-favicon" href="https://assets-cdn.github.com/favicon.ico">
<meta name="theme-color" content="#1e2327">
<meta name="u2f-support" content="true">
<link rel="manifest" href="/manifest.json" crossOrigin="use-credentials">
</head>
<body class="logged-in env-production page-blob">
<div class="position-relative js-header-wrapper ">
<a href="#start-of-content" tabindex="1" class="p-3 bg-blue text-white show-on-focus js-skip-to-content">Skip to content</a>
<div id="js-pjax-loader-bar" class="pjax-loader-bar"><div class="progress"></div></div>
<header class="Header f5" role="banner">
<div class="d-flex flex-justify-between px-3 ">
<div class="d-flex flex-justify-between ">
<div class="">
<a class="header-logo-invertocat" href="https://github.com/" data-hotkey="g d" aria-label="Homepage" data-ga-click="Header, go to dashboard, icon:logo">
<svg height="32" class="octicon octicon-mark-github" viewBox="0 0 16 16" version="1.1" width="32" aria-hidden="true"><path fill-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8z"/></svg>
</a>
</div>
</div>
<div class="HeaderMenu d-flex flex-justify-between flex-auto">
<nav class="d-flex" aria-label="Global">
<div class="">
<div class="header-search scoped-search site-scoped-search js-site-search position-relative js-jump-to"
role="combobox"
aria-owns="jump-to-results"
aria-label="Search or jump to"
aria-haspopup="listbox"
aria-expanded="false"
>
<div class="position-relative">
<!-- '"` --><!-- </textarea></xmp> --></option></form><form class="js-site-search-form" data-scope-type="Repository" data-scope-id="115925271" data-scoped-search-url="/chrispahm/chartjs-plugin-dragData/search" data-unscoped-search-url="/search" action="/chrispahm/chartjs-plugin-dragData/search" accept-charset="UTF-8" method="get"><input name="utf8" type="hidden" value="&#x2713;" />
<label class="form-control header-search-wrapper header-search-wrapper-jump-to position-relative d-flex flex-justify-between flex-items-center js-chromeless-input-container">
<input type="text"
class="form-control header-search-input jump-to-field js-jump-to-field js-site-search-focus js-site-search-field is-clearable"
data-hotkey="s,/"
name="q"
value=""
placeholder="Search or jump to…"
data-unscoped-placeholder="Search or jump to…"
data-scoped-placeholder="Search or jump to…"
autocapitalize="off"
aria-autocomplete="list"
aria-controls="jump-to-results"
aria-label="Search or jump to…"
data-jump-to-suggestions-path="/_graphql/GetSuggestedNavigationDestinations#csrf-token=iIVPHPo5ktr/73npGna6sZKhk6fBY7/ywOx90aVi9lmYdYeRCGmiEej6N0Kiy4EVlVpQ6YRArddXQ78c2+Ry7Q=="
spellcheck="false"
autocomplete="off"
>
<input type="hidden" class="js-site-search-type-field" name="type" >
<img src="https://assets-cdn.github.com/images/search-key-slash.svg" alt="" class="mr-2 header-search-key-slash">
<div class="Box position-absolute overflow-hidden d-none jump-to-suggestions js-jump-to-suggestions-container">
<ul class="d-none js-jump-to-suggestions-template-container">
<li class="d-flex flex-justify-start flex-items-center p-0 f5 navigation-item js-navigation-item js-jump-to-suggestion" role="option">
<a tabindex="-1" class="no-underline d-flex flex-auto flex-items-center jump-to-suggestions-path js-jump-to-suggestion-path js-navigation-open p-2" href="">
<div class="jump-to-octicon js-jump-to-octicon flex-shrink-0 mr-2 text-center d-none">
<svg height="16" width="16" class="octicon octicon-repo flex-shrink-0 js-jump-to-octicon-repo d-none" title="Repository" aria-label="Repository" viewBox="0 0 12 16" version="1.1" role="img"><path fill-rule="evenodd" d="M4 9H3V8h1v1zm0-3H3v1h1V6zm0-2H3v1h1V4zm0-2H3v1h1V2zm8-1v12c0 .55-.45 1-1 1H6v2l-1.5-1.5L3 16v-2H1c-.55 0-1-.45-1-1V1c0-.55.45-1 1-1h10c.55 0 1 .45 1 1zm-1 10H1v2h2v-1h3v1h5v-2zm0-10H2v9h9V1z"/></svg>
<svg height="16" width="16" class="octicon octicon-project flex-shrink-0 js-jump-to-octicon-project d-none" title="Project" aria-label="Project" viewBox="0 0 15 16" version="1.1" role="img"><path fill-rule="evenodd" d="M10 12h3V2h-3v10zm-4-2h3V2H6v8zm-4 4h3V2H2v12zm-1 1h13V1H1v14zM14 0H1a1 1 0 0 0-1 1v14a1 1 0 0 0 1 1h13a1 1 0 0 0 1-1V1a1 1 0 0 0-1-1z"/></svg>
<svg height="16" width="16" class="octicon octicon-search flex-shrink-0 js-jump-to-octicon-search d-none" title="Search" aria-label="Search" viewBox="0 0 16 16" version="1.1" role="img"><path fill-rule="evenodd" d="M15.7 13.3l-3.81-3.83A5.93 5.93 0 0 0 13 6c0-3.31-2.69-6-6-6S1 2.69 1 6s2.69 6 6 6c1.3 0 2.48-.41 3.47-1.11l3.83 3.81c.19.2.45.3.7.3.25 0 .52-.09.7-.3a.996.996 0 0 0 0-1.41v.01zM7 10.7c-2.59 0-4.7-2.11-4.7-4.7 0-2.59 2.11-4.7 4.7-4.7 2.59 0 4.7 2.11 4.7 4.7 0 2.59-2.11 4.7-4.7 4.7z"/></svg>
</div>
<img class="avatar mr-2 flex-shrink-0 js-jump-to-suggestion-avatar d-none" alt="" aria-label="Team" src="" width="28" height="28">
<div class="jump-to-suggestion-name js-jump-to-suggestion-name flex-auto overflow-hidden text-left no-wrap css-truncate css-truncate-target">
</div>
<div class="border rounded-1 flex-shrink-0 bg-gray px-1 text-gray-light ml-1 f6 d-none js-jump-to-badge-search">
<span class="js-jump-to-badge-search-text-default d-none" aria-label="in this repository">
In this repository
</span>
<span class="js-jump-to-badge-search-text-global d-none" aria-label="in all of GitHub">
All GitHub
</span>
<span aria-hidden="true" class="d-inline-block ml-1 v-align-middle">↵</span>
</div>
<div aria-hidden="true" class="border rounded-1 flex-shrink-0 bg-gray px-1 text-gray-light ml-1 f6 d-none d-on-nav-focus js-jump-to-badge-jump">
Jump to
<span class="d-inline-block ml-1 v-align-middle">↵</span>
</div>
</a>
</li>
</ul>
<ul class="d-none js-jump-to-no-results-template-container">
<li class="d-flex flex-justify-center flex-items-center f5 d-none js-jump-to-suggestion p-2">
<span class="text-gray">No suggested jump to results</span>
</li>
</ul>
<ul id="jump-to-results" role="listbox" class="p-0 m-0 js-navigation-container jump-to-suggestions-results-container js-jump-to-suggestions-results-container">
<li class="d-flex flex-justify-start flex-items-center p-0 f5 navigation-item js-navigation-item js-jump-to-scoped-search d-none" role="option">
<a tabindex="-1" class="no-underline d-flex flex-auto flex-items-center jump-to-suggestions-path js-jump-to-suggestion-path js-navigation-open p-2" href="">
<div class="jump-to-octicon js-jump-to-octicon flex-shrink-0 mr-2 text-center d-none">
<svg height="16" width="16" class="octicon octicon-repo flex-shrink-0 js-jump-to-octicon-repo d-none" title="Repository" aria-label="Repository" viewBox="0 0 12 16" version="1.1" role="img"><path fill-rule="evenodd" d="M4 9H3V8h1v1zm0-3H3v1h1V6zm0-2H3v1h1V4zm0-2H3v1h1V2zm8-1v12c0 .55-.45 1-1 1H6v2l-1.5-1.5L3 16v-2H1c-.55 0-1-.45-1-1V1c0-.55.45-1 1-1h10c.55 0 1 .45 1 1zm-1 10H1v2h2v-1h3v1h5v-2zm0-10H2v9h9V1z"/></svg>
<svg height="16" width="16" class="octicon octicon-project flex-shrink-0 js-jump-to-octicon-project d-none" title="Project" aria-label="Project" viewBox="0 0 15 16" version="1.1" role="img"><path fill-rule="evenodd" d="M10 12h3V2h-3v10zm-4-2h3V2H6v8zm-4 4h3V2H2v12zm-1 1h13V1H1v14zM14 0H1a1 1 0 0 0-1 1v14a1 1 0 0 0 1 1h13a1 1 0 0 0 1-1V1a1 1 0 0 0-1-1z"/></svg>
<svg height="16" width="16" class="octicon octicon-search flex-shrink-0 js-jump-to-octicon-search d-none" title="Search" aria-label="Search" viewBox="0 0 16 16" version="1.1" role="img"><path fill-rule="evenodd" d="M15.7 13.3l-3.81-3.83A5.93 5.93 0 0 0 13 6c0-3.31-2.69-6-6-6S1 2.69 1 6s2.69 6 6 6c1.3 0 2.48-.41 3.47-1.11l3.83 3.81c.19.2.45.3.7.3.25 0 .52-.09.7-.3a.996.996 0 0 0 0-1.41v.01zM7 10.7c-2.59 0-4.7-2.11-4.7-4.7 0-2.59 2.11-4.7 4.7-4.7 2.59 0 4.7 2.11 4.7 4.7 0 2.59-2.11 4.7-4.7 4.7z"/></svg>
</div>
<img class="avatar mr-2 flex-shrink-0 js-jump-to-suggestion-avatar d-none" alt="" aria-label="Team" src="" width="28" height="28">
<div class="jump-to-suggestion-name js-jump-to-suggestion-name flex-auto overflow-hidden text-left no-wrap css-truncate css-truncate-target">
</div>
<div class="border rounded-1 flex-shrink-0 bg-gray px-1 text-gray-light ml-1 f6 d-none js-jump-to-badge-search">
<span class="js-jump-to-badge-search-text-default d-none" aria-label="in this repository">
In this repository
</span>
<span class="js-jump-to-badge-search-text-global d-none" aria-label="in all of GitHub">
All GitHub
</span>
<span aria-hidden="true" class="d-inline-block ml-1 v-align-middle">↵</span>
</div>
<div aria-hidden="true" class="border rounded-1 flex-shrink-0 bg-gray px-1 text-gray-light ml-1 f6 d-none d-on-nav-focus js-jump-to-badge-jump">
Jump to
<span class="d-inline-block ml-1 v-align-middle">↵</span>
</div>
</a>
</li>
<li class="d-flex flex-justify-start flex-items-center p-0 f5 navigation-item js-navigation-item js-jump-to-global-search d-none" role="option">
<a tabindex="-1" class="no-underline d-flex flex-auto flex-items-center jump-to-suggestions-path js-jump-to-suggestion-path js-navigation-open p-2" href="">
<div class="jump-to-octicon js-jump-to-octicon flex-shrink-0 mr-2 text-center d-none">
<svg height="16" width="16" class="octicon octicon-repo flex-shrink-0 js-jump-to-octicon-repo d-none" title="Repository" aria-label="Repository" viewBox="0 0 12 16" version="1.1" role="img"><path fill-rule="evenodd" d="M4 9H3V8h1v1zm0-3H3v1h1V6zm0-2H3v1h1V4zm0-2H3v1h1V2zm8-1v12c0 .55-.45 1-1 1H6v2l-1.5-1.5L3 16v-2H1c-.55 0-1-.45-1-1V1c0-.55.45-1 1-1h10c.55 0 1 .45 1 1zm-1 10H1v2h2v-1h3v1h5v-2zm0-10H2v9h9V1z"/></svg>
<svg height="16" width="16" class="octicon octicon-project flex-shrink-0 js-jump-to-octicon-project d-none" title="Project" aria-label="Project" viewBox="0 0 15 16" version="1.1" role="img"><path fill-rule="evenodd" d="M10 12h3V2h-3v10zm-4-2h3V2H6v8zm-4 4h3V2H2v12zm-1 1h13V1H1v14zM14 0H1a1 1 0 0 0-1 1v14a1 1 0 0 0 1 1h13a1 1 0 0 0 1-1V1a1 1 0 0 0-1-1z"/></svg>
<svg height="16" width="16" class="octicon octicon-search flex-shrink-0 js-jump-to-octicon-search d-none" title="Search" aria-label="Search" viewBox="0 0 16 16" version="1.1" role="img"><path fill-rule="evenodd" d="M15.7 13.3l-3.81-3.83A5.93 5.93 0 0 0 13 6c0-3.31-2.69-6-6-6S1 2.69 1 6s2.69 6 6 6c1.3 0 2.48-.41 3.47-1.11l3.83 3.81c.19.2.45.3.7.3.25 0 .52-.09.7-.3a.996.996 0 0 0 0-1.41v.01zM7 10.7c-2.59 0-4.7-2.11-4.7-4.7 0-2.59 2.11-4.7 4.7-4.7 2.59 0 4.7 2.11 4.7 4.7 0 2.59-2.11 4.7-4.7 4.7z"/></svg>
</div>
<img class="avatar mr-2 flex-shrink-0 js-jump-to-suggestion-avatar d-none" alt="" aria-label="Team" src="" width="28" height="28">
<div class="jump-to-suggestion-name js-jump-to-suggestion-name flex-auto overflow-hidden text-left no-wrap css-truncate css-truncate-target">
</div>
<div class="border rounded-1 flex-shrink-0 bg-gray px-1 text-gray-light ml-1 f6 d-none js-jump-to-badge-search">
<span class="js-jump-to-badge-search-text-default d-none" aria-label="in this repository">
In this repository
</span>
<span class="js-jump-to-badge-search-text-global d-none" aria-label="in all of GitHub">
All GitHub
</span>
<span aria-hidden="true" class="d-inline-block ml-1 v-align-middle">↵</span>
</div>
<div aria-hidden="true" class="border rounded-1 flex-shrink-0 bg-gray px-1 text-gray-light ml-1 f6 d-none d-on-nav-focus js-jump-to-badge-jump">
Jump to
<span class="d-inline-block ml-1 v-align-middle">↵</span>
</div>
</a>
</li>
<li class="d-flex flex-justify-center flex-items-center p-0 f5 js-jump-to-suggestion">
<img src="https://assets-cdn.github.com/images/spinners/octocat-spinner-128.gif" alt="Octocat Spinner Icon" class="m-2" width="28">
</li>
</ul>
</div>
</label>
</form> </div>
</div>
</div>
<ul class="d-flex pl-2 flex-items-center text-bold list-style-none">
<li>
<a class="js-selected-navigation-item HeaderNavlink px-2" data-hotkey="g p" data-ga-click="Header, click, Nav menu - item:pulls context:user" aria-label="Pull requests you created" data-selected-links="/pulls /pulls/assigned /pulls/mentioned /pulls" href="/pulls">
Pull requests
</a> </li>
<li>
<a class="js-selected-navigation-item HeaderNavlink px-2" data-hotkey="g i" data-ga-click="Header, click, Nav menu - item:issues context:user" aria-label="Issues you created" data-selected-links="/issues /issues/assigned /issues/mentioned /issues" href="/issues">
Issues
</a> </li>
<li class="position-relative">
<a class="js-selected-navigation-item HeaderNavlink px-2" data-ga-click="Header, click, Nav menu - item:marketplace context:user" data-octo-click="marketplace_click" data-octo-dimensions="location:nav_bar" data-selected-links=" /marketplace" href="/marketplace">
Marketplace
</a>
</li>
<li>
<a class="js-selected-navigation-item HeaderNavlink px-2" data-ga-click="Header, click, Nav menu - item:explore" data-selected-links="/explore /trending /trending/developers /integrations /integrations/feature/code /integrations/feature/collaborate /integrations/feature/ship showcases showcases_search showcases_landing /explore" href="/explore">
Explore
</a> </li>
</ul>
</nav>
<div class="d-flex">
<ul class="user-nav d-flex flex-items-center list-style-none" id="user-links">
<li class="dropdown">
<span class="d-inline-block px-2">
<a aria-label="You have unread notifications" class="notification-indicator tooltipped tooltipped-s js-socket-channel js-notification-indicator" data-hotkey="g n" data-ga-click="Header, go to notifications, icon:unread" data-channel="notification-changed:353316" href="/notifications">
<span class="mail-status unread"></span>
<svg class="octicon octicon-bell" viewBox="0 0 14 16" version="1.1" width="14" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M14 12v1H0v-1l.73-.58c.77-.77.81-2.55 1.19-4.42C2.69 3.23 6 2 6 2c0-.55.45-1 1-1s1 .45 1 1c0 0 3.39 1.23 4.16 5 .38 1.88.42 3.66 1.19 4.42l.66.58H14zm-7 4c1.11 0 2-.89 2-2H5c0 1.11.89 2 2 2z"/></svg>
</a>
</span>
</li>
<li class="dropdown">
<details class="details-overlay details-reset d-flex px-2 flex-items-center">
<summary class="HeaderNavlink"
aria-label="Create new…"
data-ga-click="Header, create new, icon:add">
<svg class="octicon octicon-plus float-left mr-1 mt-1" viewBox="0 0 12 16" version="1.1" width="12" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M12 9H7v5H5V9H0V7h5V2h2v5h5v2z"/></svg>
<span class="dropdown-caret mt-1"></span>
</summary>
<details-menu class="dropdown-menu dropdown-menu-sw">
<a role="menuitem" class="dropdown-item" href="/new" data-ga-click="Header, create new repository">
New repository
</a>
<a role="menuitem" class="dropdown-item" href="/new/import" data-ga-click="Header, import a repository">
Import repository
</a>
<a role="menuitem" class="dropdown-item" href="https://gist.github.com/" data-ga-click="Header, create new gist">
New gist
</a>
<a role="menuitem" class="dropdown-item" href="/organizations/new" data-ga-click="Header, create new organization">
New organization
</a>
<div class="dropdown-divider"></div>
<div class="dropdown-header">
<span title="chrispahm/chartjs-plugin-dragData">This repository</span>
</div>
<a role="menuitem" class="dropdown-item" href="/chrispahm/chartjs-plugin-dragData/issues/new" data-ga-click="Header, create new issue">
New issue
</a>
</details-menu>
</details>
</li>
<li class="dropdown">
<details class="details-overlay details-reset d-flex pl-2 flex-items-center">
<summary class="HeaderNavlink name mt-1"
aria-label="View profile and more"
data-ga-click="Header, show menu, icon:avatar">
<img alt="@jmgiacalone" class="avatar float-left mr-1" src="https://avatars2.githubusercontent.com/u/353316?s=40&amp;v=4" height="20" width="20">
<span class="dropdown-caret"></span>
</summary>
<details-menu class="dropdown-menu dropdown-menu-sw">
<ul>
<li class="header-nav-current-user css-truncate"><a role="menuitem" class="no-underline user-profile-link px-3 pt-2 pb-2 mb-n2 mt-n1 d-block" href="/jmgiacalone" data-ga-click="Header, go to profile, text:Signed in as">Signed in as <strong class="css-truncate-target">jmgiacalone</strong></a></li>
<li class="dropdown-divider"></li>
<li><a role="menuitem" class="dropdown-item" href="/jmgiacalone" data-ga-click="Header, go to profile, text:your profile">Your profile</a></li>
<li><a role="menuitem" class="dropdown-item" href="/jmgiacalone?tab=repositories" data-ga-click="Header, go to repositories, text:your repositories">Your repositories</a></li>
<li><a role="menuitem" class="dropdown-item" href="/jmgiacalone?tab=stars" data-ga-click="Header, go to starred repos, text:your stars">Your stars</a></li>
<li><a role="menuitem" class="dropdown-item" href="https://gist.github.com/" data-ga-click="Header, your gists, text:your gists">Your gists</a></li>
<li class="dropdown-divider"></li>
<li><a role="menuitem" class="dropdown-item" href="https://help.github.com" data-ga-click="Header, go to help, text:help">Help</a></li>
<li><a role="menuitem" class="dropdown-item" href="/settings/profile" data-ga-click="Header, go to settings, icon:settings">Settings</a></li>
<li>
<!-- '"` --><!-- </textarea></xmp> --></option></form><form class="logout-form" action="/logout" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="&#x2713;" /><input type="hidden" name="authenticity_token" value="Dvo5KvvMbZKWObcDKWP0zDKPg53ZddYuWhjIJUA0lTXnP+gnAha1sLAMKm+/SW1bLYYhAUfbo5EaElXUX0uO8w==" />
<button type="submit" class="dropdown-item dropdown-signout" data-ga-click="Header, sign out, icon:logout" role="menuitem">
Sign out
</button>
</form> </li>
</ul>
</details-menu>
</details>
</li>
</ul>
<!-- '"` --><!-- </textarea></xmp> --></option></form><form class="sr-only right-0" action="/logout" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="&#x2713;" /><input type="hidden" name="authenticity_token" value="PB6BY424Xbzrszb25esDzlUvfeiqi0ZnRvQjmLbkIwnV21BudGKFns2Gq5pzwZpZSibfdDQlM9gG/r5pqZs4zw==" />
<button type="submit" class="dropdown-item dropdown-signout" data-ga-click="Header, sign out, icon:logout">
Sign out
</button>
</form> </div>
</div>
</div>
</header>
</div>
<div id="start-of-content" class="show-on-focus"></div>
<div id="js-flash-container">
</div>
<div role="main" class="application-main " data-commit-hovercards-enabled>
<div itemscope itemtype="http://schema.org/SoftwareSourceCode" class="">
<div id="js-repo-pjax-container" data-pjax-container >
<div class="pagehead repohead instapaper_ignore readability-menu experiment-repo-nav ">
<div class="repohead-details-container clearfix container">
<ul class="pagehead-actions">
<li>
<!-- '"` --><!-- </textarea></xmp> --></option></form><form data-remote="true" class="js-social-form js-social-container" action="/notifications/subscribe" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="&#x2713;" /><input type="hidden" name="authenticity_token" value="dVWze9JDQHMeSNkXQMwixU8Inswmh5JyOfIgFpeCMdaCW+6KD0ib5kNhbqf/vITuZzNYCYbe8H6vukb+oe4ElQ==" /> <input type="hidden" name="repository_id" id="repository_id" value="115925271" class="form-control" />
<details class="details-reset details-overlay select-menu float-left">
<summary class="btn btn-sm btn-with-count select-menu-button" data-ga-click="Repository, click Watch settings, action:blob#show">
<span data-menu-button>
<svg class="octicon octicon-eye v-align-text-bottom" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M8.06 2C3 2 0 8 0 8s3 6 8.06 6C13 14 16 8 16 8s-3-6-7.94-6zM8 12c-2.2 0-4-1.78-4-4 0-2.2 1.8-4 4-4 2.22 0 4 1.8 4 4 0 2.22-1.78 4-4 4zm2-4c0 1.11-.89 2-2 2-1.11 0-2-.89-2-2 0-1.11.89-2 2-2 1.11 0 2 .89 2 2z"/></svg>
Watch
</span>
</summary>
<details-menu class="select-menu-modal position-absolute mt-5" style="z-index: 99;">
<div class="select-menu-header">
<span class="select-menu-title">Notifications</span>
</div>
<div class="select-menu-list">
<button type="submit" name="do" value="included" class="select-menu-item width-full" aria-checked="true" role="menuitemradio">
<svg class="octicon octicon-check select-menu-item-icon" viewBox="0 0 12 16" version="1.1" width="12" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M12 5l-8 8-4-4 1.5-1.5L4 10l6.5-6.5L12 5z"/></svg>
<div class="select-menu-item-text">
<span class="select-menu-item-heading">Not watching</span>
<span class="description">Be notified only when participating or @mentioned.</span>
<span class="hidden-select-button-text" data-menu-button-contents>
<svg class="octicon octicon-eye v-align-text-bottom" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M8.06 2C3 2 0 8 0 8s3 6 8.06 6C13 14 16 8 16 8s-3-6-7.94-6zM8 12c-2.2 0-4-1.78-4-4 0-2.2 1.8-4 4-4 2.22 0 4 1.8 4 4 0 2.22-1.78 4-4 4zm2-4c0 1.11-.89 2-2 2-1.11 0-2-.89-2-2 0-1.11.89-2 2-2 1.11 0 2 .89 2 2z"/></svg>
Watch
</span>
</div>
</button>
<button type="submit" name="do" value="release_only" class="select-menu-item width-full" aria-checked="false" role="menuitemradio">
<svg class="octicon octicon-check select-menu-item-icon" viewBox="0 0 12 16" version="1.1" width="12" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M12 5l-8 8-4-4 1.5-1.5L4 10l6.5-6.5L12 5z"/></svg>
<div class="select-menu-item-text">
<span class="select-menu-item-heading">Releases only</span>
<span class="description">Be notified of new releases, and when participating or @mentioned.</span>
<span class="hidden-select-button-text" data-menu-button-contents>
<svg class="octicon octicon-eye v-align-text-bottom" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M8.06 2C3 2 0 8 0 8s3 6 8.06 6C13 14 16 8 16 8s-3-6-7.94-6zM8 12c-2.2 0-4-1.78-4-4 0-2.2 1.8-4 4-4 2.22 0 4 1.8 4 4 0 2.22-1.78 4-4 4zm2-4c0 1.11-.89 2-2 2-1.11 0-2-.89-2-2 0-1.11.89-2 2-2 1.11 0 2 .89 2 2z"/></svg>
Unwatch releases
</span>
</div>
</button>
<button type="submit" name="do" value="subscribed" class="select-menu-item width-full" aria-checked="false" role="menuitemradio">
<svg class="octicon octicon-check select-menu-item-icon" viewBox="0 0 12 16" version="1.1" width="12" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M12 5l-8 8-4-4 1.5-1.5L4 10l6.5-6.5L12 5z"/></svg>
<div class="select-menu-item-text">
<span class="select-menu-item-heading">Watching</span>
<span class="description">Be notified of all conversations.</span>
<span class="hidden-select-button-text" data-menu-button-contents>
<svg class="octicon octicon-eye v-align-text-bottom" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M8.06 2C3 2 0 8 0 8s3 6 8.06 6C13 14 16 8 16 8s-3-6-7.94-6zM8 12c-2.2 0-4-1.78-4-4 0-2.2 1.8-4 4-4 2.22 0 4 1.8 4 4 0 2.22-1.78 4-4 4zm2-4c0 1.11-.89 2-2 2-1.11 0-2-.89-2-2 0-1.11.89-2 2-2 1.11 0 2 .89 2 2z"/></svg>
Unwatch
</span>
</div>
</button>
<button type="submit" name="do" value="ignore" class="select-menu-item width-full" aria-checked="false" role="menuitemradio">
<svg class="octicon octicon-check select-menu-item-icon" viewBox="0 0 12 16" version="1.1" width="12" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M12 5l-8 8-4-4 1.5-1.5L4 10l6.5-6.5L12 5z"/></svg>
<div class="select-menu-item-text">
<span class="select-menu-item-heading">Ignoring</span>
<span class="description">Never be notified.</span>
<span class="hidden-select-button-text" data-menu-button-contents>
<svg class="octicon octicon-mute v-align-text-bottom" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M8 2.81v10.38c0 .67-.81 1-1.28.53L3 10H1c-.55 0-1-.45-1-1V7c0-.55.45-1 1-1h2l3.72-3.72C7.19 1.81 8 2.14 8 2.81zm7.53 3.22l-1.06-1.06-1.97 1.97-1.97-1.97-1.06 1.06L11.44 8 9.47 9.97l1.06 1.06 1.97-1.97 1.97 1.97 1.06-1.06L13.56 8l1.97-1.97z"/></svg>
Stop ignoring
</span>
</div>
</button>
</div>
</details-menu>
</details>
<a class="social-count js-social-count"
href="/chrispahm/chartjs-plugin-dragData/watchers"
aria-label="2 users are watching this repository">
2
</a>
</form>
</li>
<li>
<div class="js-toggler-container js-social-container starring-container ">
<!-- '"` --><!-- </textarea></xmp> --></option></form><form class="starred js-social-form" action="/chrispahm/chartjs-plugin-dragData/unstar" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="&#x2713;" /><input type="hidden" name="authenticity_token" value="SHDMzOMoQf8/z6b1jC69jHUHVE3UQpY2EBroknmHycvEolSB/jiPfpQ4VGEEck3rxAe3M8r5dO2/zOOVQlEvZg==" />
<input type="hidden" name="context" value="repository"></input>
<button
type="submit"
class="btn btn-sm btn-with-count js-toggler-target"
aria-label="Unstar this repository" title="Unstar chrispahm/chartjs-plugin-dragData"
data-ga-click="Repository, click unstar button, action:blob#show; text:Unstar">
<svg class="octicon octicon-star v-align-text-bottom" viewBox="0 0 14 16" version="1.1" width="14" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M14 6l-4.9-.64L7 1 4.9 5.36 0 6l3.6 3.26L2.67 14 7 11.67 11.33 14l-.93-4.74L14 6z"/></svg>
Unstar
</button>
<a class="social-count js-social-count" href="/chrispahm/chartjs-plugin-dragData/stargazers"
aria-label="26 users starred this repository">
26
</a>
</form>
<!-- '"` --><!-- </textarea></xmp> --></option></form><form class="unstarred js-social-form" action="/chrispahm/chartjs-plugin-dragData/star" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="&#x2713;" /><input type="hidden" name="authenticity_token" value="3RZqt4St4J8F0H/Pz6dBXGuLg2tCOWACL3I476WS7EYVNYlL4DtnTy3Xw2ookmKmNLkBbb41ngY4LLGVfBkKPQ==" />
<input type="hidden" name="context" value="repository"></input>
<button
type="submit"
class="btn btn-sm btn-with-count js-toggler-target"
aria-label="Star this repository" title="Star chrispahm/chartjs-plugin-dragData"
data-ga-click="Repository, click star button, action:blob#show; text:Star">
<svg class="octicon octicon-star v-align-text-bottom" viewBox="0 0 14 16" version="1.1" width="14" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M14 6l-4.9-.64L7 1 4.9 5.36 0 6l3.6 3.26L2.67 14 7 11.67 11.33 14l-.93-4.74L14 6z"/></svg>
Star
</button>
<a class="social-count js-social-count" href="/chrispahm/chartjs-plugin-dragData/stargazers"
aria-label="26 users starred this repository">
26
</a>
</form> </div>
</li>
<li>
<!-- '"` --><!-- </textarea></xmp> --></option></form><form class="btn-with-count" action="/chrispahm/chartjs-plugin-dragData/fork" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="&#x2713;" /><input type="hidden" name="authenticity_token" value="L6uDjxVakVO20HMhcKmPbCm5Uz17H6LVU1aeUOh2GBAShBXIr8IT7DRe72KnfXg+G/0BiC3tqtwFFDLNBra2Wg==" />
<button
type="submit"
class="btn btn-sm btn-with-count"
data-ga-click="Repository, show fork modal, action:blob#show; text:Fork"
title="Fork your own copy of chrispahm/chartjs-plugin-dragData to your account"
aria-label="Fork your own copy of chrispahm/chartjs-plugin-dragData to your account">
<svg class="octicon octicon-repo-forked v-align-text-bottom" viewBox="0 0 10 16" version="1.1" width="10" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M8 1a1.993 1.993 0 0 0-1 3.72V6L5 8 3 6V4.72A1.993 1.993 0 0 0 2 1a1.993 1.993 0 0 0-1 3.72V6.5l3 3v1.78A1.993 1.993 0 0 0 5 15a1.993 1.993 0 0 0 1-3.72V9.5l3-3V4.72A1.993 1.993 0 0 0 8 1zM2 4.2C1.34 4.2.8 3.65.8 3c0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2zm3 10c-.66 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2zm3-10c-.66 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2z"/></svg>
Fork
</button>
</form>
<a href="/chrispahm/chartjs-plugin-dragData/network/members" class="social-count"
aria-label="5 users forked this repository">
5
</a>
</li>
</ul>
<h1 class="public ">
<svg class="octicon octicon-repo" viewBox="0 0 12 16" version="1.1" width="12" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M4 9H3V8h1v1zm0-3H3v1h1V6zm0-2H3v1h1V4zm0-2H3v1h1V2zm8-1v12c0 .55-.45 1-1 1H6v2l-1.5-1.5L3 16v-2H1c-.55 0-1-.45-1-1V1c0-.55.45-1 1-1h10c.55 0 1 .45 1 1zm-1 10H1v2h2v-1h3v1h5v-2zm0-10H2v9h9V1z"/></svg>
<span class="author" itemprop="author"><a class="url fn" rel="author" data-hovercard-type="user" data-hovercard-url="/hovercards?user_id=20703207" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="/chrispahm">chrispahm</a></span><!--
--><span class="path-divider">/</span><!--
--><strong itemprop="name"><a data-pjax="#js-repo-pjax-container" href="/chrispahm/chartjs-plugin-dragData">chartjs-plugin-dragData</a></strong>
</h1>
</div>
<nav class="reponav js-repo-nav js-sidenav-container-pjax container"
itemscope
itemtype="http://schema.org/BreadcrumbList"
aria-label="Repository"
data-pjax="#js-repo-pjax-container">
<span itemscope itemtype="http://schema.org/ListItem" itemprop="itemListElement">
<a class="js-selected-navigation-item selected reponav-item" itemprop="url" data-hotkey="g c" aria-current="page" data-selected-links="repo_source repo_downloads repo_commits repo_releases repo_tags repo_branches repo_packages /chrispahm/chartjs-plugin-dragData" href="/chrispahm/chartjs-plugin-dragData">
<svg class="octicon octicon-code" viewBox="0 0 14 16" version="1.1" width="14" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M9.5 3L8 4.5 11.5 8 8 11.5 9.5 13 14 8 9.5 3zm-5 0L0 8l4.5 5L6 11.5 2.5 8 6 4.5 4.5 3z"/></svg>
<span itemprop="name">Code</span>
<meta itemprop="position" content="1">
</a> </span>
<span itemscope itemtype="http://schema.org/ListItem" itemprop="itemListElement">
<a itemprop="url" data-hotkey="g i" class="js-selected-navigation-item reponav-item" data-selected-links="repo_issues repo_labels repo_milestones /chrispahm/chartjs-plugin-dragData/issues" href="/chrispahm/chartjs-plugin-dragData/issues">
<svg class="octicon octicon-issue-opened" viewBox="0 0 14 16" version="1.1" width="14" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"/></svg>
<span itemprop="name">Issues</span>
<span class="Counter">1</span>
<meta itemprop="position" content="2">
</a> </span>
<span itemscope itemtype="http://schema.org/ListItem" itemprop="itemListElement">
<a data-hotkey="g p" itemprop="url" class="js-selected-navigation-item reponav-item" data-selected-links="repo_pulls checks /chrispahm/chartjs-plugin-dragData/pulls" href="/chrispahm/chartjs-plugin-dragData/pulls">
<svg class="octicon octicon-git-pull-request" viewBox="0 0 12 16" version="1.1" width="12" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M11 11.28V5c-.03-.78-.34-1.47-.94-2.06C9.46 2.35 8.78 2.03 8 2H7V0L4 3l3 3V4h1c.27.02.48.11.69.31.21.2.3.42.31.69v6.28A1.993 1.993 0 0 0 10 15a1.993 1.993 0 0 0 1-3.72zm-1 2.92c-.66 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2zM4 3c0-1.11-.89-2-2-2a1.993 1.993 0 0 0-1 3.72v6.56A1.993 1.993 0 0 0 2 15a1.993 1.993 0 0 0 1-3.72V4.72c.59-.34 1-.98 1-1.72zm-.8 10c0 .66-.55 1.2-1.2 1.2-.65 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2zM2 4.2C1.34 4.2.8 3.65.8 3c0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2z"/></svg>
<span itemprop="name">Pull requests</span>
<span class="Counter">1</span>
<meta itemprop="position" content="3">
</a> </span>
<a data-hotkey="g b" class="js-selected-navigation-item reponav-item" data-selected-links="repo_projects new_repo_project repo_project /chrispahm/chartjs-plugin-dragData/projects" href="/chrispahm/chartjs-plugin-dragData/projects">
<svg class="octicon octicon-project" viewBox="0 0 15 16" version="1.1" width="15" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M10 12h3V2h-3v10zm-4-2h3V2H6v8zm-4 4h3V2H2v12zm-1 1h13V1H1v14zM14 0H1a1 1 0 0 0-1 1v14a1 1 0 0 0 1 1h13a1 1 0 0 0 1-1V1a1 1 0 0 0-1-1z"/></svg>
Projects
<span class="Counter" >0</span>
</a>
<a class="js-selected-navigation-item reponav-item" data-hotkey="g w" data-selected-links="repo_wiki /chrispahm/chartjs-plugin-dragData/wiki" href="/chrispahm/chartjs-plugin-dragData/wiki">
<svg class="octicon octicon-book" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M3 5h4v1H3V5zm0 3h4V7H3v1zm0 2h4V9H3v1zm11-5h-4v1h4V5zm0 2h-4v1h4V7zm0 2h-4v1h4V9zm2-6v9c0 .55-.45 1-1 1H9.5l-1 1-1-1H2c-.55 0-1-.45-1-1V3c0-.55.45-1 1-1h5.5l1 1 1-1H15c.55 0 1 .45 1 1zm-8 .5L7.5 3H2v9h6V3.5zm7-.5H9.5l-.5.5V12h6V3z"/></svg>
Wiki
</a>
<a class="js-selected-navigation-item reponav-item" data-selected-links="repo_graphs repo_contributors dependency_graph pulse alerts security /chrispahm/chartjs-plugin-dragData/pulse" href="/chrispahm/chartjs-plugin-dragData/pulse">
<svg class="octicon octicon-graph" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M16 14v1H0V0h1v14h15zM5 13H3V8h2v5zm4 0H7V3h2v10zm4 0h-2V6h2v7z"/></svg>
Insights
</a>
</nav>
</div>
<div class="container new-discussion-timeline experiment-repo-nav ">
<div class="repository-content ">
<a class="d-none js-permalink-shortcut" data-hotkey="y" href="/chrispahm/chartjs-plugin-dragData/blob/dca9453b0a7c31897d3d9b8a96b23582efcddf81/dist/chartjs-plugin-dragData.min.js">Permalink</a>
<!-- blob contrib key: blob_contributors:v21:c34db7f3d7fe528a8f7d81b329dcf681 -->
<div class="file-navigation">
<div class="select-menu branch-select-menu js-menu-container js-select-menu float-left">
<button class=" btn btn-sm select-menu-button js-menu-target css-truncate" data-hotkey="w"
type="button" aria-label="Switch branches or tags" aria-expanded="false" aria-haspopup="true">
<i>Branch:</i>
<span class="js-select-button css-truncate-target">master</span>
</button>
<div class="select-menu-modal-holder js-menu-content js-navigation-container" data-pjax>
<div class="select-menu-modal">
<div class="select-menu-header">
<svg class="octicon octicon-x js-menu-close" role="img" aria-label="Close" viewBox="0 0 12 16" version="1.1" width="12" height="16"><path fill-rule="evenodd" d="M7.48 8l3.75 3.75-1.48 1.48L6 9.48l-3.75 3.75-1.48-1.48L4.52 8 .77 4.25l1.48-1.48L6 6.52l3.75-3.75 1.48 1.48L7.48 8z"/></svg>
<span class="select-menu-title">Switch branches/tags</span>
</div>
<tab-container>
<div class="select-menu-filters">
<div class="select-menu-text-filter">
<input type="text" aria-label="Filter branches/tags" id="context-commitish-filter-field" class="form-control js-filterable-field js-navigation-enable" placeholder="Filter branches/tags">
</div>
<div class="select-menu-tabs" role="tablist">
<ul>
<li class="select-menu-tab">
<button type="button" class="select-menu-tab-nav" data-filter-placeholder="Filter branches/tags" role="tab" aria-selected="true">Branches</button>
</li>
<li class="select-menu-tab">
<button type="button" class="select-menu-tab-nav" data-filter-placeholder="Find a tag…" role="tab">Tags</button>
</li>
</ul>
</div>
</div>
<div class="select-menu-list" role="tabpanel">
<div data-filterable-for="context-commitish-filter-field" data-filterable-type="substring">
<a class="select-menu-item js-navigation-item js-navigation-open selected"
href="/chrispahm/chartjs-plugin-dragData/blob/master/dist/chartjs-plugin-dragData.min.js"
data-name="master"
data-skip-pjax="true"
rel="nofollow">
<svg class="octicon octicon-check select-menu-item-icon" viewBox="0 0 12 16" version="1.1" width="12" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M12 5l-8 8-4-4 1.5-1.5L4 10l6.5-6.5L12 5z"/></svg>
<span class="select-menu-item-text css-truncate-target js-select-menu-filter-text">
master
</span>
</a>
<a class="select-menu-item js-navigation-item js-navigation-open "
href="/chrispahm/chartjs-plugin-dragData/blob/minorFixes/dist/chartjs-plugin-dragData.min.js"
data-name="minorFixes"
data-skip-pjax="true"
rel="nofollow">
<svg class="octicon octicon-check select-menu-item-icon" viewBox="0 0 12 16" version="1.1" width="12" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M12 5l-8 8-4-4 1.5-1.5L4 10l6.5-6.5L12 5z"/></svg>
<span class="select-menu-item-text css-truncate-target js-select-menu-filter-text">
minorFixes
</span>
</a>
<a class="select-menu-item js-navigation-item js-navigation-open "
href="/chrispahm/chartjs-plugin-dragData/blob/radar/dist/chartjs-plugin-dragData.min.js"
data-name="radar"
data-skip-pjax="true"
rel="nofollow">
<svg class="octicon octicon-check select-menu-item-icon" viewBox="0 0 12 16" version="1.1" width="12" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M12 5l-8 8-4-4 1.5-1.5L4 10l6.5-6.5L12 5z"/></svg>
<span class="select-menu-item-text css-truncate-target js-select-menu-filter-text">
radar
</span>
</a>
</div>
<div class="select-menu-no-results">Nothing to show</div>
</div>
<div class="select-menu-list" role="tabpanel" hidden>
<div data-filterable-for="context-commitish-filter-field" data-filterable-type="substring">
<a class="select-menu-item js-navigation-item js-navigation-open "
href="/chrispahm/chartjs-plugin-dragData/tree/v0.0.3/dist/chartjs-plugin-dragData.min.js"
data-name="v0.0.3"
data-skip-pjax="true"
rel="nofollow">
<svg class="octicon octicon-check select-menu-item-icon" viewBox="0 0 12 16" version="1.1" width="12" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M12 5l-8 8-4-4 1.5-1.5L4 10l6.5-6.5L12 5z"/></svg>
<span class="select-menu-item-text css-truncate-target" title="v0.0.3">
v0.0.3
</span>
</a>
<a class="select-menu-item js-navigation-item js-navigation-open "
href="/chrispahm/chartjs-plugin-dragData/tree/v0.0.2/dist/chartjs-plugin-dragData.min.js"
data-name="v0.0.2"
data-skip-pjax="true"
rel="nofollow">
<svg class="octicon octicon-check select-menu-item-icon" viewBox="0 0 12 16" version="1.1" width="12" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M12 5l-8 8-4-4 1.5-1.5L4 10l6.5-6.5L12 5z"/></svg>
<span class="select-menu-item-text css-truncate-target" title="v0.0.2">
v0.0.2
</span>
</a>
<a class="select-menu-item js-navigation-item js-navigation-open "
href="/chrispahm/chartjs-plugin-dragData/tree/0.0.4/dist/chartjs-plugin-dragData.min.js"
data-name="0.0.4"
data-skip-pjax="true"
rel="nofollow">
<svg class="octicon octicon-check select-menu-item-icon" viewBox="0 0 12 16" version="1.1" width="12" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M12 5l-8 8-4-4 1.5-1.5L4 10l6.5-6.5L12 5z"/></svg>
<span class="select-menu-item-text css-truncate-target" title="0.0.4">
0.0.4
</span>
</a>
</div>
<div class="select-menu-no-results">Nothing to show</div>
</div>
</tab-container>
</div>
</div>
</div>
<div class="BtnGroup float-right">
<a href="/chrispahm/chartjs-plugin-dragData/find/master"
class="js-pjax-capture-input btn btn-sm BtnGroup-item"
data-pjax
data-hotkey="t">
Find file
</a>
<clipboard-copy for="blob-path" class="btn btn-sm BtnGroup-item">
Copy path
</clipboard-copy>
</div>
<div id="blob-path" class="breadcrumb">
<span class="repo-root js-repo-root"><span class="js-path-segment"><a data-pjax="true" href="/chrispahm/chartjs-plugin-dragData"><span>chartjs-plugin-dragData</span></a></span></span><span class="separator">/</span><span class="js-path-segment"><a data-pjax="true" href="/chrispahm/chartjs-plugin-dragData/tree/master/dist"><span>dist</span></a></span><span class="separator">/</span><strong class="final-path">chartjs-plugin-dragData.min.js</strong>
</div>
</div>
<include-fragment src="/chrispahm/chartjs-plugin-dragData/contributors/master/dist/chartjs-plugin-dragData.min.js" class="commit-tease commit-loader">
<div>
Fetching contributors&hellip;
</div>
<div class="commit-tease-contributors">
<img alt="" class="loader-loading float-left" src="https://assets-cdn.github.com/images/spinners/octocat-spinner-32-EAF2F5.gif" width="16" height="16" />
<span class="loader-error">Cannot retrieve contributors at this time</span>
</div>
</include-fragment>
<div class="file ">
<div class="file-header">
<div class="file-actions">
<div class="BtnGroup">
<a id="raw-url" class="btn btn-sm BtnGroup-item" href="/chrispahm/chartjs-plugin-dragData/raw/master/dist/chartjs-plugin-dragData.min.js">Raw</a>
<a class="btn btn-sm js-update-url-with-hash BtnGroup-item" data-hotkey="b" href="/chrispahm/chartjs-plugin-dragData/blame/master/dist/chartjs-plugin-dragData.min.js">Blame</a>
<a rel="nofollow" class="btn btn-sm BtnGroup-item" href="/chrispahm/chartjs-plugin-dragData/commits/master/dist/chartjs-plugin-dragData.min.js">History</a>
</div>
<!-- '"` --><!-- </textarea></xmp> --></option></form><form class="inline-form js-update-url-with-hash" action="/chrispahm/chartjs-plugin-dragData/edit/master/dist/chartjs-plugin-dragData.min.js" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="&#x2713;" /><input type="hidden" name="authenticity_token" value="DxRTAwk3MLlgDenYwPHg45vQyOxetI3VY3dDYT0y4tUJBuWG7TZVapGthHX1UrcqPbD3/WfkwZbThbzUoYQy5w==" />
<button class="btn-octicon tooltipped tooltipped-nw" type="submit"
aria-label="Fork this project and edit the file" data-hotkey="e" data-disable-with>
<svg class="octicon octicon-pencil" viewBox="0 0 14 16" version="1.1" width="14" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M0 12v3h3l8-8-3-3-8 8zm3 2H1v-2h1v1h1v1zm10.3-9.3L12 6 9 3l1.3-1.3a.996.996 0 0 1 1.41 0l1.59 1.59c.39.39.39 1.02 0 1.41z"/></svg>
</button>
</form>
<!-- '"` --><!-- </textarea></xmp> --></option></form><form class="inline-form" action="/chrispahm/chartjs-plugin-dragData/delete/master/dist/chartjs-plugin-dragData.min.js" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="&#x2713;" /><input type="hidden" name="authenticity_token" value="iA1qs3hGxWZp5pLxFDBIBjHtCcjVFqr0hE/mDlBTfGTBBIZheBztk3njWQWT5vFvyRmbqa3wkFSyoZItigF0Xw==" />
<button class="btn-octicon btn-octicon-danger tooltipped tooltipped-nw" type="submit"
aria-label="Fork this project and delete the file" data-disable-with>
<svg class="octicon octicon-trashcan" viewBox="0 0 12 16" version="1.1" width="12" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M11 2H9c0-.55-.45-1-1-1H5c-.55 0-1 .45-1 1H2c-.55 0-1 .45-1 1v1c0 .55.45 1 1 1v9c0 .55.45 1 1 1h7c.55 0 1-.45 1-1V5c.55 0 1-.45 1-1V3c0-.55-.45-1-1-1zm-1 12H3V5h1v8h1V5h1v8h1V5h1v8h1V5h1v9zm1-10H2V3h9v1z"/></svg>
</button>
</form> </div>
<div class="file-info">
10 lines (10 sloc)
<span class="file-info-divider"></span>
20.1 KB
</div>
</div>
<div itemprop="text" class="blob-wrapper data type-javascript ">
<table class="highlight tab-size js-file-line-container" data-tab-size="8">
<tr>
<td id="L1" class="blob-num js-line-number" data-line-number="1"></td>
<td id="LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-c"><span class="pl-c">/*</span>!</span></td>
</tr>
<tr>
<td id="L2" class="blob-num js-line-number" data-line-number="2"></td>
<td id="LC2" class="blob-code blob-code-inner js-file-line"><span class="pl-c"> * chartjs-plugin-dragData.js</span></td>
</tr>
<tr>
<td id="L3" class="blob-num js-line-number" data-line-number="3"></td>
<td id="LC3" class="blob-code blob-code-inner js-file-line"><span class="pl-c"> * http://chartjs.org/</span></td>
</tr>
<tr>
<td id="L4" class="blob-num js-line-number" data-line-number="4"></td>
<td id="LC4" class="blob-code blob-code-inner js-file-line"><span class="pl-c"> * Version: 0.0.3</span></td>
</tr>
<tr>
<td id="L5" class="blob-num js-line-number" data-line-number="5"></td>
<td id="LC5" class="blob-code blob-code-inner js-file-line"><span class="pl-c"> * </span></td>
</tr>
<tr>
<td id="L6" class="blob-num js-line-number" data-line-number="6"></td>
<td id="LC6" class="blob-code blob-code-inner js-file-line"><span class="pl-c"> * Copyright 2017 Christoph Pahmeyer</span></td>
</tr>
<tr>
<td id="L7" class="blob-num js-line-number" data-line-number="7"></td>
<td id="LC7" class="blob-code blob-code-inner js-file-line"><span class="pl-c"> * Released under the MIT license</span></td>
</tr>
<tr>
<td id="L8" class="blob-num js-line-number" data-line-number="8"></td>
<td id="LC8" class="blob-code blob-code-inner js-file-line"><span class="pl-c"> * https://github.com/chrispahm/chartjs-plugin-dragData/blob/master/LICENSE.md</span></td>
</tr>
<tr>
<td id="L9" class="blob-num js-line-number" data-line-number="9"></td>
<td id="LC9" class="blob-code blob-code-inner js-file-line"><span class="pl-c"> <span class="pl-c">*/</span></span></td>
</tr>
<tr>
<td id="L10" class="blob-num js-line-number" data-line-number="10"></td>
<td id="LC10" class="blob-code blob-code-inner js-file-line">!function(t){function n(r){if(e[r])return e[r].exports;var i=e[r]={exports:{},id:r,loaded:!1};return t[r].call(i.exports,i,i.exports,n),i.loaded=!0,i.exports}var e={};return n.m=t,n.c=e,n.p=&quot;&quot;,n(0)}([function(t,n,e){&quot;use strict&quot;;function r(t){return t&amp;&amp;t.__esModule?t:{default:t}}function i(t,n){return function(){if(l.event){var e=l.event.sourceEvent;if(f=t.getElementAtEvent(e)[0]){if(t.data.datasets[f._datasetIndex].dragData===!1||f._yScale.options.dragData===!1)return void(f=null);h=f._yScale.id,p=f._xScale.id,&quot;function&quot;==typeof n&amp;&amp;f&amp;&amp;n(e,f)}}}}function o(t,n){return function(){if(f&amp;&amp;l.event){var e=l.event.sourceEvent,r=f._datasetIndex,i=f._index,o=void 0,u=void 0;e.touches?(o=t.scales[p].getValueForPixel(e.touches[0].clientX-t.canvas.getBoundingClientRect().left),u=t.scales[h].getValueForPixel(e.touches[0].clientY-t.canvas.getBoundingClientRect().top)):(o=t.scales[p].getValueForPixel(e.clientX-t.canvas.getBoundingClientRect().left),u=t.scales[h].getValueForPixel(e.clientY-t.canvas.getBoundingClientRect().top)),o=o&gt;t.scales[p].max?t.scales[p].max:o,o=o&lt;t.scales[p].min?t.scales[p].min:o,u=u&gt;t.scales[h].max?t.scales[h].max:u,u=u&lt;t.scales[h].min?t.scales[h].min:u,void 0!==t.data.datasets[r].data[i].x&amp;&amp;t.options.dragX&amp;&amp;(t.data.datasets[r].data[i].x=o),void 0!==t.data.datasets[r].data[i].y?t.data.datasets[r].data[i].y=u:t.data.datasets[r].data[i]=u,t.update(0),&quot;function&quot;==typeof n&amp;&amp;n(e,r,i,t.data.datasets[r].data[i])}}}function u(t,n){return function(){if(&quot;function&quot;==typeof n&amp;&amp;f){var e=l.event.sourceEvent,r=f._datasetIndex,i=f._index,o=t.data.datasets[r].data[i];return n(e,r,i,o)}}}Object.defineProperty(n,&quot;__esModule&quot;,{value:!0});var a=e(1),c=r(a),s=e(2),l=e(3),f=void 0,h=void 0,p=void 0,d={afterInit:function(t){t.options.dragData&amp;&amp;(0,l.select)(t.chart.canvas).call((0,s.drag)().container(t.chart.canvas).on(&quot;start&quot;,i(t,t.options.onDragStart)).on(&quot;drag&quot;,o(t,t.options.onDrag)).on(&quot;end&quot;,u(t,t.options.onDragEnd)))}};c.default.pluginService.register(d),n.default=d},function(t,n){t.exports=Chart},function(t,n,e){!function(t,r){r(n,e(3),e(4))}(this,function(t,n,e){&quot;use strict&quot;;function r(){n.event.stopImmediatePropagation()}function i(){n.event.preventDefault(),n.event.stopImmediatePropagation()}function o(t){var e=t.document.documentElement,r=n.select(t).on(&quot;dragstart.drag&quot;,i,!0);&quot;onselectstart&quot;in e?r.on(&quot;selectstart.drag&quot;,i,!0):(e.__noselect=e.style.MozUserSelect,e.style.MozUserSelect=&quot;none&quot;)}function u(t,e){var r=t.document.documentElement,o=n.select(t).on(&quot;dragstart.drag&quot;,null);e&amp;&amp;(o.on(&quot;click.drag&quot;,i,!0),setTimeout(function(){o.on(&quot;click.drag&quot;,null)},0)),&quot;onselectstart&quot;in r?o.on(&quot;selectstart.drag&quot;,null):(r.style.MozUserSelect=r.__noselect,delete r.__noselect)}function a(t){return function(){return t}}function c(t,n,e,r,i,o,u,a,c,s){this.target=t,this.type=n,this.subject=e,this.identifier=r,this.active=i,this.x=o,this.y=u,this.dx=a,this.dy=c,this._=s}function s(){return!n.event.button}function l(){return this.parentNode}function f(t){return null==t?{x:n.event.x,y:n.event.y}:t}function h(){return&quot;ontouchstart&quot;in this}function p(){function t(t){t.on(&quot;mousedown.drag&quot;,p).filter(M).on(&quot;touchstart.drag&quot;,_).on(&quot;touchmove.drag&quot;,g).on(&quot;touchend.drag touchcancel.drag&quot;,y).style(&quot;touch-action&quot;,&quot;none&quot;).style(&quot;-webkit-tap-highlight-color&quot;,&quot;rgba(0,0,0,0)&quot;)}function p(){if(!A&amp;&amp;E.apply(this,arguments)){var t=m(&quot;mouse&quot;,S.apply(this,arguments),n.mouse,this,arguments);t&amp;&amp;(n.select(n.event.view).on(&quot;mousemove.drag&quot;,d,!0).on(&quot;mouseup.drag&quot;,v,!0),o(n.event.view),r(),b=!1,w=n.event.clientX,x=n.event.clientY,t(&quot;start&quot;))}}function d(){if(i(),!b){var t=n.event.clientX-w,e=n.event.clientY-x;b=t*t+e*e&gt;D}N.mouse(&quot;drag&quot;)}function v(){n.select(n.event.view).on(&quot;mousemove.drag mouseup.drag&quot;,null),u(n.event.view,b),i(),N.mouse(&quot;end&quot;)}function _(){if(E.apply(this,arguments)){var t,e,i=n.event.changedTouches,o=S.apply(this,arguments),u=i.length;for(t=0;t&lt;u;++t)(e=m(i[t].identifier,o,n.touch,this,arguments))&amp;&amp;(r(),e(&quot;start&quot;))}}function g(){var t,e,r=n.event.changedTouches,o=r.length;for(t=0;t&lt;o;++t)(e=N[r[t].identifier])&amp;&amp;(i(),e(&quot;drag&quot;))}function y(){var t,e,i=n.event.changedTouches,o=i.length;for(A&amp;&amp;clearTimeout(A),A=setTimeout(function(){A=null},500),t=0;t&lt;o;++t)(e=N[i[t].identifier])&amp;&amp;(r(),e(&quot;end&quot;))}function m(e,r,i,o,u){var a,s,l,f=i(r,e),h=C.copy();if(n.customEvent(new c(t,&quot;beforestart&quot;,a,e,T,f[0],f[1],0,0,h),function(){return null!=(n.event.subjLine truncated
</tr>
</table>
<details class="details-reset details-overlay BlobToolbar position-absolute js-file-line-actions dropdown d-none" aria-hidden="true">
<summary class="btn-octicon ml-0 px-2 p-0 bg-white border border-gray-dark rounded-1" aria-label="Inline file action toolbar">
<svg class="octicon octicon-kebab-horizontal" viewBox="0 0 13 16" version="1.1" width="13" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M1.5 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3zm5 0a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3zM13 7.5a1.5 1.5 0 1 1-3 0 1.5 1.5 0 0 1 3 0z"/></svg>
</summary>
<details-menu>
<ul class="BlobToolbar-dropdown dropdown-menu dropdown-menu-se mt-2">
<li><clipboard-copy role="menuitem" class="dropdown-item" id="js-copy-lines" style="cursor:pointer;" data-original-text="Copy lines">Copy lines</clipboard-copy></li>
<li><clipboard-copy role="menuitem" class="dropdown-item" id="js-copy-permalink" style="cursor:pointer;" data-original-text="Copy permalink">Copy permalink</clipboard-copy></li>
<li><a class="dropdown-item js-update-url-with-hash" id="js-view-git-blame" role="menuitem" href="/chrispahm/chartjs-plugin-dragData/blame/dca9453b0a7c31897d3d9b8a96b23582efcddf81/dist/chartjs-plugin-dragData.min.js">View git blame</a></li>
<li><a class="dropdown-item" id="js-new-issue" role="menuitem" href="/chrispahm/chartjs-plugin-dragData/issues/new">Open new issue</a></li>
</ul>
</details-menu>
</details>
</div>
</div>
<details class="details-reset details-overlay details-overlay-dark">
<summary data-hotkey="l" aria-label="Jump to line"></summary>
<details-dialog class="Box Box--overlay d-flex flex-column anim-fade-in fast linejump" aria-label="Jump to line">
<!-- '"` --><!-- </textarea></xmp> --></option></form><form class="js-jump-to-line-form Box-body d-flex" action="" accept-charset="UTF-8" method="get"><input name="utf8" type="hidden" value="&#x2713;" />
<input class="form-control flex-auto mr-3 linejump-input js-jump-to-line-field" type="text" placeholder="Jump to line&hellip;" aria-label="Jump to line" autofocus>
<button type="submit" class="btn" data-close-dialog>Go</button>
</form> </details-dialog>
</details>
</div>
<div class="modal-backdrop js-touch-events"></div>
</div>
</div>
</div>
</div>
<div class="footer container-lg px-3" role="contentinfo">
<div class="position-relative d-flex flex-justify-between pt-6 pb-2 mt-6 f6 text-gray border-top border-gray-light ">
<ul class="list-style-none d-flex flex-wrap ">
<li class="mr-3">&copy; 2018 <span title="0.40884s from unicorn-59b88bc4c9-2qf9f">GitHub</span>, Inc.</li>
<li class="mr-3"><a data-ga-click="Footer, go to terms, text:terms" href="https://github.com/site/terms">Terms</a></li>
<li class="mr-3"><a data-ga-click="Footer, go to privacy, text:privacy" href="https://github.com/site/privacy">Privacy</a></li>
<li class="mr-3"><a href="/security" data-ga-click="Footer, go to security, text:security">Security</a></li>
<li class="mr-3"><a href="https://status.github.com/" data-ga-click="Footer, go to status, text:status">Status</a></li>
<li><a data-ga-click="Footer, go to help, text:help" href="https://help.github.com">Help</a></li>
</ul>
<a aria-label="Homepage" title="GitHub" class="footer-octicon mr-lg-4" href="https://github.com">
<svg height="24" class="octicon octicon-mark-github" viewBox="0 0 16 16" version="1.1" width="24" aria-hidden="true"><path fill-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8z"/></svg>
</a>
<ul class="list-style-none d-flex flex-wrap ">
<li class="mr-3"><a data-ga-click="Footer, go to contact, text:contact" href="https://github.com/contact">Contact GitHub</a></li>
<li class="mr-3"><a href="https://github.com/pricing" data-ga-click="Footer, go to Pricing, text:Pricing">Pricing</a></li>
<li class="mr-3"><a href="https://developer.github.com" data-ga-click="Footer, go to api, text:api">API</a></li>
<li class="mr-3"><a href="https://training.github.com" data-ga-click="Footer, go to training, text:training">Training</a></li>
<li class="mr-3"><a href="https://blog.github.com" data-ga-click="Footer, go to blog, text:blog">Blog</a></li>
<li><a data-ga-click="Footer, go to about, text:about" href="https://github.com/about">About</a></li>
</ul>
</div>
<div class="d-flex flex-justify-center pb-6">
<span class="f6 text-gray-light"></span>
</div>
</div>
<div id="ajax-error-message" class="ajax-error-message flash flash-error">
<svg class="octicon octicon-alert" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"/></svg>
<button type="button" class="flash-close js-ajax-error-dismiss" aria-label="Dismiss error">
<svg class="octicon octicon-x" viewBox="0 0 12 16" version="1.1" width="12" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7.48 8l3.75 3.75-1.48 1.48L6 9.48l-3.75 3.75-1.48-1.48L4.52 8 .77 4.25l1.48-1.48L6 6.52l3.75-3.75 1.48 1.48L7.48 8z"/></svg>
</button>
You can’t perform that action at this time.
</div>
<script crossorigin="anonymous" integrity="sha512-WnyO4VoIUwWWQOmFLjYf4UGg/c1z9VlaLN8IMuiI3uMhhl6rejyThRdLPDyePeUPW6N+38OoBMs6AkqcvWALtA==" type="application/javascript" src="https://assets-cdn.github.com/assets/compat-b66b5d97b4442a01f057c74b091c4368.js"></script>
<script crossorigin="anonymous" integrity="sha512-092+yG9tBLtacCexwGKGjTtkuRfZo0YUa8VrsiKW+Zh/nyA2j7MvftFLeoIor9CGQ9uDFYNIcbFDbbTPw7tV3Q==" type="application/javascript" src="https://assets-cdn.github.com/assets/frameworks-176ef037f2b2ddbb94c6810c7bce4ec9.js"></script>
<script crossorigin="anonymous" async="async" integrity="sha512-1Q7Ebz9Z7DgGT3k6SxGdGh9qknu6pCoRFuElPmXIGEb3N5iv9d4A1+yXS1Ccquw6OyXLJemfc5HAmtG6zYjgzw==" type="application/javascript" src="https://assets-cdn.github.com/assets/github-2def5cbbebe464dee8b3895e4c146e6a.js"></script>
<div class="js-stale-session-flash stale-session-flash flash flash-warn flash-banner d-none">
<svg class="octicon octicon-alert" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"/></svg>
<span class="signed-in-tab-flash">You signed in with another tab or window. <a href="">Reload</a> to refresh your session.</span>
<span class="signed-out-tab-flash">You signed out in another tab or window. <a href="">Reload</a> to refresh your session.</span>
</div>
<div class="facebox" id="facebox" style="display:none;">
<div class="facebox-popup">
<div class="facebox-content" role="dialog" aria-labelledby="facebox-header" aria-describedby="facebox-description">
</div>
<button type="button" class="facebox-close js-facebox-close" aria-label="Close modal">
<svg class="octicon octicon-x" viewBox="0 0 12 16" version="1.1" width="12" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7.48 8l3.75 3.75-1.48 1.48L6 9.48l-3.75 3.75-1.48-1.48L4.52 8 .77 4.25l1.48-1.48L6 6.52l3.75-3.75 1.48 1.48L7.48 8z"/></svg>
</button>
</div>
</div>
<template id="site-details-dialog">
<details class="details-reset details-overlay details-overlay-dark lh-default text-gray-dark" open>
<summary aria-haspopup="dialog" aria-label="Close dialog"></summary>
<details-dialog class="Box Box--overlay d-flex flex-column anim-fade-in fast">
<button class="Box-btn-octicon m-0 btn-octicon position-absolute right-0 top-0" type="button" aria-label="Close dialog" data-close-dialog>
<svg class="octicon octicon-x" viewBox="0 0 12 16" version="1.1" width="12" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7.48 8l3.75 3.75-1.48 1.48L6 9.48l-3.75 3.75-1.48-1.48L4.52 8 .77 4.25l1.48-1.48L6 6.52l3.75-3.75 1.48 1.48L7.48 8z"/></svg>
</button>
<div class="octocat-spinner my-6 js-details-dialog-spinner"></div>
</details-dialog>
</details>
</template>
<div class="Popover js-hovercard-content position-absolute" style="display: none; outline: none;" tabindex="0">
<div class="Popover-message Popover-message--bottom-left Popover-message--large Box box-shadow-large" style="width:360px;">
</div>
</div>
<div id="hovercard-aria-description" class="sr-only">
Press h to open a hovercard with more details.
</div>
</body>
</html>
+6
View File
@@ -0,0 +1,6 @@
/*!
* Materialize v1.0.0 (http://materializecss.com)
* Copyright 2014-2017 Materialize
* MIT License (https://raw.githubusercontent.com/Dogfalo/materialize/master/LICENSE)
*/
var _get=function t(e,i,n){null===e&&(e=Function.prototype);var s=Object.getOwnPropertyDescriptor(e,i);if(void 0===s){var o=Object.getPrototypeOf(e);return null===o?void 0:t(o,i,n)}if("value"in s)return s.value;var a=s.get;return void 0!==a?a.call(n):void 0},_createClass=function(){function n(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(t,e,i){return e&&n(t.prototype,e),i&&n(t,i),t}}();function _possibleConstructorReturn(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function _classCallCheck(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}window.cash=function(){var i,o=document,a=window,t=Array.prototype,r=t.slice,n=t.filter,s=t.push,e=function(){},h=function(t){return typeof t==typeof e&&t.call},d=function(t){return"string"==typeof t},l=/^#[\w-]*$/,u=/^\.[\w-]*$/,c=/<.+>/,p=/^\w+$/;function v(t,e){e=e||o;var i=u.test(t)?e.getElementsByClassName(t.slice(1)):p.test(t)?e.getElementsByTagName(t):e.querySelectorAll(t);return i}function f(t){if(!i){var e=(i=o.implementation.createHTMLDocument(null)).createElement("base");e.href=o.location.href,i.head.appendChild(e)}return i.body.innerHTML=t,i.body.childNodes}function m(t){"loading"!==o.readyState?t():o.addEventListener("DOMContentLoaded",t)}function g(t,e){if(!t)return this;if(t.cash&&t!==a)return t;var i,n=t,s=0;if(d(t))n=l.test(t)?o.getElementById(t.slice(1)):c.test(t)?f(t):v(t,e);else if(h(t))return m(t),this;if(!n)return this;if(n.nodeType||n===a)this[0]=n,this.length=1;else for(i=this.length=n.length;s<i;s++)this[s]=n[s];return this}function _(t,e){return new g(t,e)}var y=_.fn=_.prototype=g.prototype={cash:!0,length:0,push:s,splice:t.splice,map:t.map,init:g};function k(t,e){for(var i=t.length,n=0;n<i&&!1!==e.call(t[n],t[n],n,t);n++);}function b(t,e){var i=t&&(t.matches||t.webkitMatchesSelector||t.mozMatchesSelector||t.msMatchesSelector||t.oMatchesSelector);return!!i&&i.call(t,e)}function w(e){return d(e)?b:e.cash?function(t){return e.is(t)}:function(t,e){return t===e}}function C(t){return _(r.call(t).filter(function(t,e,i){return i.indexOf(t)===e}))}Object.defineProperty(y,"constructor",{value:_}),_.parseHTML=f,_.noop=e,_.isFunction=h,_.isString=d,_.extend=y.extend=function(t){t=t||{};var e=r.call(arguments),i=e.length,n=1;for(1===e.length&&(t=this,n=0);n<i;n++)if(e[n])for(var s in e[n])e[n].hasOwnProperty(s)&&(t[s]=e[n][s]);return t},_.extend({merge:function(t,e){for(var i=+e.length,n=t.length,s=0;s<i;n++,s++)t[n]=e[s];return t.length=n,t},each:k,matches:b,unique:C,isArray:Array.isArray,isNumeric:function(t){return!isNaN(parseFloat(t))&&isFinite(t)}});var E=_.uid="_cash"+Date.now();function M(t){return t[E]=t[E]||{}}function O(t,e,i){return M(t)[e]=i}function x(t,e){var i=M(t);return void 0===i[e]&&(i[e]=t.dataset?t.dataset[e]:_(t).attr("data-"+e)),i[e]}y.extend({data:function(e,i){if(d(e))return void 0===i?x(this[0],e):this.each(function(t){return O(t,e,i)});for(var t in e)this.data(t,e[t]);return this},removeData:function(s){return this.each(function(t){return i=s,void((n=M(e=t))?delete n[i]:e.dataset?delete e.dataset[i]:_(e).removeAttr("data-"+name));var e,i,n})}});var L=/\S+/g;function T(t){return d(t)&&t.match(L)}function $(t,e){return t.classList?t.classList.contains(e):new RegExp("(^| )"+e+"( |$)","gi").test(t.className)}function B(t,e,i){t.classList?t.classList.add(e):i.indexOf(" "+e+" ")&&(t.className+=" "+e)}function D(t,e){t.classList?t.classList.remove(e):t.className=t.className.replace(e,"")}y.extend({addClass:function(t){var n=T(t);return n?this.each(function(e){var i=" "+e.className+" ";k(n,function(t){B(e,t,i)})}):this},attr:function(e,i){if(e){if(d(e))return void 0===i?this[0]?this[0].getAttribute?this[0].getAttribute(e):this[0][e]:void 0:this.each(function(t){t.setAttribute?t.setAttribute(e,i):t[e]=i});for(var t in e)this.attr(t,e[t]);return this}},hasClass:function(t){var e=!1,i=T(t);return i&&i.length&&this.each(function(t){return!(e=$(t,i[0]))}),e},prop:function(e,i){if(d(e))return void 0===i?this[0][e]:this.each(function(t){t[e]=i});for(var t in e)this.prop(t,e[t]);return this},removeAttr:function(e){return this.each(function(t){t.removeAttribute?t.removeAttribute(e):delete t[e]})},removeClass:function(t){if(!arguments.length)return this.attr("class","");var i=T(t);return i?this.each(function(e){k(i,function(t){D(e,t)})}):this},removeProp:function(e){return this.each(function(t){delete t[e]})},toggleClass:function(t,e){if(void 0!==e)return this[e?"addClassLine truncated
+172 -47
View File
@@ -1,37 +1,106 @@
var oven_status = "";
var _run = 0;
var _elapsedTime = 0; var _elapsedTime = 0;
function getParams() {
const url = '/paraams';
fetch(url)
.then((respone)=>{
return respone.json();
})
.then((data)=>{
document.getElementById('Iim').value = data.Iim || -1;
document.getElementById('Imp').value = data.Imp || -1;
document.getElementById('Tu').value = data.Tu || -1;
document.getElementById('Tl').value = data.Tl || -1;
M.updateTextFields();
})
}
function setParams() { setInterval(function () {
const url = '/status';
const data = new URLSearchParams(); fetch(url)
.then((respone)=>{
data.append('Iim',document.getElementById('Iim').value); return respone.json();
data.append('Imp',document.getElementById('Imp').value); })
data.append('Tu',document.getElementById('Tu').value); .then((data)=>{
data.append('Tl',document.getElementById('Tl').value); document.getElementById("tempinfo").value = data.temp || -1;
document.getElementById("targetinfo").value = data.target || -1;
fetch('/params', { document.getElementById("powerinfo").value = data.power || -1;
method: 'POST', _run = data.runProfile || 0;
headers: { _elapsedTime = data.elapsedTime || 0;
'Content-Type': 'application/x-www-form-urlencoded' M.updateTextFields();
},
body: data
}) })
if(_run == 1){
myChart.data.datasets[1].data.push({
x:_elapsedTime / 1000,
y:document.getElementById("tempinfo").value
});
myChart.update();
} }
}, 4000);
function setXmax() {
myChart.data.datasets[0].data[9].x = document.getElementById('xmax').value;
myChart.update();
}
function setTarget() {
const data = new URLSearchParams();
data.append('value',document.getElementById('target').value);
fetch('/target', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: data
})
}
function getPID() {
const url = '/pid';
fetch(url)
.then((respone)=>{
return respone.json();
})
.then((data)=>{
document.getElementById('kp').value = data.kp || -1;
document.getElementById('ki').value = data.ki || -1;
document.getElementById('kd').value = data.kd || -1;
M.updateTextFields();
})
}
function setPID() {
const data = new URLSearchParams();
data.append('kp', document.getElementById('kp').value);
data.append('ki', document.getElementById('ki').value);
data.append('kd', document.getElementById('kd').value);
fetch('/pid', {
method: 'GET',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: data
})
}
function runProfile() {
var btn = document.getElementById("btnRunProfile");
const data = new URLSearchParams();
if(_run == 1){
//stop profile
_run = 0;
btn.classList.remove("red");
btn.classList.add("teal");
btn.innerHTML = "Run";
data.append('run', _run);
}else{
//run profile
_run = 1;
data.append('run', _run);
data.append('profile', JSON.stringify(myChart.data.datasets[0].data));
btn.classList.remove("teal");
btn.classList.add("red");
btn.innerHTML = "Stop";
_elapsedTime = 0;
myChart.data.datasets[1].data.length = 0;
myChart.update();
}
fetch('/profile', {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
body: data
})
}
function joinNetwork() { function joinNetwork() {
@@ -61,24 +130,80 @@ async function scanNetworks() {
document.getElementById("networks").innerHTML = listHTML; document.getElementById("networks").innerHTML = listHTML;
} }
setInterval(function () { var ctx = document.getElementById("myChart");
aja() Chart.defaults.global.defaultFontColor = 'red';
.url('/sensors') var myChart = new Chart(ctx, {
.on('success', function (data) { type: 'scatter',
document.getElementById("tempinfo").value = data.temperature || -1; data: {
document.getElementById("humidityinfo").value = data.humidity || -1; datasets: [{
document.getElementById("pressureinfo").value = data.pressure || -1; label: 'Temperature profile',
//document.getElementById("targetinfo").value = data.target.toFixed(2) || -1; data: [{
_run = data.runProfile || 0; x: 0, y: 25
_elapsedTime = data.elapsedTime || 0; }, {
M.updateTextFields(); x: 90, y: 150
}) }, {
.go(); x: 270, y: 200
}, 4000); }, {
x: 300, y: 235
}, {
x: 330, y: 250
}, {
x: 360, y: 217
}, {
x: 420, y: 25
}, {
x: 480, y: 25
}, {
x: 540, y: 25
}, {
x: 600, y: 25
}],
lineTension: 0,
showLine: true
},{
label: 'History',
data: [{
x:0, y:0
}],
lineTension: 0,
showLine: true,
pointBackgroundColor: 'red'
}]
},
options: {
layout: {
padding: {
bottom: 20
}
},
responsive: true,
scales: {
yAxes: [{
ticks: {
beginAtZero:true,
min: 0,
max: 280
}
}]
},
dragData: true,
dragX: true,
onDragStart: function (event, element) {},
onDrag: function (event, datasetIndex, index, value) {},
onDragEnd: function (event, datasetIndex, index, value) {}
}
});
var ttOptions = {
enterDelay: 500,
inDuration: 300
};
document.addEventListener('DOMContentLoaded', function() { document.addEventListener('DOMContentLoaded', function() {
var elems = document.querySelectorAll('.tooltipped');
var instances = M.Tooltip.init(elems, ttOptions);
getPID();
M.AutoInit(); M.AutoInit();
getParams();
// var elems = document.querySelectorAll('.tooltipped');
// var instances = M.Tooltip.init(elems, ttOptions);
}); });
+11 -2
View File
@@ -26,6 +26,9 @@ lib_deps =
adafruit/Adafruit GFX Library@^1.11.9 adafruit/Adafruit GFX Library@^1.11.9
adafruit/Adafruit SSD1306@^2.5.9 adafruit/Adafruit SSD1306@^2.5.9
adafruit/MAX6675 library@^1.1.2 adafruit/MAX6675 library@^1.1.2
br3ttb/PID@^1.2.1
bblanchon/ArduinoJson@^7.0.3
dlloydev/QuickPID@^3.1.9
[env:lolin32] [env:lolin32]
board = lolin32 board = lolin32
@@ -33,10 +36,13 @@ lib_deps =
adafruit/Adafruit GFX Library@^1.11.9 adafruit/Adafruit GFX Library@^1.11.9
adafruit/Adafruit SSD1306@^2.5.9 adafruit/Adafruit SSD1306@^2.5.9
https://github.com/me-no-dev/ESPAsyncWebServer.git https://github.com/me-no-dev/ESPAsyncWebServer.git
me-no-dev/AsyncTCP@^1.1.1 me-no-dev/AsyncTCP
ayushsharma82/AsyncElegantOTA@^2.2.7 ayushsharma82/AsyncElegantOTA@^2.2.7
arduino-libraries/Arduino_JSON@^0.1.0 arduino-libraries/Arduino_JSON
adafruit/MAX6675 library@^1.1.2 adafruit/MAX6675 library@^1.1.2
bblanchon/ArduinoJson@^7.0.3
; dlloydev/QuickPID@^3.1.9
br3ttb/PID@^1.2.1
build_flags = build_flags =
'-D ELEGANTOTA_USE_ASYNC_WEBSERVER=1' '-D ELEGANTOTA_USE_ASYNC_WEBSERVER=1'
monitor_speed = 115200 monitor_speed = 115200
@@ -51,3 +57,6 @@ lib_deps =
adafruit/Adafruit GFX Library@^1.11.9 adafruit/Adafruit GFX Library@^1.11.9
adafruit/Adafruit SSD1306@^2.5.9 adafruit/Adafruit SSD1306@^2.5.9
adafruit/MAX6675 library@^1.1.2 adafruit/MAX6675 library@^1.1.2
br3ttb/PID@^1.2.1
bblanchon/ArduinoJson@^7.0.3
dlloydev/QuickPID@^3.1.9
+234 -18
View File
@@ -1,4 +1,5 @@
#include <Arduino.h> #include <Arduino.h>
#define DEBUG
//Peripherals includes //Peripherals includes
#include <Wire.h> #include <Wire.h>
@@ -6,6 +7,8 @@
#include <Adafruit_GFX.h> #include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h> #include <Adafruit_SSD1306.h>
#include <max6675.h> #include <max6675.h>
// #include <QuickPID.h>
#include <PID_v1.h>
//Web server includes //Web server includes
#include <AsyncElegantOTA.h> #include <AsyncElegantOTA.h>
@@ -16,14 +19,49 @@
#include <AsyncTCP.h> #include <AsyncTCP.h>
#include <ESPAsyncWebServer.h> #include <ESPAsyncWebServer.h>
#include <SPIFFSEditor.h> #include <SPIFFSEditor.h>
#include <Arduino_JSON.h> // #include <Arduino_JSON.h>
#include "AsyncJson.h"
#include <ArduinoJson.h>
#include <Preferences.h> #include <Preferences.h>
Preferences settings; Preferences settings;
#define MAX6675_SCLK 12
#define MAX6675_CS 13
#define MAX6675_MISO 15
#define I2C_SDA 5//13 #define I2C_SDA 5//13
#define I2C_SCL 4//15 #define I2C_SCL 4//15
#define LED_PIN 5 #define LED_PIN 16
#define HEATER_PIN 14
//PID
#define T_SAMPLE_PERIOD 1000 // in milliseconds.
uint32_t temperature_sample_timer = 0;
double target = 0;
double temperature = 0;
double power = 0;
int runProfile = 0;
long int profileStartTime = 0;
long int elapsedTime = 0;
struct dataPoint{
double time;
double temp;
};
struct dataPoint sProfile[10];
double kp = 950;
double ki = 0.05;
double kd = 100;
PID outputPID(&temperature, &power, &target, kp, ki, kd, DIRECT);
int cycle = 10000; //WindowSize
unsigned long duty = 0; //WindowStartTime
// boolean on_off = false;
//DATA
// StaticJsonBuffer<JSON_OBJECT_SIZE(5)> jbStatus;
// JsonObject& objStatus = jbStatus.createObject();
//***** //*****
// Display defines // Display defines
@@ -39,7 +77,6 @@ unsigned long lastScreenRefresh = 0;
//MAX6675(int8_t SCLK, int8_t CS, int8_t MISO); //MAX6675(int8_t SCLK, int8_t CS, int8_t MISO);
MAX6675 tc(12, 13, 15); MAX6675 tc(12, 13, 15);
unsigned long lastTempTime = 0; unsigned long lastTempTime = 0;
float temperature;
//********************************************************* //*********************************************************
// Web server variable declarations // Web server variable declarations
@@ -51,7 +88,7 @@ AsyncWebServer server(80);
// AsyncEventSource events("/events"); // AsyncEventSource events("/events");
//Variables to save values from HTML form //Variables to save values from HTML form
JSONVar scannedSSIDs; // JSONVar scannedSSIDs;
String ssid; String ssid;
String pass; String pass;
String ip; String ip;
@@ -86,14 +123,43 @@ bool initWiFi();
String getLEDState(); String getLEDState();
// ---------------------------------------------- // ----------------------------------------------
String getStatus(void)
{
// String json;
JsonDocument jsonStatus;
jsonStatus["temp"] = String(temperature);
jsonStatus["target"] = String(target);
jsonStatus["power"] = String(power);
jsonStatus["runProfile"] = String(runProfile);
jsonStatus["elapsedTime"] = String(elapsedTime);
String out;
serializeJson(jsonStatus,out);
return out;
// return JSON.stringify(jsonStatus);
}
String getPID(AsyncWebServerRequest * request)
{
JsonDocument jsonPID;
jsonPID["kp"] = String(kp);
jsonPID["ki"] = String(ki);
jsonPID["kd"] = String(kd);
String out;
serializeJson(jsonPID,out);
return out;
}
String getJSONTemp(){ String getJSONTemp(){
JSONVar jsonTemp; JsonDocument jsonTemp;
jsonTemp["t"]=String(temperature); jsonTemp["t"]=String(temperature);
return JSON.stringify(jsonTemp); String out;
serializeJson(jsonTemp,out);
return out;
} }
void setup() { void setup() {
pinMode(LED_PIN, OUTPUT); pinMode(LED_PIN, OUTPUT);
pinMode(HEATER_PIN, OUTPUT);
Serial.begin(115200); Serial.begin(115200);
@@ -146,7 +212,7 @@ server.addHandler(new SPIFFSEditor(SPIFFS,http_username,http_password));
server.on("/temperature", HTTP_GET, [](AsyncWebServerRequest *request){ server.on("/temperature", HTTP_GET, [](AsyncWebServerRequest *request){
String json = getJSONTemp(); String json = getJSONTemp();
request->send(200, "application/json", json); request->send(200, "application/json", json);
json = String(); // json = String();
}); });
server.on("/scanNetworks", HTTP_GET, [](AsyncWebServerRequest *request){ server.on("/scanNetworks", HTTP_GET, [](AsyncWebServerRequest *request){
@@ -288,32 +354,182 @@ server.addHandler(new SPIFFSEditor(SPIFFS,http_username,http_password));
ESP.restart(); ESP.restart();
} }
}); });
server.on("/heap", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(200, "text/plain", String(ESP.getFreeHeap()));
});
server.on("/status", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(200, "text/plain", getStatus());
});
server.on("/pid", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(200, "text/plain", getPID(request));
});
server.on("/pid",HTTP_POST, [](AsyncWebServerRequest *request){
if (request->hasParam("kp",true))
{
kp = request->getParam("kp",true)->value().toFloat();
#ifdef DEBUG
Serial.print("kp=");
Serial.print(kp,2);
Serial.print("; ");
#endif
}
if (request->hasParam("ki",true))
{
ki = request->getParam("ki",true)->value().toFloat();
#ifdef DEBUG
Serial.print("ki=");
Serial.print(ki,2);
Serial.print("; ");
#endif
}
if (request->hasParam("kd",true))
{
kd = request->getParam("kd",true)->value().toFloat();
#ifdef DEBUG
Serial.print("kd=");
Serial.print(kd,2);
Serial.print("; ");
#endif
}
#ifdef DEBUG
Serial.print("\n");
#endif
outputPID.SetTunings(kp, ki, kd);
server.begin(); request->send(200, "text/plain", getPID(request));
});
server.on("/target", HTTP_POST, [](AsyncWebServerRequest *request){
int params = request->params();
if(params > 0){
// AsyncWebParameter* p = request->getParam("value",true)->value().toFloat();
target = request->getParam("value",true)->value().toDouble();
Serial.printf("Target: %3.2f\n",target);
}else{
target = -273;
}
// if(request->hasParam("value")){
// target = request->getParam("value")->value().toFloat();
// Serial.printf("Target: %d",target);
// }
request->send(200, "text/plain", (String)target);
});
server.on("/profile", HTTP_POST,[](AsyncWebServerRequest *request){
// AsyncCallbackJsonWebHandler *handler = new AsyncCallbackJsonWebHandler("/profile", [](AsyncWebServerRequest *request, JsonVariant &json) {
int params = request->params();
if(request->hasParam("profile",true)){
JsonDocument jsonObj;
Serial.println(request->getParam("profile",true)->value());
DeserializationError error = deserializeJson(jsonObj, request->getParam("profile",true)->value());
if (error) {
// Handle the error
Serial.println(error.c_str()); request->send(400, "text/plain", "Invalid JSON payload"); return;
}else{
for(int i = 0;i<10;i++) {
//double point[2];
//int pointCount = jsonObj["profile"][i].as<JsonArray>().copyTo(point);
sProfile[i].time = jsonObj[i]["x"];
sProfile[i].temp = jsonObj[i]["y"];
#ifdef DEBUG
Serial.print("Point:");
Serial.print(i);
Serial.print(", Time:");
Serial.print(sProfile[i].time);
Serial.print(", Temp:");
Serial.println(sProfile[i].temp);
#endif
}
}
}
if(request->hasParam("run",true)){
runProfile = request->getParam("run",true)->value().toInt();
Serial.println(runProfile);
if(runProfile == 1){
profileStartTime = millis();
elapsedTime = 0;
}else{
target = 0;
}
}
request->send(200, "text/plain", "{test: \"ok\"}");
});
server.begin();
duty = millis();
outputPID.SetOutputLimits(0, cycle);
outputPID.SetSampleTime(T_SAMPLE_PERIOD);
outputPID.SetTunings(kp, ki, kd);
outputPID.SetMode(AUTOMATIC);
} }
void loop() { void loop() {
digitalWrite(LED_PIN,HIGH); long now = millis();
temperature = tc.readCelsius(); if(now - temperature_sample_timer >= T_SAMPLE_PERIOD)
delay(500); {
digitalWrite(LED_PIN,LOW); temperature = tc.readCelsius();
delay(500); temperature_sample_timer = now;
if ((millis() - lastScreenRefresh) > SCREEN_REFRESH) { //deal with profile
if(runProfile == 1){
elapsedTime = millis() - profileStartTime;
if(sProfile[9].time * 1000 > elapsedTime){
//find segment
int segment = 0;
for(segment;segment<10;segment++){
if(sProfile[segment].time * 1000 < elapsedTime && sProfile[segment+1].time * 1000 >= elapsedTime){
break;
};
}
Serial.print("Segment:");
Serial.print(segment);
double t_t1 = elapsedTime - (sProfile[segment].time * 1000);
double t2_t1 = (sProfile[segment+1].time - sProfile[segment].time) * 1000;
double T2_T1 = sProfile[segment+1].temp - sProfile[segment].temp;
target = sProfile[segment].temp + (t_t1 / t2_t1) * T2_T1;
Serial.print(", Target:");
Serial.println(target);
}else{
runProfile = 0;
target = 0;
}
}
}
//set heater output
outputPID.Compute();
unsigned long rightNow = millis();
if (rightNow - duty > cycle)
{ //time to shift the Relay Window
duty += cycle;
}
if (power > rightNow - duty){
digitalWrite(HEATER_PIN, HIGH);
}else{
digitalWrite(HEATER_PIN, LOW);
}
if ((now - lastScreenRefresh) > SCREEN_REFRESH) {
Serial.printf("T:%.2f\n", temperature); Serial.printf("T:%.2f\n", temperature);
display.clearDisplay(); display.clearDisplay();
display.setTextSize(3);
display.setCursor(0, 5);
display.printf("T:%.1f\n", temperature);
display.setTextSize(1); display.setTextSize(1);
display.setCursor(0, 3);
display.printf("T:%.1f/%.1f\n", temperature, target);
display.setCursor(0,24);
display.printf("P:%.1f\n", power);
display.setCursor(0,48); display.setCursor(0,48);
display.printf("%s\n",ssid); display.printf("%s\n",ssid);
display.printf("%s",ip); display.printf("%s",ip);
display.display(); display.display();
lastScreenRefresh = millis(); lastScreenRefresh = now;
} }
} }