Господа, а вот у меня вопрос:
В G коде принтеров используется формат чисел с плавающей точкой?
Например для перемещения, вместо: "G1 X10.5 Y10 Z0.5" так:"G1 X1.05e+1 Y1e+1 Z5e-1" ???
К чему это я? Колупаю прошивку GRBL, наткнулся на жесткий косяк в виде оверхедов парсера: Прием строки символов, перевод символов в число формата int, потом перевод этого числа в формат float, а потом перевод его опять в int
Решил посмотреть реализацию парсера в marlin и... Вощем там совсем все плохо. Если в GRBL попытались оптимизировать преобразование строки в число функцией trunc() и самописной read_float(), то в marlin тупо применили тяжеловесную strtod
Вот у меня и вопрос, если в G коде нет чисел с плавающей точкой (я не обнаружил), то можно заменить strtod более легковесными быстрыми функциями. Или поимею уход от стандарта? Но почему тогда в GRBL так сделали?
Для понимания ужаса говнокода:
Парсер принимает строку "G1", символ "1" преобразует в число float, потом это число преобразуется в int и только после этого делается разбор синтаксиса оператором switch
- Код: Выделить всё • Развернуть
switch((int)code_value())
{
case 0: // G0 -> G1
case 1: // G1
if(Stopped == false) {
get_coordinates(); // For X Y Z E F
prepare_move();
//ClearToSend();
return;
}
break;
case 2: // G2 - CW ARC
if(Stopped == false) {
get_arc_coordinates();
prepare_arc_move(true);
return;
}
break;
...
float code_value()
{
return (strtod(&cmdbuffer[bufindr][strchr_pointer - cmdbuffer[bufindr] + 1], NULL));
}