OctoPrintのソース解読

HTML上のprintボタンを押す
→data-bindのclickにprintが指定されている(index.jinja2)
→knowckout.jsにより_jobCommand(start)が
走る(static/js/viewmodels/printerstate.js)
→_jobCommandは$ajaxAPI_BASEURL/jobに
{command: comand}というJSONをPOSTする
→/jobの挙動は/server/api/job.pyに記載
startコマンドの場合、printer.startPrint()を起動
→printerインスタンスはserver/__init__.pyにて
printer = Printer(gcodeManager)
としてインスタンシエートされている。
→Printerクラスは/printer.pyにて定義されている
→PrinterクラスのインスタンスメソッドstartPrint()は
self._comm.startPrint()を起動する
→self._commは同一クラス内のメソッドdef connectで
self._comm = comm.MachineCom(port, baudrate, callbackObject=self)
として定義されている。
→commはoctoprint.util.commとして文頭でインポートされている
→/util/comm.pyのMachineCommのインスタンスメソッド
startPrint()は以下の5つの関数を呼び出す。
(1) self._currentFile.start()
_currenFiletはPrintingGCodeInformationのインスタンス
これのstart()メソッドはfilehandleをfilenameで初期化、
_lineCount及び_startTime変数をNoneで初期化する。
(2) wasPaused = self.isPaused()
STATE_PAUSEDかどうか確認する
(3) self._changeState(self.STATE_PRINTING)
oldStateをnewStateで更新する??
(4) eventManager().fire(Events.PRINT_STARTED, {
"file": self._currentFile.getFilename(),
"filename": os.path.basename(self._currentFile.getFilename()),
"origin": self._currentFile.getFileLocation()
})
eventManagerクラスはoctoprint.eventsで定義されている
→eventManagerインスタンスはEventManager()インスタンスを返す
→EventManager()インスタンスのfireメソッドは
self._queue.put((event, payload), 0)を返す
(i)eventはEvents.PRINT_STARTED, payloadは3つの情報のJSON
(ii)self._queue はQueue.PriorityQueue()として定義
**********************
ここでutil/comm.pyを見てみる。
import Queue as queueとしてインポートされている。
self._commandQueue=queue.Queue()としてインスタンス化。
**********************
(5)fire()の最後の処理として_sendNext()が呼び出される
→line=self.currentFile.getNext()として一行づつ読み出すループが走る
→そのlineに対してself._sendCommand(line)が呼び出される
→_sendCommandはself._doSend(cmd)を読み出す
→_doSend()は_doSendWithoutCheckSum()を呼び出す
→_doSendWithoutCheckSum()は
self._serial.write(cmd+’\n’)を呼び出す:これが知りたかった


すなわちOctoPrintは一行ずつファイルを読み込んで
Pyserialでシリアル送信している。