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