From 1ef4c6ae910d41e8d534f2fe98254e5eb56fbca8 Mon Sep 17 00:00:00 2001 From: Nico Rey Date: Sat, 3 Oct 2020 17:26:43 -0300 Subject: [PATCH] add webpanel files --- templates/webpanel/Config.php | 7 ++ templates/webpanel/Controller/C_predict.php | 6 ++ .../webpanel/Controller/C_showDetail.php | 8 ++ .../webpanel/Controller/C_showLastImage.php | 6 ++ .../webpanel/Controller/C_showLastImages.php | 11 ++ templates/webpanel/Controller/index.html | 0 templates/webpanel/Model/Conn.php | 74 +++++++++++++ templates/webpanel/Model/index.html | 0 templates/webpanel/Views/V_viewDetail.php | 23 ++++ templates/webpanel/Views/V_viewLastImage.php | 24 +++++ templates/webpanel/Views/V_viewLastImages.php | 42 ++++++++ templates/webpanel/Views/V_viewPasses.php | 24 +++++ templates/webpanel/Views/index.html | 0 templates/webpanel/detail.php | 7 ++ templates/webpanel/footer.php | 6 ++ templates/webpanel/header.php | 27 +++++ templates/webpanel/index.php | 7 ++ templates/webpanel/language/en.php | 15 +++ templates/webpanel/language/es.php | 15 +++ templates/webpanel/logo-small.png | Bin 0 -> 16850 bytes templates/webpanel/passes.php | 5 + templates/webpanel/style.css | 99 ++++++++++++++++++ 22 files changed, 406 insertions(+) create mode 100644 templates/webpanel/Config.php create mode 100644 templates/webpanel/Controller/C_predict.php create mode 100644 templates/webpanel/Controller/C_showDetail.php create mode 100644 templates/webpanel/Controller/C_showLastImage.php create mode 100644 templates/webpanel/Controller/C_showLastImages.php create mode 100644 templates/webpanel/Controller/index.html create mode 100644 templates/webpanel/Model/Conn.php create mode 100644 templates/webpanel/Model/index.html create mode 100644 templates/webpanel/Views/V_viewDetail.php create mode 100644 templates/webpanel/Views/V_viewLastImage.php create mode 100644 templates/webpanel/Views/V_viewLastImages.php create mode 100644 templates/webpanel/Views/V_viewPasses.php create mode 100644 templates/webpanel/Views/index.html create mode 100644 templates/webpanel/detail.php create mode 100644 templates/webpanel/footer.php create mode 100644 templates/webpanel/header.php create mode 100644 templates/webpanel/index.php create mode 100644 templates/webpanel/language/en.php create mode 100644 templates/webpanel/language/es.php create mode 100755 templates/webpanel/logo-small.png create mode 100644 templates/webpanel/passes.php create mode 100644 templates/webpanel/style.css diff --git a/templates/webpanel/Config.php b/templates/webpanel/Config.php new file mode 100644 index 0000000..2279883 --- /dev/null +++ b/templates/webpanel/Config.php @@ -0,0 +1,7 @@ + '/images/', + 'img_per_page' => 12, + 'lang' => 'es' +); +?> diff --git a/templates/webpanel/Controller/C_predict.php b/templates/webpanel/Controller/C_predict.php new file mode 100644 index 0000000..f5b519e --- /dev/null +++ b/templates/webpanel/Controller/C_predict.php @@ -0,0 +1,6 @@ +getPasses(); + require('Views/V_viewPasses.php'); +?> diff --git a/templates/webpanel/Controller/C_showDetail.php b/templates/webpanel/Controller/C_showDetail.php new file mode 100644 index 0000000..13b378c --- /dev/null +++ b/templates/webpanel/Controller/C_showDetail.php @@ -0,0 +1,8 @@ +getEnhacements($pass_id); + $path = $con->getPath($pass_id); + require('Views/V_viewDetail.php'); +?> diff --git a/templates/webpanel/Controller/C_showLastImage.php b/templates/webpanel/Controller/C_showLastImage.php new file mode 100644 index 0000000..83e6bd6 --- /dev/null +++ b/templates/webpanel/Controller/C_showLastImage.php @@ -0,0 +1,6 @@ +getLastImage(); + require('Views/V_viewLastImage.php'); +?> diff --git a/templates/webpanel/Controller/C_showLastImages.php b/templates/webpanel/Controller/C_showLastImages.php new file mode 100644 index 0000000..80084ce --- /dev/null +++ b/templates/webpanel/Controller/C_showLastImages.php @@ -0,0 +1,11 @@ +img_per_page; + $page_count = $con->totalPages($img_per_page); + if ($page < 1) $page = 1; + if ($page > $page_count) $page = $page_count; + $images = $con->getImages($page, $img_per_page); + require('Views/V_viewLastImages.php'); +?> diff --git a/templates/webpanel/Controller/index.html b/templates/webpanel/Controller/index.html new file mode 100644 index 0000000..e69de29 diff --git a/templates/webpanel/Model/Conn.php b/templates/webpanel/Model/Conn.php new file mode 100644 index 0000000..b60fb51 --- /dev/null +++ b/templates/webpanel/Model/Conn.php @@ -0,0 +1,74 @@ +con = new SQLite3("/home/pi/raspberry-noaa/panel.db"); + } + + public function getPasses() { + $today = strtotime(date('Y-m-d', time())); + $query = $this->con->query("SELECT sat_name, is_active, + pass_start, pass_end, + max_elev FROM predict_passes + WHERE (pass_start > $today) ORDER BY + pass_start ASC;"); + $passes = []; + $i = 0; + while($row = $query->fetchArray()){ + $passes[$i] = $row; + $i++; + } + return $passes; + } + + public function totalPages($img_per_page) { + $total_pages = $this->con->querySingle("SELECT count() from decoded_passes;"); + return ceil($total_pages/$img_per_page); + } + + public function getImages($page, $img_per_page) { + $query = $this->con->prepare("SELECT decoded_passes.id, predict_passes.pass_start, + file_path, is_noaa, predict_passes.sat_name, predict_passes.max_elev + FROM decoded_passes INNER JOIN predict_passes + ON predict_passes.pass_start = decoded_passes.pass_start + ORDER BY decoded_passes.pass_start DESC LIMIT ? OFFSET ?;"); + $query->bindValue(1, $img_per_page); + $query->bindValue(2, $img_per_page * ($page-1)); + $result = $query->execute(); + $images = []; + $i = 0; + while($row = $result->fetchArray()){ + $images[$i] = $row; + $i++; + } + return $images; + } + + public function getEnhacements($id) { + $query = $this->con->prepare('SELECT daylight_pass, is_noaa + FROM decoded_passes WHERE id = ?;'); + $query->bindValue(1, $id); + $result = $query->execute(); + $pass = $result->fetchArray(); + if ($pass['is_noaa'] == 0) { + $enhacements = ['-122-rectified.jpg']; + } else { + if ($pass['daylight_pass'] == 1) { + $enhacements = ['-ZA.jpg','-MCIR.jpg','-MCIR-precip.jpg','-MSA.jpg','-MSA-precip.jpg','-HVC.jpg','-HVC-precip.jpg','-HVCT.jpg','-HVCT-precip.jpg']; + } else { + $enhacements = ['-ZA.jpg','-MCIR.jpg','-MCIR-precip.jpg']; + } + } + return $enhacements; + } + + public function getPath($id) { + $query = $this->con->prepare('SELECT file_path FROM decoded_passes + WHERE id = ?;'); + $query->bindValue(1, $id); + $result = $query->execute(); + $image = $result->fetchArray(); + return $image['file_path']; + } + } +?> diff --git a/templates/webpanel/Model/index.html b/templates/webpanel/Model/index.html new file mode 100644 index 0000000..e69de29 diff --git a/templates/webpanel/Views/V_viewDetail.php b/templates/webpanel/Views/V_viewDetail.php new file mode 100644 index 0000000..2d457c2 --- /dev/null +++ b/templates/webpanel/Views/V_viewDetail.php @@ -0,0 +1,23 @@ +
+ + base_url; + foreach ($enhacements as $enhacement) { + if($row_count%3==0) { + echo ""; + $col_count=1; + } + echo ""; + } + $row_count++; + $col_count++; + } + ?> +
"; + if($col_count==3) { + echo "
+
+ + diff --git a/templates/webpanel/Views/V_viewLastImage.php b/templates/webpanel/Views/V_viewLastImage.php new file mode 100644 index 0000000..57cf7e5 --- /dev/null +++ b/templates/webpanel/Views/V_viewLastImage.php @@ -0,0 +1,24 @@ + + base_url; + foreach ($images as $image) { + if($row_count%3==0) { + echo ""; + $col_count=1; + } + echo ""; + if($col_count==3) { + echo ""; + } + $row_count++; + $col_count++; + } + ?> +
"; + echo "
  • ". $image['sat_name'] ."
  • "; + echo "
  • ". date('d/m/Y H:i:s', $image['pass_start']) ."
+ + + diff --git a/templates/webpanel/Views/V_viewLastImages.php b/templates/webpanel/Views/V_viewLastImages.php new file mode 100644 index 0000000..81f187d --- /dev/null +++ b/templates/webpanel/Views/V_viewLastImages.php @@ -0,0 +1,42 @@ +
+ + 1) { + echo ""; + } else { + echo ""; + } + echo ""; + if ($page < $page_count) { + echo ""; + } else { + echo ""; + } + $row_count=0; + $col_count=0; + $baseurl = $configs->base_url; + foreach ($images as $image) { + if($row_count%3==0) { + echo ""; + $col_count=1; + } + if ($image['is_noaa'] == true) { + $ending = "-MCIR.jpg"; + } else { + $ending = "-122-rectified.jpg"; + } + echo ""; + if($col_count==3) { + echo ""; + } + $row_count++; + $col_count++; + } + ?> +
" . $lang['prev'] . "
" . $lang['page'] . " $page " . $lang['of'] . " $page_count" . $lang['next'] . "
"; + echo "
  • ". $image['sat_name'] ."
  • "; + echo "
  • " . $lang['elev'] . ": ". $image['max_elev'] ."°
  • "; + echo "
  • ". date('d/m/Y H:i:s', $image['pass_start']) ."
+
+ + diff --git a/templates/webpanel/Views/V_viewPasses.php b/templates/webpanel/Views/V_viewPasses.php new file mode 100644 index 0000000..cf8cd2b --- /dev/null +++ b/templates/webpanel/Views/V_viewPasses.php @@ -0,0 +1,24 @@ +
+ + + + + + + + "; + } else { + echo ""; + } + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + } + ?> +
". $pass['sat_name'] ."". date('H:i:s', $pass['pass_start']) ."". date('H:i:s', $pass['pass_end']) ."". $pass['max_elev'] ."
+
diff --git a/templates/webpanel/Views/index.html b/templates/webpanel/Views/index.html new file mode 100644 index 0000000..e69de29 diff --git a/templates/webpanel/detail.php b/templates/webpanel/detail.php new file mode 100644 index 0000000..a11d8d6 --- /dev/null +++ b/templates/webpanel/detail.php @@ -0,0 +1,7 @@ + diff --git a/templates/webpanel/footer.php b/templates/webpanel/footer.php new file mode 100644 index 0000000..02bc661 --- /dev/null +++ b/templates/webpanel/footer.php @@ -0,0 +1,6 @@ + + + + diff --git a/templates/webpanel/header.php b/templates/webpanel/header.php new file mode 100644 index 0000000..5efac7e --- /dev/null +++ b/templates/webpanel/header.php @@ -0,0 +1,27 @@ +lang; + include_once('language/' . $lang . '.php'); +?> + + + + + + + + <?= isset($PageTitle) ? $PageTitle : "Raspberry NOAA"?> + + +
+ " href="passes.php"> + " href="index.php"> +
+
+ + diff --git a/templates/webpanel/index.php b/templates/webpanel/index.php new file mode 100644 index 0000000..ddaa13c --- /dev/null +++ b/templates/webpanel/index.php @@ -0,0 +1,7 @@ + diff --git a/templates/webpanel/language/en.php b/templates/webpanel/language/en.php new file mode 100644 index 0000000..5373e27 --- /dev/null +++ b/templates/webpanel/language/en.php @@ -0,0 +1,15 @@ + "Passes", + "satellite" => "Satellite", + "images" => "Images", + "pass_start" => "Pass start", + "pass_end" => "Pass end", + "max_elev" => "Max elevation", + "elev" => "Elevation", + "page" => "Page", + "of" => "of", + "prev" => "Prev", + "next" => "Next", +); +?> diff --git a/templates/webpanel/language/es.php b/templates/webpanel/language/es.php new file mode 100644 index 0000000..0b4e507 --- /dev/null +++ b/templates/webpanel/language/es.php @@ -0,0 +1,15 @@ + "Pasadas", + "satellite" => "Satélite", + "images" => "Imagenes", + "pass_start" => "Inicio", + "pass_end" => "Fin", + "max_elev" => "Elevación", + "elev" => "Elevación", + "page" => "Página", + "of" => "de", + "prev" => "Anterior", + "next" => "Siguiente", +); +?> diff --git a/templates/webpanel/logo-small.png b/templates/webpanel/logo-small.png new file mode 100755 index 0000000000000000000000000000000000000000..5ec241b66a9b6b73e41ef0eaa83f3e4846cec258 GIT binary patch literal 16850 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 tMVUsJ1jazd1wBpB`5`g1=lr#b_Ft7qH) diff --git a/templates/webpanel/style.css b/templates/webpanel/style.css new file mode 100644 index 0000000..e17a0bb --- /dev/null +++ b/templates/webpanel/style.css @@ -0,0 +1,99 @@ +body { + margin: 0; + font-family: Arial, Helvetica, sans-serif; +} + +.container { + margin: 20px auto; + max-width: 800px; +} + +.topnav { + overflow: hidden; + background-color: #333; +} + +.topnav a { + float: left; + color: #f2f2f2; + text-align: center; + padding: 14px 16px; + text-decoration: none; + font-size: 17px; +} + +.topnav a:hover { + background-color: #ddd; + color: black; +} + +.topnav a.active { + background-color: #4CAF50; + color: white; +} + +#passes { + font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; + border-collapse: collapse; + max-width: 500px; + width: 100%; + margin: auto; +} + +#passes.img-grid { + max-width: 700px; +} + +#passes td, +#passes th { + border: 1px solid #ddd; + padding: 8px; +} + +#passes tr:nth-child(even) { + background-color: #f2f2f2; +} + + +/* #passes tr:hover {background-color: #ddd;} */ + +#passes th { + padding-top: 12px; + padding-bottom: 12px; + background-color: #4CAF50; + text-align: center; + color: white; +} + +#passes tr.inactive { + color: lightgray; +} + +#satimg { + max-width: 200px; + max-height: 200px; + width: 100%; +} + +#satimgdiv { + width: 100%; + height: 100%; + max-width: 200px; + background-color: antiquewhite; + /* margin: 10px; */ + display: inline-block; + vertical-align: middle; + text-align: center; +} + +footer { + /* position: absolute; */ + margin: 20px; + bottom: 0; + max-width: 100%; + text-align: center; +} + +img.img-footer { + max-width: 100%; +} \ No newline at end of file