TODO ==== - Jonatan - [x] Få Yocto op at køre - [x] Teste ny skærmdriver - [ ] Gøre kassen færdig - [ ] Lav vinkelmodel - [ ] Gøre frontpladen større, tilføje solderpads (thermisk isoleret) Frontplate: - [ ] ADD: COPY/DUPLICATE/CLIPBOARD/CLONE - [ ] ADD: MAP/LEARN HARDWARE CHECKLIST ================== feature/rewrite --------------- - [x] Build skia in yocto - [x] Port skia test to yocto - [x] Finish recipes and commit otto-bsp/otto-meta repos - [x] Update to GCC 10.2 to solve this bug: https://godbolt.org/z/qeTM6P - [x] Wait till poky merges gcc 10.2 to master: https://git.yoctoproject.org/cgit/cgit.cgi/poky/tree/meta/recipes-devtools/gcc?h=master - [ ] Services - [x] Runtime - [x] LogicThread - [x] Graphics - [ ] Fonts - [x] Clear screen/ remove terminal? - [x] FBCP on yocto? - [x] Use https://github.com/juj/fbcp-ili9341 instead - [x] Config - [x] Design? - Let other (services) register config options - [x] Use something other than json for files? - [x] TOML: [toml11](https://github.com/ToruNiina/toml11) - [x] Comments & writing the config file? - toml11 supports comments, so we could have a `WithComment<int>` wrapper type to add descriptive comments, which would automatically be added to the config file. Then we would also write the config file on close, (or possibly on post-initialization.) - [x] Controller - [x] Implement MCU communicator - [x] Implement/test i2c controller - [x] LEDs - [ ] Implement/test usb/midi controller - [ ] MIDI communication over i2c (@jmidt) - [ ] Audio - [ ] StateManager - [ ] Presets - [x] Registry - [x] llvm-style generic registry class - [x] Allows easy setup of `REGISTER_X` macros - [x] Per-type Hardware Design --------------- 2-3 mm from underside of frontplate to AUX board 2.8 mm from underside of frontplate to upper edge of screw. This gives a distance of 2.8+(3/2) = 4.3 mm from frontplate/top of the box to the center of the screw. screw length: 6mm. Cutout for this should be 6 mm wide? Lengths from left AUX-board edge to fasteners: - Back: - 33.62 mm - 97.04 mm - 192.49 mm (short) - 272.67 mm (short) - Front: - 18.02 mm (short) - 90.02 mm (short) - 198.52 mm (short) - 270.52 mm (short) Size difference of frontplate to other boards: - Left/right: 291.5-288.5 = 3 mm - Front/Back: 98.4-95 = 3.4 mm From board to inner edge of box: - Front: 5 mm (Main reason is the power plug sticking out) - Sides: 2 mm Final size of frontplate: 294.55 mm -by- 102.03 mm. Subtract 2 mm from these to get inner dimensions of box Height calculations: - from inside to bottom of bottom of mainboard: at least 12 mm, since ethernet is 11mm. For some room, we choose 13 mm. With a sheet thickness of 1 mm, the length of the PEMs will be 14 mm. - Mainboard thiccness: 1.6mm - space from main- to aux-board: 6 mm - mainboard thiccness: 1.6mm - From aux-board to frontplate: 2.5-3 mm - This gives 24.7-25.2 mm as inside height of the box. We choose 25 mm as it is inbetween and nice and round. - This gives 2.8 mm from aux-board to frontplate Slots for fastening frontplate: - M3 screws are used, Let's do 3.2 mm holes. - 2.2 mm from bottom of right angle to edge of hole in right angle. - This gives 2.7+0.8 = 3.5 mm from top of box to middle of hole. - [ ] Front plate - [x] Make fastener 3D models - [x] Make fastener footprints - [x] Add screw terminals - [x] Make bigger, to fit case - [x] Make small rounded edges - [ ] OTTO logo and final touches? - [x] AUX Board - [x] Make space for screws / terminals (1-by-8 mm) - Needs to not cover anything vital for 12 mm at the back, (12-clearance) mm on front. Clearance is probably ~5 mm?) - [x] Back: Power/USB-B, USB-A, right of screen. Made big cutouts in back, none needed on other sides - [x] Rotate LEDs - [x] check that this is actually done - Markings are in the same corner as on the real hardware (pin 3) - [ ] Case - [x] PEMs - [x] Cutouts - [x] Find correct size of minijack plugs for cutouts - [x] Determine proper size of PEMs - [ ] Screw holes for terminals - [x] Determine proper size, to allow assembly Hardware Production ------------------- - [ ] Order 30 boxes - [ ] Make exhaustive list of parts/components needed/had - [ ] Include prices - [ ] Target: Sell 20 BETAs in 2020. Other stuff ----------- - Innobooster deadline 15 Nov - [ ] Deadline 1 Nov: First draft - https://www.techfunding.eu/innobooster/7251 ```cpp struct Widget { Widget(Anchor f) : func_anchor(f) {}; void draw(SkCanvas& ctx, int x, int y, int size_x, int size_y) { ctx.save(); // Translate func_anchor to draw_anchor std::array<int, 2> dv = diff_vec(draw_anchor, func_anchor, size_x, size_y); ctx.translate(dv[0], dv[1]); // Translate from origin to draw_anchor ctx.translate(x, y); draw_func(ctx, size_x, size_y); ctx.restore(); } void setAnchor(Anchor a) { draw_anchor = a; } Anchor draw_anchor; Anchor func_anchor; protected: virtual void do_draw(SkCanvas& ctx) = 0; } env = graphics::ADSREnvelope; struct ADSREnvelope : Widget { ADSREnvelope() : Widget(Anchor::NorthWest) {}; float a = 0, d = 0, s = 0, r = 0; void set_adsr(float a, float d);; protected: void do_draw(SkCanvas& ctx) final { } }; struct FuncWidget : Widget { FuncWidget(std::function<void(SkCanvas&)> func) : func_(func) {} protected: void do_draw(SkCanvas& ctx) override { func_(ctx); } private: std::function<void(SkCanvas&)> func_; }; template<typename Derived> struct Widget { void draw(SkCanvas& ctx) { // translate etc ctx.save(); static_cast<Derived*>(this)->do_draw(ctx, FWD(args)...); ctx.restore(); // restore etc } Box bounding_box; }; struct Env : Widget<Derived> { float a, d, s, r; void do_draw(SkCanvas& ctx) { ctx.translate(bounding_box.get_point(Anchors::center)); ctx.draw_an_envelope(); } }; struct Anchor { float x, float y; }; struct Anchors { static constexpr Anchor top_left = {0,0}; static constexpr Anchor bottom_right = {1,1}; }; struct Box { Box(); void bottom_right(Point p, Anchor a = Anchors::top_left) { top_left_ = } void size(Size p, Anchor a) { top_left_ = } private: Point top_left_; Size s; } struct Box { Box(Point, Size); Box(Point, SkPoint); void move_to(Point p, Anchor a); void resize(Size p, Anchor a) { top_left_ = } private: Anchor _a; Point top_left_; Size s; } Output<float> anim; Env env; env.bounding_box.top_left({120, 30}); env.bounding_box.bottom_right({120, 30}) env.bounding_box.size({20,20}); env.draw(ctx, 5.f); env.bounding_box = Box(TopLeft({3, 2}, Size(120,60 * anim)); env.draw(ctx, 5.f); // in draw() struct Screen { void draw(SkCanvas& ctx) { AdsrEnvelope adsr; adsr.size = {14, 24}; adsr.position = {whuptiod} adsr.anchor = Anchor::center; adsr.a = 3; adsr.draw(ctx); } }; FuncWidget widget = [] (SkCanvas& ctx) { } ```