From 882fb2a2ae51266c77e964554290b032d73e2b84 Mon Sep 17 00:00:00 2001
From: Erik Strand <erik.strand@cba.mit.edu>
Date: Thu, 9 May 2019 23:54:52 -0400
Subject: [PATCH] Go more OO

---
 node_board/main.cpp       | 109 +++++++++++++++++++++++++++-----------
 node_board/png_writer.cpp |  19 ++++---
 node_board/png_writer.h   |   1 +
 3 files changed, 93 insertions(+), 36 deletions(-)

diff --git a/node_board/main.cpp b/node_board/main.cpp
index 3db1107..81f77ef 100644
--- a/node_board/main.cpp
+++ b/node_board/main.cpp
@@ -1,6 +1,76 @@
 #include "png_writer.h"
 #include <iostream>
 
+//--------------------------------------------------------------------------------------------------
+struct Rectangle {
+    uint32_t x_min;
+    uint32_t x_max;
+    uint32_t y_min;
+    uint32_t y_max;
+};
+
+//--------------------------------------------------------------------------------------------------
+class Board {
+public:
+    Board(double width, double height, double pix_per_mm, double min_cut_thickness)
+    : width_(width), height_(height), pix_per_mm_(pix_per_mm),
+      min_cut_thickness_(min_cut_thickness), width_px_(to_px(width_)), height_px_(to_px(height_)),
+      min_cut_thickness_px_(to_px(min_cut_thickness_))
+    {
+        png_writer_.allocate(width_px_, height_px_);
+        png_writer_.set_all_pixels(255);
+    }
+
+    uint32_t to_px(double x) {
+        return static_cast<uint32_t>(pix_per_mm_ * x);
+    }
+
+    void set_pixel(uint32_t x, uint32_t y, uint8_t value = 255) {
+        png_writer_.set_pixel(x, height_px_ - y - 1, value);
+    }
+
+    void draw_rectangle(
+        uint32_t x_min, uint32_t x_max, uint32_t y_min, uint32_t y_max, uint8_t value = 255
+    ) {
+        for (uint32_t x = x_min; x <= x_max; ++x) {
+            for (uint32_t y = y_min; y <= y_max; ++y) {
+                set_pixel(x, y, value);
+            }
+        }
+    }
+
+    void draw_rectangle(
+        double x_min, double x_max, double y_min, double y_max, uint8_t value = 255
+    ) {
+        draw_rectangle(to_px(x_min), to_px(x_max), to_px(y_min), to_px(y_max), value);
+    }
+
+    void draw_rectangle(Rectangle const& r, uint8_t value = 255) {
+        draw_rectangle(r.x_min, r.x_max, r.y_min, r.y_max, value);
+    }
+
+    void draw_pad(double x_min, double x_max, double y_min, double y_max) {
+        draw_rectangle(x_min - min_cut_thickness_, x_max + min_cut_thickness_,
+                       y_min - min_cut_thickness_, y_max + min_cut_thickness_,
+                       0);
+        draw_rectangle(x_min, x_max, y_min, y_max, 255);
+    }
+
+    void save(char const* filename) {
+        png_writer_.write(filename);
+    }
+
+public:
+    PngWriter png_writer_;
+    double width_;
+    double height_;
+    double pix_per_mm_;
+    double min_cut_thickness_;
+    uint32_t width_px_;
+    uint32_t height_px_;
+    uint32_t min_cut_thickness_px_;
+};
+
 //--------------------------------------------------------------------------------------------------
 // All length measurements are in mm.
 int main() {
@@ -10,24 +80,12 @@ int main() {
     double pad_y_min;
     double pad_y_max;
 
-    double ppmm = 50;
-    auto const to_px = [ppmm](double x) {
-        return static_cast<uint32_t>(ppmm * x);
-    };
-
-    // overall board dims
+    // board params
     double const width = 6;
     double const height = 14;
-    uint32_t const width_px = to_px(width);
-    uint32_t const height_px = to_px(height);
-
-    PngWriter png_writer;
-    png_writer.allocate(width_px, height_px);
-    png_writer.set_all_pixels_black();
-
-    auto const set_pixel = [&png_writer, height_px](uint32_t x, uint32_t y) {
-        png_writer.set_pixel(x, height_px - y - 1, 255);
-    };
+    double const ppmm = 50;
+    double const min_cut_thickness = 0.4;
+    Board board(width, height, ppmm, min_cut_thickness);
 
     // SOIC dims
     double const pad_width = 0.5;
@@ -42,26 +100,16 @@ int main() {
     for (uint32_t i = 0; i < 4; ++i) {
         pad_x_min = soic_pos_x + i * soic_pitch;
         pad_x_max = pad_x_min + pad_width;
-
         pad_y_min = soic_pos_y;
         pad_y_max = pad_y_min + pad_height;
-        for (uint32_t x = to_px(pad_x_min); x < to_px(pad_x_max); ++x) {
-            for (uint32_t y = to_px(pad_y_min); y < to_px(pad_y_max); ++y) {
-                set_pixel(x, y);
-            }
-        }
-
+        board.draw_pad(pad_x_min, pad_x_max, pad_y_min, pad_y_max);
         pad_y_min = height - pad_y_max;
         pad_y_max = pad_y_min + pad_height;
-        for (uint32_t x = to_px(pad_x_min); x < to_px(pad_x_max); ++x) {
-            for (uint32_t y = to_px(pad_y_min); y < to_px(pad_y_max); ++y) {
-                set_pixel(x, y);
-            }
-        }
+        board.draw_pad(pad_x_min, pad_x_max, pad_y_min, pad_y_max);
     }
 
     // Cable attachment dims
-    double const min_cut_thickness = 0.4;
+    /*
     double const cable_pad_height = 2.4;
     pad_x_min = (width - 2 * min_cut_thickness) / 3;
     pad_x_max = pad_x_min + min_cut_thickness;
@@ -72,8 +120,9 @@ int main() {
             set_pixel(x, y);
         }
     }
+    */
 
-    png_writer.write("node_board_traces.png");
+    board.save("node_board_traces.png");
 
     return 0;
 }
diff --git a/node_board/png_writer.cpp b/node_board/png_writer.cpp
index c7da4af..ac2e471 100644
--- a/node_board/png_writer.cpp
+++ b/node_board/png_writer.cpp
@@ -47,17 +47,24 @@ void PngWriter::set_pixel(int32_t x, int32_t y, uint8_t value) {
     px[2] = value;
 }
 
+//..................................................................................................
+void PngWriter::set_all_pixels(uint8_t value) {
+    for (int y = 0; y < height_; y++) {
+        png_bytep row = row_pointers_[y];
+        for (int x = 0; x < width_; x++) {
+            png_bytep px = &(row[x * 3]);
+            px[0] = value;
+            px[1] = value;
+            px[2] = value;
+        }
+    }
+}
+
 //..................................................................................................
 void PngWriter::set_all_pixels_black() {
     for (int y = 0; y < height_; y++) {
         std::memset(row_pointers_[y], 0, row_size());
     }
-    //for(int x = 0; x < width; x++) {
-    //    png_bytep px = &(row[x * 3]);
-    //    px[0] = 0;
-    //    px[1] = 0;
-    //    px[2] = 0;
-    //}
 }
 
 //..................................................................................................
diff --git a/node_board/png_writer.h b/node_board/png_writer.h
index 7bedff0..6f65af4 100644
--- a/node_board/png_writer.h
+++ b/node_board/png_writer.h
@@ -13,6 +13,7 @@ public:
     void allocate(int32_t width, int32_t height);
     png_bytep* row_pointers() { return row_pointers_; }
     void set_pixel(int32_t x, int32_t y, uint8_t value = 255);
+    void set_all_pixels(uint8_t value);
     void set_all_pixels_black();
     void write(char const* filename);
 
-- 
GitLab