<!DOCTYPE html>
<html lang="en">
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>Data Frog SF2000 Firmware Version Checker</title>
    <meta name="viewport" content="width=device-width">
    <link rel="stylesheet" href="tools.css">
  </head>
  <body>
    <h1>Data Frog SF2000 Firmware Version Checker</h1>
    <p>This simple tool will just check an SF2000 firmware/BIOS file against a list of known versions, and tell you which version it is. You can <a href="https://vonmillhausen.github.io/sf2000/#firmwarebios-bisrvasd">learn more about firmware revisions for the SF2000 here</a>.</p>
    <hr>
    <div id="steps">
      <section id="bisrvSection">
        <h2>Select Your <code>bisrv.asd</code></h2>
        <p>Select the <code>bisrv.asd</code> firmware file whose version you want to check. You can find the <code>bisrv.asd</code> file in the <code>bios</code> folder on your microSD card.</p>
        <div id="bisrvMessages"></div>
        <div class="controlContainer">
          <label class="control">Open <code>bisrv.asd</code>: <input id="bisrvSelector" type="file" accept=".asd" onchange="bisrvLoad(event.target.files[0])"></label>
        </div>
      </section>
    </div>
    <script src="tools.js"></script>
    <script type="text/javascript">

      // Global variables...
      var bisrvData;    // Used to store the binary data from the bisrv.asd file

      // This function is triggered when the person selects a file...
      function bisrvLoad(file) {

        // Read in the contents of the selected file as array buffer...
        var frBisrv = new FileReader();
        frBisrv.readAsArrayBuffer(file);
        frBisrv.onload = function(event) {

          // Clear any old messages...
          document.getElementById("bisrvMessages").innerHTML = "";

          // Read the provided file's data into an array...
          bisrvData = new Uint8Array(event.target.result);

          // We'll do a hash-check against it...
          hashResult = getFirmwareHash(bisrvData);

          // The result could be either a Promise if it had a bisrv.asd-like structure and we got
          // a hash, or false otherwise... let's check!
          if (hashResult instanceof Promise) {

            // We got a Promise! Wait for it to finish so we get our bisrv.asd hash...
            hashResult.then(function(dataHash) {

              // Check the hash against all the known good ones...
              switch (knownHash(dataHash)) {

                // Mid-March BIOS...
                case "03.15":
                  setMessage("info", "bisrvMessages", "Mid-March <code>bisrv.asd</code> detected. Newer firmware is available, see link above for more information.");
                  break;

                // April 20th BIOS...
                case "04.20":
                  setMessage("info", "bisrvMessages", "April 20th <code>bisrv.asd</code> detected. Newer firmware is available, see link above for more information.");
                  break;

                // May 15th BIOS...
                case "05.15":
                  setMessage("info", "bisrvMessages", "May 15th <code>bisrv.asd</code> detected. Newer firmware is available, see link above for more information.");
                  break;

                // May 22nd BIOS...
                case "05.22":
                  setMessage("info", "bisrvMessages", "May 22nd <code>bisrv.asd</code> detected. Newer firmware is available, see link above for more information.");
                  break;
                
                // August 3rd BIOS...
                case "08.03":
                  setMessage("info", "bisrvMessages", "August 3rd <code>bisrv.asd</code> detected. This is the latest known official firmware version.");
                  break;

                default:
                  // Huh... wasn't false so had bisrv.asd structure, but didn't return
                  // a known hash... a new BIOS version? Unknown anyway!
                  console.log(dataHash);
                  setMessage("error", "bisrvMessages", "While the file you've selected does appear to be generally structured like the SF2000's <code>bisrv.asd</code> firmware file, the specifics of your file don't match any known SF2000 firmware version.");
                  return;
              }
            });
          }
          else {

            // We got false, so whatever it was, it wasn't a bisrv.asd...
            setMessage("error", "bisrvMessages", "The file you've selected doesn't appear to have the same data structure as expected for a <code>bisrv.asd</code> file.");
            return;
          }
        };
      }
    </script>
    <hr>
    <p><a rel="license" href="https://creativecommons.org/publicdomain/zero/1.0/">CC0</a>: public domain. Version 1.0, 20231003.1</p>
  </body>
</html>