- $C
Check Mode
повертає
 [MSG:Enabled]
 [MSG:Disabled]
 

- Soft Reset (Ctrl+X (0x18 = 24))

+ Імпорт фідерів у проєкт. Коли у проєкті вже є фідери не замінюються таблиця підходу.

- Компенсація люфтів
- Zoom

----------------------------------------------
- Рух без зупинок при зміні швидкості подачі:
----------------------------------------------
Треба у функціях позбавитися G0. перейти на G1 з вказанням подачі:

async pnpSafetyGoToXYZ(x, y, z)
async pnpGoToXYZA(x, y, z, a)
async pnpGoToXYZF(x, y, z, feed)
pnpSafetyUp(a)

Спробувати обєднати функції:
async pnpGoToXYZA(x, y, z, a)
async pnpGoToXYZF(x, y, z, feed)

Зробити функції типу 
pnpSafetyGoToXYZ_cmd(x, y, z)
які б повертали б масив команд, використовувати їх у функціях типу pnpSafetyGoToXYZ
тоді можна буде їх використовувати для створення пулу команд і відправлят їх 
sendCommands(cmdArray, wailIdle=false)
тоді рух має бути без зупинок.

Функції pnpPutOnNozzle, pnpPullOffNozzle переробити. pnpPullOffNozzle повертає false, якщо пройшли перевірки. Винести перевірки в окрему функцію.
Тоді можна буде в один пул зібрати команди зняття і одягання сопла. Це має прибрати мікрозупинки


Функція відправки пула команд приблизно така:

    async testMove() {
      console.log('testMove Start')
      let commands = ['G0 X-100 Y-100 Z-25', 'G1 Z-35 F300', 'G1 Z-50 F600']
      for (let cmd of commands) {
        await this.sendCommand(cmd)
      }
      await this.sendCommands(['?'], true)
      console.log('testMove Stop')
    }

await this.sendCommand(cmd) - запихує команди без очікування виконання. Це дає змогу планувальнику grblHAL нормально рухати без проміжної зупинки
await this.sendCommands(['?'], true) - Чекає на закінчення всього пулу

----------------------------------------------


