index.ejs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
  6. <meta name="apple-mobile-web-app-capable" content="yes" />
  7. <title>SqueezeESP32</title>
  8. </head>
  9. <body class="d-flex flex-column">
  10. <div style="display:none">
  11. <% if (htmlWebpackPlugin.files.sprites) { %>
  12. <% for (var spriteFileName in htmlWebpackPlugin.files.sprites) { %>
  13. <%= htmlWebpackPlugin.files.sprites[spriteFileName] %>
  14. <% } %>
  15. <% } %>
  16. </div>
  17. <header class="navbar navbar-expand-sm navbar-dark bg-primary sticky-top border-bottom border-dark" id="mainnav">
  18. <a class="navbar-brand" id="navtitle" href="#">SqueezeESP32</a>
  19. <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent"
  20. aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
  21. <span class="navbar-toggler-icon"></span>
  22. </button>
  23. <div class="collapse navbar-collapse" id="navbarSupportedContent">
  24. <ul class="nav navbar-nav mr-auto">
  25. <li class="nav-item"><a class="nav-link active" data-toggle="tab" href="#tab-wifi">WiFi</a></li>
  26. <li class="nav-item omsg"><a class="nav-link" data-toggle="tab" href="#tab-syslog">Status<span
  27. class="badge badge-pill badge-success" id="msgcnt"></span></a></li>
  28. <li class="nav-item orec"><a class="nav-link" data-toggle="tab" href="#tab-cfg-audio">Audio</a></li>
  29. <li class="nav-item orec"><a class="nav-link" data-toggle="tab" href="#tab-cfg-syst">System</a></li>
  30. <li class="nav-item orec"><a class="nav-link" data-toggle="tab" href="#tab-cfg-hw">Hardware</a></li>
  31. <li class="nav-item"><a class="nav-link" data-toggle="tab" href="#tab-cfg-fw">Updates</a></li>
  32. <div class="dropdown-divider"></div>
  33. <li class="nav-item"><a class="nav-link" data-toggle="tab" href="#tab-nvs">NVS Editor</a></li>
  34. <li class="nav-item"><a class="nav-link" data-toggle="tab" href="#tab-commands">Advanced</a></li>
  35. <li class="nav-item"><a class="nav-link" data-toggle="tab" href="#tab-credits">Credits</a></li>
  36. </ul>
  37. </div>
  38. <div class="info navbar-right" style="display: inline-flex;">
  39. <svg class="recovery_element " style="fill:orange; width:1.5rem; height: 1.5rem;">
  40. <use xlink:href="#device-recover-fill"></use>
  41. </svg>
  42. <svg style="fill:white; width:1.5rem; height: 1.5rem;">
  43. <use id="battery" xlink:href="#battery-fill"></use>
  44. </svg>
  45. <svg id="o_jack" style="fill:white; width:1.5rem; height: 1.5rem;">
  46. <use xlink:href="#headphone-fill"></use>
  47. </svg>
  48. <svg style="fill:white; width:1.5rem; height: 1.5rem;">
  49. <use id="o_bt" xlink:href="#bluetooth-fill"></use>
  50. </svg>
  51. <span data-toggle="tooltip" id="o_type" data-placement="top" title=""><svg
  52. xmlns="http://www.w3.org/2000/svg" id="output" width="24" height="24" viewBox="0 0 24 24">
  53. <g id="o_i2s" display="none">
  54. <path
  55. d="M2 7L2 8L2 9L2 10L2 11L2 12L2 13L2 14L2 15L2 16L2 17L3 17L3 16L3 15L3 14L3 13L3 12L3 11L3 10L3 9L3 8L2 7M6 7L6 8L6 9L7 9L7 8L8 8L9 8L10 8L10 9L11 9L11 10L11 11L10 11L10 12L9 12L9 13L8 13L8 14L7 14L7 15L6 15L6 16L6 17L7 17L8 17L9 17L10 17L11 17L12 17L12 16L11 16L10 16L9 16L8 16L8 15L9 15L9 14L10 14L10 13L11 13L11 12L12 12L12 11L12 10L12 9L12 8L11 8L11 7L10 7L9 7L8 7L6 7M16 7L16 8L15 8L15 9L15 10L15 11L16 11L16 12L17 12L18 12L18 13L19 13L20 13L21 13L21 14L21 15L20 15L20 16L19 16L18 16L17 16L16 16L16 15L15 15L15 16L15 17L16 17L17 17L18 17L19 17L20 17L21 17L21 16L22 16L22 15L22 14L22 13L21 13L21 12L20 12L20 11L19 11L18 11L17 11L16 11L16 10L16 9L17 9L17 8L18 8L19 8L20 8L21 8L21 9L22 9L22 8L22 7L21 7L20 7L19 7L18 7L16 7z" />
  56. </g>
  57. <g id="o_spdif" display="none">
  58. <path
  59. d="M3 1L3 2L2 2L2 3L2 4L2 5L3 5L3 6L4 6L5 6L5 7L6 7L7 7L8 7L8 8L8 9L7 9L7 10L6 10L5 10L4 10L3 10L3 9L2 9L2 10L2 11L3 11L4 11L5 11L6 11L7 11L8 11L8 10L9 10L9 9L9 8L9 7L8 7L8 6L7 6L7 5L6 5L5 5L4 5L3 5L3 4L3 3L4 3L4 2L5 2L6 2L7 2L8 2L8 3L9 3L9 2L9 1L8 1L7 1L6 1L5 1L3 1M13 1L13 2L13 3L13 4L12 4L12 5L12 6L12 7L12 8L11 8L11 9L11 10L11 11L10 11L10 12L10 13L11 13L11 12L11 11L12 11L12 10L12 9L12 8L13 8L13 7L13 6L13 5L14 5L14 4L14 3L14 2L15 2L15 1L13 1M16 1L16 2L16 3L16 4L16 5L16 6L16 7L16 8L16 9L16 10L16 11L17 11L17 10L17 9L17 8L17 7L18 7L19 7L20 7L21 7L21 6L22 6L22 5L22 4L22 3L22 2L21 2L21 1L20 1L19 1L18 1L16 1z" />
  60. <path style="fill:#272B30;"
  61. d="M17 2L17 3L17 4L17 5L17 6L18 6L19 6L20 6L20 5L21 5L21 4L21 3L20 3L20 2L19 2L17 2z" />
  62. <path
  63. d="M2 13L2 14L2 15L2 16L2 17L2 18L2 19L2 20L2 21L2 22L2 23L3 23L4 23L5 23L6 23L7 23L8 23L8 22L9 22L9 21L10 21L10 20L10 19L10 18L10 17L10 16L10 15L9 15L9 14L8 14L7 14L7 13L6 13L5 13L4 13L2 13M13 13L13 14L13 15L13 16L13 17L13 18L13 19L13 20L13 21L13 22L13 23L14 23L14 22L14 21L14 20L14 19L14 18L14 17L14 16L14 15L14 14L13 13M17 13L17 14L17 15L17 16L17 17L17 18L17 19L17 20L17 21L17 22L17 23L18 23L18 22L18 21L18 20L18 19L18 18L19 18L20 18L21 18L22 18L22 17L21 17L20 17L19 17L18 17L18 16L18 15L18 14L19 14L20 14L21 14L22 14L22 13L21 13L20 13L19 13L17 13z" />
  64. <path style="fill:#272B30;"
  65. d="M3 14L3 15L3 16L3 17L3 18L3 19L3 20L3 21L3 22L4 22L5 22L6 22L7 22L7 21L8 21L8 20L9 20L9 19L9 18L9 17L9 16L8 16L8 15L7 15L7 14L6 14L5 14L3 14z" />
  66. </g>
  67. </svg></span>
  68. <svg style="fill:white; width:1.5rem; height: 1.5rem;">
  69. <use id="wifiStsIcon" xlink:href="#signal-wifi-fill"></use>
  70. </svg>
  71. </div>
  72. </header>
  73. <main role="main" class="flex-grow mt-1 mb-12" style="margin-bottom: 7rem;" id="content">
  74. <!-- Button trigger modal -->
  75. <!-- Modal -->
  76. <div class="modal fade" id="otadiv" tabindex="-1" role="dialog" aria-labelledby="fwProgressLabel" aria-hidden="true">
  77. <div class="modal-dialog" role="document">
  78. <div class="modal-content">
  79. <div class="modal-header">
  80. <h5 class="modal-title" id="fwProgressLabel">Upgrade Progress</h5>
  81. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  82. <span aria-hidden="true">&times;</span>
  83. </button>
  84. </div>
  85. <div class="modal-body">
  86. <span id="flash-status"></span>
  87. <div class="progress" id="progress">
  88. <div class="progress-bar" role="progressbar" aria-valuemin="0" aria-valuemax="100" style="width:0%">
  89. 0%
  90. </div>
  91. </div>
  92. </div>
  93. <div class="modal-footer">
  94. <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
  95. </div>
  96. </div>
  97. </div>
  98. </div>
  99. <div id="myTabContent" class="tab-content">
  100. <div class="tab-pane fade" id="tab-cfg-hw"></div>
  101. <div class="tab-pane fade" id="tab-cfg-syst"></div>
  102. <div class="tab-pane fade" id="tab-cfg-gen"></div>
  103. <div class="tab-pane fade" id="tab-cfg-fw">
  104. <div class="card text-white mb-3">
  105. <div class="card-header">Software Updates</div>
  106. <div class="card-body">
  107. <table class="table table-hover table-striped table-dark">
  108. <thead>
  109. <tr>
  110. <th class="border-bottom-0 pb-0" scope="col">Version</th>
  111. <th class="border-bottom-0 pb-0" scope="col">Date/Time</th>
  112. <th class="border-bottom-0 pb-0" scope="col">Platform</th>
  113. <th class="border-bottom-0 pb-0" scope="col">Branch</th>
  114. <th class="border-bottom-0 pb-0" scope="col">Bit Depth</th>
  115. </tr>
  116. <tr>
  117. <th class="border-top-0 pt-0" scope="col"><input class="form-control-sm upSrch"
  118. id="svrs" type="text" placeholder="search releases"></th>
  119. <th class="border-top-0 pt-0" scope="col"></th>
  120. <th class="border-top-0 pt-0" scope="col"><input class="form-control-sm upSrch"
  121. id="splf" type="text" placeholder="search platform"></th>
  122. <th class="border-top-0 pt-0" scope="col"><select class="form-control-sm upSrch"
  123. id="fwbranch">
  124. <option selected="">Choose FW branch</option>
  125. </select>
  126. <th class="border-top-0 pt-0" scope="col"><input class="form-control-sm upSrch"
  127. id="bits" type="text" placeholder="search bit depth"></th>
  128. </th>
  129. </tr>
  130. </thead>
  131. <tbody id="rTable"></tbody>
  132. </table>
  133. <div class="form-group row">
  134. <div class="col-auto">
  135. <button type="button" id="chkUpdates" class="btn btn-info btn-sm">Check for
  136. updates</button>
  137. </div>
  138. <label class="col-auto col-form-label" for="fw-url-input">Firmware URL</label>
  139. <div class="col">
  140. <input type="text" class="form-control"
  141. placeholder="select entry from list or enter known url" id="fw-url-input">
  142. </div>
  143. <div class="col-auto">
  144. <button type="button" id='start-flash' data-toggle="modal" data-target="#uCnfrm"
  145. class="btn btn-warning btn-sm" style="display: none;">Flash Firmware</button>
  146. </div>
  147. <div class="col-auto">
  148. <button class="btn-warning ota_element" type="submit" onclick="handleReboot('recovery');" >Recovery</button>
  149. </div>
  150. </div>
  151. </div>
  152. </div>
  153. <div class="modal" id="uCnfrm">
  154. <div class="modal-dialog modal-dialog-centered" role="document">
  155. <div class="modal-content">
  156. <div class="modal-header">
  157. <h5 class="modal-title">Firmware Flash</h5>
  158. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  159. <span aria-hidden="true">&times;</span>
  160. </button>
  161. </div>
  162. <div class="modal-body">
  163. <p>Flash URL <span id="selectedFWURL" class="text-break"></span> to device?</p>
  164. </div>
  165. <div class="modal-footer ">
  166. <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
  167. <button type="button" class="btn btn-warning" data-dismiss="modal"
  168. onclick="hFlash();">Ok</button>
  169. </div>
  170. </div>
  171. </div>
  172. </div>
  173. <div class="card text-white mb-3" >
  174. <div class="card-header">Local Firmware Upload</div>
  175. <div class="card-body">
  176. <div id="uploaddiv" class="form-group row">
  177. <label for="flashfilename" class="col-auto col-form-label">Local File</label>
  178. <div class="col">
  179. <input type="file" class="form-control-file" id="flashfilename" aria-describedby="fileHelp">
  180. </div>
  181. <div class="col-auto">
  182. <div class="buttons">
  183. <button type="button" class="btn btn-danger" id="fwUpload">Upload!</button>
  184. </div>
  185. </div>
  186. </div>
  187. </div>
  188. </div>
  189. </div>
  190. <div class="tab-pane fade" id="tab-nvs">
  191. <table class="table table-hover">
  192. <thead>
  193. <tr>
  194. <th scope="col">Key</th>
  195. <th scope="col">Value</th>
  196. </tr>
  197. </thead>
  198. <tbody id="nvsTable">
  199. </tbody>
  200. </table>
  201. <div class="buttons">
  202. <button button id="reboot-button" class="btn btn-primary" style="float:right" type="submit" onclick="handleReboot('reboot');" >Reboot</button>
  203. <input id="save-nvs" type="button" class="btn btn-success" value="Commit">
  204. <input id="save-as-nvs" type="button" class="btn btn-success" value="Download config">
  205. <input id="load-nvs" type="button" class="btn btn-success" value="Load File">
  206. <input aria-describedby="fileHelp" onchange="onChooseFile(event, onFileLoad.bind(this))"
  207. id="nvsfilename" type="file" style="display:none">
  208. </div>
  209. </div>
  210. <div class="tab-pane fade" id="tab-cfg-audio">
  211. <div class="card text-white mb-3">
  212. <div class="card-header">Usage Templates</div>
  213. <div class="card-body">
  214. <fieldset>
  215. <fieldset class="form-group" id="output-tmpl">
  216. <legend>Output</legend>
  217. <div class="form-check">
  218. <label class="form-check-label">
  219. <input type="radio" class="form-check-input" name="output-tmpl" id="i2s">
  220. I2S Dac
  221. </label>
  222. </div>
  223. <div class="form-check">
  224. <label class="form-check-label">
  225. <input type="radio" class="form-check-input" name="output-tmpl" id="spdif">
  226. SPDIF
  227. </label>
  228. </div>
  229. <div class="form-check">
  230. <label class="form-check-label">
  231. <input type="radio" class="form-check-input" name="output-tmpl" id="bt">
  232. Bluetooth
  233. </label>
  234. </div>
  235. </fieldset>
  236. <div class="form-group"><label for="player">Player Name</label><input type="text"
  237. class="form-control " placeholder="Squeezelite" id="player"></div>
  238. <div class="form-group"><label for="optional">Optional setting (e.g. for LMS IP
  239. address)</label><input type="text" class="form-control" id="optional"></div>
  240. <div class="form-group">
  241. <div class="form-check">
  242. <label class="form-check-label">
  243. <input class="form-check-input" type="checkbox" id="disable-squeezelite" value=""
  244. checked="">
  245. Disable Squeezelite
  246. </label>
  247. </div>
  248. </div>
  249. <div class="toast show" role="alert" aria-live="assertive" aria-atomic="true"
  250. style="display: none;" id="toast_cfg-audio-tmpl">
  251. <div class="toast-header"><strong class="mr-auto">Result</strong><button type="button"
  252. class="ml-2 mb-1 close" data-dismiss="toast" aria-label="Close"
  253. onclick="hideSurrounding(this)"><span aria-hidden="true">×</span></button></div>
  254. <div class="toast-body" id="msg_cfg-audio-tmpl"></div>
  255. </div>
  256. <button id="save-autoexec1" type="submit" class="btn btn-info" cmdname="cfg-audio-tmpl"
  257. onclick="saveAutoexec1(false)">Save</button>
  258. <button id="commit-autoexec1" type="submit" class="btn btn-warning" cmdname="cfg-audio-tmpl"
  259. onclick="saveAutoexec1(true)">Apply</button>
  260. </fieldset>
  261. </div>
  262. </div>
  263. </div>
  264. <div class="tab-pane fade active show" id="tab-wifi">
  265. <div class="card text-white mb-3">
  266. <div class="card-header">WiFi Status</div>
  267. <div class="card-body">
  268. <table class="table table-hover">
  269. <thead>
  270. <tr>
  271. <th scope="col">Joined</th>
  272. <th scope="col">Name</th>
  273. <th scope="col">Signal</th>
  274. <th scope="col">Security</th>
  275. </tr>
  276. </thead>
  277. <tbody id="wifiTable"></tbody>
  278. </table>
  279. <button type="button" id="updateAP" class="btn btn-info btn-sm">Scan</button>
  280. </div>
  281. <div class="modal" id="WiFiDisconnectConfirm">
  282. <div class="modal-dialog modal-dialog-centered" role="document">
  283. <div class="modal-content">
  284. <div class="modal-header">
  285. <h5 class="modal-title">Disconnect</h5>
  286. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  287. <span aria-hidden="true">&times;</span>
  288. </button>
  289. </div>
  290. <div class="modal-body">
  291. <p>Disconnect from network? After disconnecting, the system won't be accessible from
  292. the current address and will expose itself as access point name <span
  293. id="apName"></span> with password <span id="apPass"></span> </p>
  294. </div>
  295. <div class="modal-footer connecting-success connecting-status">
  296. <button type="button" class="btn btn-secondary" data-dismiss="modal">Cancel</button>
  297. <button type="button" class="btn btn-warning" data-dismiss="modal"
  298. onclick="handleDisconnect();">Ok</button>
  299. </div>
  300. </div>
  301. </div>
  302. </div>
  303. <div class="modal" id="WifiConnectDialog">
  304. <div class="modal-dialog modal-dialog-centered" role="document">
  305. <div class="modal-content">
  306. <div class="modal-header">
  307. <h5 class="modal-title connecting connecting-init connecting-fail">Connect to WiFi
  308. </h5>
  309. <h5 class="modal-title connecting-status connecting-success">Status</h5>
  310. <button type="button" class="close" data-dismiss="modal" aria-label="Close">
  311. <span aria-hidden="true">&times;</span>
  312. </button>
  313. </div>
  314. <div class="modal-body">
  315. <fieldset class="connecting-init connecting-fail">
  316. <div class="form-group"><label for="manual_ssid">Wifi Name</label><input type="text"
  317. class="form-control" placeholder="Enter Name" id="manual_ssid"></div>
  318. <div class="form-group"><label for="manual_pwd">Password</label><input
  319. type="password" class="form-control" placeholder="Enter Name"
  320. id="manual_pwd"></div>
  321. </fieldset>
  322. <div id="connect-wait" class="connecting">
  323. <div>Connecting to <span id="ssid-wait"></span> </div>
  324. <div>
  325. You may lose wifi access while the esp32 recalibrates
  326. its radio. Please
  327. wait until your device automatically reconnects. This can take up to
  328. 30s.
  329. </div>
  330. </div>
  331. <div id="connect-success" class="connecting-success connecting-status">
  332. <div> Connected to Access Point : <span id="connectedToSSID"></span></div>
  333. <div> Device IP address : <span id="ipAddress"></span></div>
  334. <div>Subnet Mask:<span id="netmask"></span></div>
  335. <div>Default Gateway:<span id="gateway"></span></div>
  336. </div>
  337. <div id="connect-fail" class="connecting-fail">
  338. <h3 class="text-error">Connection failed</h3>
  339. <p>Please double-check wifi password if any and make sure the access point has
  340. good signal.</p>
  341. </div>
  342. </div>
  343. <div class="modal-footer ">
  344. <button type="button"
  345. class="btn btn-secondary connecting-init connecting-fail connecting"
  346. data-dismiss="modal">Close</button>
  347. <button type="button" id="btnJoin"
  348. class="btn btn-primary connecting-init connecting-fail"
  349. onclick="handleConnect();">Join</button>
  350. <button type="button" class="connecting btn btn-primary" disabled>
  351. <span class="spinner-border spinner-border-sm" role="status"
  352. aria-hidden="true"></span>
  353. <span class="sr-only">Connecting...</span></button>
  354. </div>
  355. <div class="modal-footer connecting-success connecting-status justify-content-between" style=""><button type="button"
  356. class="btn btn-primary" data-dismiss="modal">Ok</button><button type="button" class="btn btn-danger"
  357. data-toggle="modal" data-dismiss="modal" data-target="#WiFiDisconnectConfirm">Disconnect</button>
  358. </div>
  359. </div>
  360. </div>
  361. </div>
  362. </div>
  363. </div>
  364. <div class="tab-pane fade " id="tab-commands">
  365. <fieldset id="commands-list"></fieldset>
  366. </div>
  367. <!-- Status -->
  368. <div class="tab-pane fade " id="tab-syslog">
  369. <div class="card border-primary mb-3">
  370. <div class="card-header">Logs</div>
  371. <div class="card-body">
  372. <table class="table table-hover">
  373. <thead>
  374. <tr>
  375. <th scope="col">Timestamp</th>
  376. <th scope="col">Message</th>
  377. </tr>
  378. </thead>
  379. <tbody id="syslogTable">
  380. </tbody>
  381. </table>
  382. <div class="buttons">
  383. <input id="clear-syslog" type="button" class="btn btn-danger btn-sm" value="Clear" />
  384. </div>
  385. </div>
  386. </div>
  387. <div class="card border-primary mb-3" id="pins" style="display: none;">
  388. <div class="card-header">Pin Assignments</div>
  389. <div class="card-body">
  390. <table class="table table-hover">
  391. <thead>
  392. <tr>
  393. <th scope="col">Device</th>
  394. <th scope="col">Pin Name</th>
  395. <th scope="col">GPIO Number</th>
  396. <th scope="col">Type</th>
  397. </tr>
  398. </thead>
  399. <tbody id="gpiotable"></tbody>
  400. </table>
  401. </div>
  402. </div>
  403. <div class="card border-primary mb-3" style="visibility: collapse;" id="tasks_sect">
  404. <div class="card-header">Tasks</div>
  405. <div class="card-body">
  406. <table class="table table-hover">
  407. <!-- console.log(msg_time.toLocaleString() + '\tname' + '\tcpu' + '\tstate' + '\tminstk' + '\tbprio' + '\tcprio' + '\tnum'); -->
  408. <thead>
  409. <tr>
  410. <th scope="col">#</th>
  411. <th scope="col">Task Name</th>
  412. <th scope="col">CPU</th>
  413. <th scope="col">State</th>
  414. <th scope="col">Min Stack</th>
  415. <th scope="col">Base Priority</th>
  416. <th scope="col">Cur Priority</th>
  417. </tr>
  418. </thead>
  419. <tbody id="tasks"></tbody>
  420. </table>
  421. </div>
  422. </div>
  423. </div>
  424. <!-- syslog -->
  425. <div class="tab-pane fade " id="tab-credits">
  426. <div class="card text-white mb-3">
  427. <div class="card-header">Credits</div>
  428. <div class="card-body">
  429. <p><strong><a
  430. href="https://github.com/sle118/squeezelite-esp32">squeezelite-esp32</a><br></strong>&copy;
  431. 2020, philippe44, sle118, daduke<br /><a href="https://opensource.org/licenses/MIT">This
  432. software is released under the MIT License.</a></p>
  433. <p>
  434. This app would not be possible without the following libraries:
  435. </p>
  436. <ul>
  437. <li>squeezelite, &copy; 2012-2019, Adrian Smith and Ralph Irving. Licensed under the GPL
  438. License.</li>
  439. <li>esp32-wifi-manager, &copy; 2017-2019, Tony Pottier. Licensed under the MIT License.</li>
  440. <li>SpinKit, &copy; 2015, Tobias Ahlin. Licensed under the MIT License.</li>
  441. <li>jQuery, The jQuery Foundation. Licensed under the MIT License.</li>
  442. <li>cJSON, &copy; 2009-2017, Dave Gamble and cJSON contributors. Licensed under the MIT
  443. License.
  444. </li>
  445. <li>esp32-rotary-encoder, &copy; 2011-2019, David Antliff and Ben Buxton. Licensed under the
  446. GPL
  447. License.</li>
  448. <li>tarablessd1306, &copy; 2017-2018, Tara Keeling. Licensed under the MIT license.</li>
  449. </ul>
  450. </div>
  451. </div>
  452. <div class="card text-white mb-3">
  453. <div class="card-header">Extras/Overrides</div>
  454. <div class="card-body">
  455. <fieldset>
  456. <div class="form-check">
  457. <label class="form-check-label"><input type="checkbox" id="show-nvs"
  458. class="form-check-input " value="">Show NVS Editor</label>
  459. </div>
  460. </fieldset>
  461. <fieldset>
  462. <div class="form-check">
  463. <label class="form-check-label"><input type="checkbox" id="show-commands"
  464. class="form-check-input " value="">Show Advanced Commands</label>
  465. </div>
  466. </fieldset>
  467. </div>
  468. </div>
  469. </div>
  470. <!-- credits -->
  471. </div>
  472. </div>
  473. </main>
  474. <footer>
  475. <div class="fixed-bottom d-flex justify-content-between border-top border-dark p-3 bg-primary">
  476. <span class="text-center" id="foot-fw"></span><button class="btn-warning ota_element " id="reboot_nav"
  477. type="submit" onclick="handleReboot('reboot');" style="display: none;">Reboot</button>
  478. <button class="btn-warning recovery_element" id="reboot_ota_nav" type="submit" onclick="handleReboot('reboot_ota');"
  479. style="display: none;">Exit Recovery</button><span class="text-center" id="foot-wifi"></span>
  480. </div>
  481. </footer>
  482. </body>
  483. </html>