/*
Copywrite 2016 Will Winder, Phil
This file is part of Universal Gcode Sender (UGS).
UGS is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
UGS is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with UGS. If not, see <http://www.gnu.org/licenses/>.
*/
package com.willwinder.universalgcodesender.types;
import com.willwinder.universalgcodesender.model.UnitUtils;
import com.willwinder.universalgcodesender.utils.GrblLookups;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang3.StringUtils;
/**
* Created by Phil on 1/15/2016.
*/
public class GrblSettingMessage {
final private static GrblLookups lookups = new GrblLookups("setting_codes");
final String message;
// Starting in GRBL 1.1 the description is disabled by default.
final private static Pattern MESSAGE_REGEX =
Pattern.compile("\\$(\\d+)=([^ ]*)\\s?\\(?([^\\)]*)?\\)?");
// Setting number
private String setting;
// Setting value
private String value;
// Units of setting
private String units;
// Long description of setting
private String description;
// Short description of setting
private String shortDescription;
/* Sample settings.
$0=10 (step pulse, usec)
$1=25 (step idle delay, msec)
$2=0 (step port invert mask:00000000)
$3=0 (dir port invert mask:00000000)
$4=0 (step enable invert, bool)
$5=0 (limit pins invert, bool)
$6=0 (probe pin invert, bool)
$10=3 (status report mask:00000011)
$11=0.010 (junction deviation, mm)
$12=0.002 (arc tolerance, mm)
$13=0 (report inches, bool)
$20=0 (soft limits, bool)
$21=0 (hard limits, bool)
$22=0 (homing cycle, bool)
$23=0 (homing dir invert mask:00000000)
$24=25.000 (homing feed, mm/min)
$25=500.000 (homing seek, mm/min)
$26=250 (homing debounce, msec)
$27=1.000 (homing pull-off, mm)
$100=250.000 (x, step/mm)
$101=250.000 (y, step/mm)
$102=250.000 (z, step/mm)
$110=5000.000 (x max rate, mm/min)
$111=5000.000 (y max rate, mm/min)
$112=500.000 (z max rate, mm/min)
$120=400.000 (x accel, mm/sec^2)
$121=400.000 (y accel, mm/sec^2)
$122=10.000 (z accel, mm/sec^2)
$130=200.000 (x max travel, mm)
$131=200.000 (y max travel, mm)
$132=200.000 (z max travel, mm)
*/
public GrblSettingMessage(String message) {
this.message = message;
parse();
}
@Override
public String toString() {
String descriptionStr = "";
if (!StringUtils.isEmpty(description)) {
if (!StringUtils.isEmpty(units)) {
descriptionStr = " (" + shortDescription + ", " + units + ")";
} else {
descriptionStr = " (" + description + ")";
}
}
return String.format("$%s = %s %s", setting, value, descriptionStr);
}
public String getSetting() {
return setting;
}
public String getUnits() {
return units;
}
public String getValue() {
return value;
}
public String getDescription() {
return description;
}
private void parse() {
Matcher m = MESSAGE_REGEX.matcher(message);
if (m.find()) {
setting = m.group(1);
value = m.group(2);
if (m.groupCount() == 3 && !StringUtils.isEmpty(m.group(3))) {
description = m.group(3);
} else {
String[] lookup = lookups.lookup(setting);
if (lookup != null) {
units = lookup[2];
description = lookup[3];
shortDescription = lookup[1];
}
}
}
}
public boolean isReportingUnits() {
return "13".equals(setting);
}
public UnitUtils.Units getReportingUnits() {
if (isReportingUnits()) {
if ("0".equals(value)) {
return UnitUtils.Units.MM;
} else if ("1".equals(value)) {
return UnitUtils.Units.INCH;
}
}
return UnitUtils.Units.UNKNOWN;
}
}