/*
*
* Goko
* Copyright (C) 2013 PsyKo
*
* This program 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.
*
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.goko.controller.g2core.controller;
import org.goko.controller.tinyg.commons.ITinyGStatus;
import org.goko.core.common.exception.GkException;
import org.goko.core.common.exception.GkFunctionalException;
/**
* TinyG Status code enumeration
*
* @see https://github.com/synthetos/TinyG/wiki/TinyG-Status-Codes
* @author PsyKo
*
*/
public enum G2CoreStatusCode implements ITinyGStatus {
STAT_UNKNOWN(-1,""),
STAT_OK(0,"Function completed OK"),
STAT_ERROR(1,"Generic error return (EPERM)"),
STAT_EAGAIN(2,"Function would block here (call again)"),
STAT_NOOP(3,"Function had no-operation"),
STAT_COMPLETE(4,"Operation is complete"),
STAT_SHUTDOWN(5,"Operation was shutdown (terminated gracefully)"),
STAT_PANIC(6,"System panic (not graceful)"),
STAT_EOL(7,"Function returned end-of-line"),
STAT_EOF(8,"Function returned end-of-file"),
STAT_FILE_NOT_OPEN(9,""),
STAT_FILE_SIZE_EXCEEDED(10,""),
STAT_NO_SUCH_DEVICE(11,""),
STAT_BUFFER_EMPTY(12,""),
STAT_BUFFER_FULL(13,""),
STAT_BUFFER_FULL_FATAL(14,""),
STAT_INITIALIZING(15,"Initializing - not ready for use"),
STAT_ENTERING_BOOT_LOADER(16,"This code actually emitted from boot loader, not g2"),
STAT_FUNCTION_IS_STUBBED(17,""),
STAT_ALARM(18,"System alarm triggered"),
STAT_NO_DISPLAY(19,"Suppress results display - presumably handled upstream"),
// Internal errors and startup messages
STAT_INTERNAL_ERROR(20,"Unrecoverable internal error"),
STAT_INTERNAL_RANGE_ERROR(21,"Number range other than by user input"),
STAT_FLOATING_POINT_ERROR(22,"Number conversion error"),
STAT_DIVIDE_BY_ZERO(23,""),
STAT_INVALID_ADDRESS(24,""),
STAT_READ_ONLY_ADDRESS(25,""),
STAT_INIT_FAILURE(26,""),
STAT_ERROR_27(27,"Was ALARMED in 0.97"),
STAT_FAILED_TO_GET_PLANNER_BUFFER(28,""),
STAT_GENERIC_EXCEPTION_REPORT(29,"Used for test"),
STAT_PREP_LINE_MOVE_TIME_IS_INFINITE(30,""),
STAT_PREP_LINE_MOVE_TIME_IS_NAN(31,""),
STAT_FLOAT_IS_INFINITE(32,""),
STAT_FLOAT_IS_NAN(33,""),
STAT_PERSISTENCE_ERROR(34,""),
STAT_BAD_STATUS_REPORT_SETTING(35,""),
STAT_FAILED_GET_PLANNER_BUFFER(36,""),
// Assertion failures - build down from 99 until they meet the system internal errors
STAT_BUFFER_FREE_ASSERTION_FAILURE(88,""),
STAT_STATE_MANAGEMENT_ASSERTION_FAILURE(89,""),
STAT_CONFIG_ASSERTION_FAILURE(90,""),
STAT_XIO_ASSERTION_FAILURE(91,""),
STAT_ENCODER_ASSERTION_FAILURE(92,""),
STAT_STEPPER_ASSERTION_FAILURE(93,""),
STAT_PLANNER_ASSERTION_FAILURE(94,""),
STAT_CANONICAL_MACHINE_ASSERTION_FAILURE(95,""),
STAT_CONTROLLER_ASSERTION_FAILURE(96,""),
STAT_STACK_OVERFLOW(97,""),
STAT_MEMORY_FAULT(98,"Generic memory corruption detected by magic numbers"),
STAT_GENERIC_ASSERTION_FAILURE(99,"Generic assertion failure - unclassified"),
// Application and data input errors
// Generic data input errors
STAT_UNRECOGNIZED_NAME(100,"Parser didn't recognize the name"),
STAT_INVALID_OR_MALFORMED_COMMAND(101,"Malformed line to parser"),
STAT_BAD_NUMBER_FORMAT(102,"Number format error"),
STAT_UNSUPPORTED_TYPE(103,"An otherwise valid JSON type is not supported"),
STAT_PARAMETER_IS_READ_ONLY(104,"Input error: parameter cannot be set"),
STAT_PARAMETER_CANNOT_BE_READ(105,"Input error: parameter cannot be returned"),
STAT_COMMAND_NOT_ACCEPTED(106,"Input error: command cannot be accepted at this time"),
STAT_INPUT_EXCEEDS_MAX_LENGTH(107,"Input error: input string is too long"),
STAT_INPUT_LESS_THAN_MIN_VALUE(108,"Input error: value is under minimum"),
STAT_INPUT_EXCEEDS_MAX_VALUE(109,"Input error: value is over maximum"),
STAT_INPUT_VALUE_RANGE_ERROR(110,"Input error: value is out-of-range"),
STAT_JSON_SYNTAX_ERROR(111,"JSON input string is not well formed"),
STAT_JSON_TOO_MANY_PAIRS(112,"JSON input string has too many JSON pairs"),
STAT_JSON_OUTPUT_TOO_LONG(113,"JSON output exceeds buffer size"),
STAT_NESTED_TXT_CONTAINER(114,"JSON 'txt' fields cannot be nested"),
STAT_MAX_DEPTH_EXCEEDED(115,"JSON exceeded maximum nesting depth"),
STAT_VALUE_TYPE_ERROR(116,"JSON value does not agree with variable type"),
// Gcode errors and warnings (Most originate from NIST - by concept, not number)
STAT_GCODE_GENERIC_INPUT_ERROR(130,"Generic error for gcode input"),
STAT_GCODE_COMMAND_UNSUPPORTED(131,"G command is not supported"),
STAT_MCODE_COMMAND_UNSUPPORTED(132,"M command is not supported"),
STAT_GCODE_MODAL_GROUP_VIOLATION(133,"Gcode modal group error"),
STAT_GCODE_AXIS_IS_MISSING(134,"Command requires at least one axis present"),
STAT_GCODE_AXIS_CANNOT_BE_PRESENT(135,"Error if G80 has axis words"),
STAT_GCODE_AXIS_IS_INVALID(136,"An axis is specified that is illegal for the command"),
STAT_GCODE_AXIS_IS_NOT_CONFIGURED(137,"WARNING: attempt to program an axis that is disabled"),
STAT_GCODE_AXIS_NUMBER_IS_MISSING(138,"Axis word is missing its value"),
STAT_GCODE_AXIS_NUMBER_IS_INVALID(139,"Axis word value is illegal"),
STAT_GCODE_ACTIVE_PLANE_IS_MISSING(140,"Active plane is not programmed"),
STAT_GCODE_ACTIVE_PLANE_IS_INVALID(141,"Active plane selected is not valid for this command"),
STAT_GCODE_FEEDRATE_NOT_SPECIFIED(142,"Move has no feedrate"),
STAT_GCODE_INVERSE_TIME_MODE_CANNOT_BE_USED(143,"G38.2 and some canned cycles cannot accept inverse time mode"),
STAT_GCODE_ROTARY_AXIS_CANNOT_BE_USED(144,"G38.2 and some other commands cannot have rotary axes"),
STAT_GCODE_G53_WITHOUT_G0_OR_G1(145,"G0 or G1 must be active for G53"),
STAT_REQUESTED_VELOCITY_EXCEEDS_LIMITS(146,""),
STAT_CUTTER_COMPENSATION_CANNOT_BE_ENABLED(147,""),
STAT_PROGRAMMED_POINT_SAME_AS_CURRENT_POINT(148,""),
STAT_SPINDLE_SPEED_BELOW_MINIMUM(149,""),
STAT_SPINDLE_SPEED_MAX_EXCEEDED(150,""),
STAT_SPINDLE_MUST_BE_OFF(151,""),
STAT_SPINDLE_MUST_BE_TURNING(152,"Some canned cycles require spindle to be turning when called"),
STAT_ARC_ERROR_RESERVED(153,"RESERVED"),
STAT_ARC_HAS_IMPOSSIBLE_CENTER_POINT(154,"Trap (.05 inch/.5 mm) OR ((.0005 inch/.005mm) AND .1% of radius condition"),
STAT_ARC_SPECIFICATION_ERROR(155,"Generic arc specification error"),
STAT_ARC_AXIS_MISSING_FOR_SELECTED_PLANE(156,"Arc is missing axis (axes) required by selected plane"),
STAT_ARC_OFFSETS_MISSING_FOR_SELECTED_PLANE(157,"One or both offsets are not specified"),
STAT_ARC_RADIUS_OUT_OF_TOLERANCE(158,"WARNING - radius arc is too large - accuracy in question"),
STAT_ARC_ENDPOINT_IS_STARTING_POINT(159,""),
STAT_P_WORD_IS_MISSING(160,"P must be present for dwells and other functions"),
STAT_P_WORD_IS_INVALID(161,"Generic P value error"),
STAT_P_WORD_IS_ZERO(162,""),
STAT_P_WORD_IS_NEGATIVE(163,"Dwells require positive P values"),
STAT_P_WORD_IS_NOT_AN_INTEGER(164,"G10s and other commands require integer P numbers"),
STAT_P_WORD_IS_NOT_VALID_TOOL_NUMBER(165,""),
STAT_D_WORD_IS_MISSING(166,""),
STAT_D_WORD_IS_INVALID(167,""),
STAT_E_WORD_IS_MISSING(168,""),
STAT_E_WORD_IS_INVALID(169,""),
STAT_H_WORD_IS_MISSING(170,""),
STAT_H_WORD_IS_INVALID(171,""),
STAT_L_WORD_IS_MISSING(172,""),
STAT_L_WORD_IS_INVALID(173,""),
STAT_Q_WORD_IS_MISSING(174,""),
STAT_Q_WORD_IS_INVALID(175,""),
STAT_R_WORD_IS_MISSING(176,""),
STAT_R_WORD_IS_INVALID(177,""),
STAT_S_WORD_IS_MISSING(178,""),
STAT_S_WORD_IS_INVALID(179,""),
STAT_T_WORD_IS_MISSING(180,""),
STAT_T_WORD_IS_INVALID(181,""),
// g2core errors and warnings
STAT_GENERIC_ERROR(200,""),
STAT_MINIMUM_LENGTH_MOVE(201,"Move is less than minimum length"),
STAT_MINIMUM_TIME_MOVE(202,"Move is less than minimum time"),
STAT_LIMIT_SWITCH_HIT(203,"A limit switch was hit causing shutdown"),
STAT_COMMAND_REJECTED_BY_ALARM(204,"Command was not processed because machine is alarmed"),
STAT_COMMAND_REJECTED_BY_SHUTDOWN(205,"Command was not processed because machine is shutdown"),
STAT_COMMAND_REJECTED_BY_PANIC(206,"Command was not processed because machine is paniced"),
STAT_KILL_JOB(207,"^d received (job kill)"),
STAT_NO_GPIO(208,"No GPIO exists for this value"),
STAT_TEMPERATURE_CONTROL_ERROR(209,"Temperature controls err'd out"),
STAT_SOFT_LIMIT_EXCEEDED(220,"Soft limit error - axis unspecified"),
STAT_SOFT_LIMIT_EXCEEDED_XMIN(221,"Soft limit error - X minimum"),
STAT_SOFT_LIMIT_EXCEEDED_XMAX(222,"Soft limit error - X maximum"),
STAT_SOFT_LIMIT_EXCEEDED_YMIN(223,"Soft limit error - Y minimum"),
STAT_SOFT_LIMIT_EXCEEDED_YMAX(224,"Soft limit error - Y maximum"),
STAT_SOFT_LIMIT_EXCEEDED_ZMIN(225,"Soft limit error - Z minimum"),
STAT_SOFT_LIMIT_EXCEEDED_ZMAX(226,"Soft limit error - Z maximum"),
STAT_SOFT_LIMIT_EXCEEDED_AMIN(227,"Soft limit error - A minimum"),
STAT_SOFT_LIMIT_EXCEEDED_AMAX(228,"Soft limit error - A maximum"),
STAT_SOFT_LIMIT_EXCEEDED_BMIN(229,"Soft limit error - B minimum"),
STAT_SOFT_LIMIT_EXCEEDED_BMAX(220,"Soft limit error - B maximum"),
STAT_SOFT_LIMIT_EXCEEDED_CMIN(231,"Soft limit error - C minimum"),
STAT_SOFT_LIMIT_EXCEEDED_CMAX(232,"Soft limit error - C maximum"),
STAT_SOFT_LIMIT_EXCEEDED_ARC(233,"Soft limit err on arc"),
STAT_HOMING_CYCLE_FAILED(240,"Homing cycle did not complete"),
STAT_HOMING_ERROR_BAD_OR_NO_AXIS(241,""),
STAT_HOMING_ERROR_ZERO_SEARCH_VELOCITY(242,""),
STAT_HOMING_ERROR_ZERO_LATCH_VELOCITY(243,""),
STAT_HOMING_ERROR_TRAVEL_MIN_MAX_IDENTICAL(244,""),
STAT_HOMING_ERROR_NEGATIVE_LATCH_BACKOFF(245,""),
STAT_HOMING_ERROR_HOMING_INPUT_MISCONFIGURED(246,""),
STAT_HOMING_ERROR_MUST_CLEAR_SWITCHES_BEFORE_HOMING(247,""),
STAT_ERROR_248(248,""),
STAT_ERROR_249(249,""),
STAT_PROBE_CYCLE_FAILED(250,"Probing cycle did not complete"),
STAT_PROBE_TRAVEL_TOO_SMALL(251,""),
STAT_NO_PROBE_SWITCH_CONFIGURED(252,""),
STAT_MULTIPLE_PROBE_SWITCHES_CONFIGURED(253,""),
STAT_PROBE_SWITCH_ON_ABC_AXIS(254,""),
STAT_ERROR_255(255,"");
public static final int SEVERITY_INFO = 1;
public static final int SEVERITY_ERROR = 2;
public static final int SEVERITY_WARNING = 4;
/** The integer value of the status */
private int value;
/** The label of the status */
private String label;
/** Severity level */
private int severity;
/**
* Constructor
* @param value la valeur enti�re de l'erreur
* @param label le libell� de l'erreur
*/
G2CoreStatusCode(int value, String label){
this.value = value;
this.label = label;
this.severity = SEVERITY_ERROR;
}
/**
* Constructor
* @param value la valeur enti�re de l'erreur
* @param label le libell� de l'erreur
*/
G2CoreStatusCode(int value, String label, int severity){
this.value = value;
this.label = label;
this.severity = severity;
}
/** (inheritDoc)
* @see org.goko.controller.tinyg.controller.ITinyGStatus#getValue()
*/
@Override
public int getValue() {
return value;
}
/** (inheritDoc)
* @see org.goko.controller.tinyg.controller.ITinyGStatus#getLabel()
*/
@Override
public String getLabel() {
return label;
}
/**
* Return the enum value with the given integer value
* @param value the value to search
* @return TinyGStatusCode
* @throws GkException GkException
*/
public static ITinyGStatus getEnum(int value) throws GkException{
for (ITinyGStatus statusCode : values()) {
if(statusCode.getValue() == value){
return statusCode;
}
}
throw new GkFunctionalException("TinyG Status Code with integer value "+value+" does not exist");
}
/**
* Return the enum value with the given integer value if it exists
* @param value the value to search
* @return TinyGStatusCode
* @throws GkException GkException
*/
public static ITinyGStatus findEnum(int value) throws GkException{
for (ITinyGStatus statusCode : values()) {
if(statusCode.getValue() == value){
return statusCode;
}
}
return null;
}
/** (inheritDoc)
* @see org.goko.controller.tinyg.controller.ITinyGStatus#isWarning()
*/
@Override
public boolean isWarning(){
return severity == SEVERITY_WARNING;
}
/** (inheritDoc)
* @see org.goko.controller.tinyg.controller.ITinyGStatus#isError()
*/
@Override
public boolean isError(){
return severity == SEVERITY_ERROR;
}
}