C ++の16行3Dプリンターホストコントローラー

この記事はJSの30ページに対する一種の回答ですが、その登場の理由は非常に実用的な問題でした。



先日、詳細を印刷する必要があったときに、おなじみのRepetier Hostが起動しなかったことが突然判明し、4.0以上が必要なときにMonoバージョン(4.26)との非互換性を主張しました。 これがクロスプラットフォームです。



添付の構成スクリプトを起動した後、長い間、何かがダウンロードおよびインストールされましたが、何も機能しませんでした。 誰が責任を負い、何をしたくないのかわからなかったので、次の作業ツールの候補であるCuraに移りました。 私はそれを試しました-それは機能しますが、そこに手動でプリントヘッドを移動することはできません、Curaの新しいバージョンをグーグル-レビューによると、彼らはそこからRepRapプリンターを削除しました。



さて、大丈夫、私は決めました、それはGコードをシリアルポートに送信するためのフォームであり、あなた自身が迅速になると約束したものを書くことです。 これらのコードを探しているときに、この記事から素晴らしいプログラムに出会いました。それはまさにあなたが必要としたものですが、決定はすでになされています。 そして、ここで何が起こったのです:



#include <unistd.h> #include <fcntl.h> #include <stdint.h> #include <FL/Fl_Button.H> #include <FL/Fl_Window.H> #include <FL/Fl_Counter.H> #include <FL/Fl_Widget.H> #include <FL/Fl.H> const char* data[] = { "X move", "G90\nG1 X%.1f F3000\n", "Y move", "G90\nG1 Y%.1f F3000\n", "Z move", "G90\nG1 Z%.1f F3000\n", "Extrude", "G90\nG1 E%.1f F3000\n", "End", "M303 E0 S%.1f\n", "Bed", "M303 E1 S%.1f\n", "X home", "G28 X0\n", "Y home", "G28 Y0\n", "Z home", "G28 Z0\n", "Beep", "M300 S3000 P100\n", "End Off", "M303 E0 S0\n", "Bed Off", "M303 E1 S0\n" }; Fl_Counter* counters[6]; int buff[10]; int main() { Fl_Window window(310, 310, "Host control"); window.begin(); for (int i = 0; i < 12; i++) { Fl_Widget* widget = i < 6 ? (Fl_Widget*) (counters[i] = new Fl_Counter(10, 10 + i * 50, 200, 30, data[i * 2])) : (Fl_Widget*) new Fl_Button(220, 10 + (i - 6) * 50, 80, 30, data[i * 2]); if (i < 6) ((Fl_Counter*) widget)->step(1, 10); widget->user_data((int*) i); widget->callback([](Fl_Widget* w, void* inner) {if (write(buff[9] == 0 ? (buff[9] = open("/dev/ttyUSB0", O_RDWR | O_NONBLOCK | O_NDELAY)) : buff[9], (char*) buff, sprintf((char*) buff, data[1 + 2 * reinterpret_cast<uintptr_t> (inner)], ((Fl_Counter*) w)->value())) > 0 && reinterpret_cast<uintptr_t> (inner) < 9 && reinterpret_cast<uintptr_t> (inner) >= 6) counters[reinterpret_cast<uintptr_t> (inner) - 6]->value(0);}); } window.end(); window.show(); return Fl::run(); }
      
      





データ[]は読みやすさのためだけに壊れています。1行で考えます。 残りの行はすべて見栄えがよくありませんが、数回のハックの後の数は美しいラウンド数になりました。



ご覧のとおり、データ[]行はgcode-nameのペアに分割されています。これにより、これらの行を反復処理する単一のループで、このデータのかなりの数のウィジェット(ボタンとカウンター)を描画できます。 ボタンとカウンターはどちらもラムダ式の形式でイベントリスナーに渡されますが、残念ながらFLTKは実際のラムダを理解しないため、変数をキャプチャできませんが、ウィジェットにポインターを渡すことができます。 。 ウィジェット番号はポインターにキャストされ、ラムダ内でポインターが整数にキャストバックされるため、ラムダは呼び出し元のウィジェットの番号を見つけることができます。



さらにこの番号では、gcodeの空白がデータ[]から取得され、ラムダ引数の番号がカウンタから呼び出された場合は置換され、コードがシリアルポートに書き込まれます。 良い方法では、データ転送速度を示す必要がありますが、たまたまプリンタが115200しか理解していないにもかかわらず、巻き上げられたため、そのままにしておきました。 別のハック-int []はsprintf()のバッファとして使用され、配列の最後の要素を使用してopen()ファイル記述子を格納できるようにしました。



その結果、16行のコードごとに12のウィジェットがあり、ウィジェットごとにほぼ1行であり、興味深い結果でした。 コマンドg ++ main.cpp -lfltk -o 3dhostを使用してコンパイルできます。fltk-develパッケージをシステムにインストールする必要があります。



リポジトリへのリンク。 私は完全なアプリケーションまで他の何かを終えるかどうかはわかりませんが、冗談ではありません。 ちなみに、同様に、ボタンのコードと名前を置き換えるだけで、シリアルポートを介して他のほとんどのデバイスを制御できます。



All Articles