int deviceAccelerometerGetInterface(unsigned char commandHeader, DeviceInterfaceMode mode, bool fillDeviceArgumentList) {
    if (commandHeader == COMMAND_ACCELEROMETER_GET_SAMPLE_COUNT) {
        if (fillDeviceArgumentList) {
            setFunction("getSampleCount", 0, 1);
            setResultUnsignedHex4(0, "Sample count");
        }
        return commandLengthValueForMode(mode, 0, 4);
    }
    else if (commandHeader == COMMAND_ACCELEROMETER_GET_SAMPLE_RAW_DATA) {
        if (fillDeviceArgumentList) {
            setFunction("Sample Raw Data", 0, 5);
            setResultUnsignedHex4(0, "X Raw Data");
            setResultSeparator(1);
            setResultUnsignedHex4(2, "Y Raw Data");
            setResultSeparator(3);
            setResultUnsignedHex4(4, "Z Raw Data");
        }
        return commandLengthValueForMode(mode, 0, 14);
    }
    else if (commandHeader == COMMAND_ACCELEROMETER_GET_SAMPLE_DATA_MILLIG_G) {
        if (fillDeviceArgumentList) {
            setFunction("Sample Data MilliG", 0, 5);
            setResultUnsignedHex4(0, "X (mG)");
            setResultSeparator(1);
            setResultUnsignedHex4(2, "Y (mG)");
            setResultSeparator(3);
            setResultUnsignedHex4(4, "Z (mG)");
        }
        return commandLengthValueForMode(mode, 0, 14);
    }
    // TRESHOLD
    else if (commandHeader == COMMAND_ACCELEROMETER_GET_THRESHOLD) {
        if (fillDeviceArgumentList) {
            setFunction("Get Threshold", 0, 1);
            setResultUnsignedHex4(0, "Threshold (milli G)");
        }
        return commandLengthValueForMode(mode, 0, 4);
    }
    else if (commandHeader == COMMAND_ACCELEROMETER_SET_THRESHOLD) {
        if (fillDeviceArgumentList) {
            setFunction("Set Threshold", 1, 0);
            setArgumentUnsignedHex4(0, "Threshold (milliG)");
        }
        return commandLengthValueForMode(mode, 4, 0);
    }
    // DEBUG
    else if (commandHeader == COMMAND_ACCELEROMETER_DEBUG_CONFIG) {
        if (fillDeviceArgumentList) {
            setFunctionNoArgumentAndNoResult("Debug Config");
        }
        return commandLengthValueForMode(mode, 0, 0);
    }
    else if (commandHeader == COMMAND_ACCELEROMETER_DEBUG_VALUES) {
        if (fillDeviceArgumentList) {
            setFunctionNoArgumentAndNoResult("Debug Values");
        }
        return commandLengthValueForMode(mode, 0, 0);
    }
    return DEVICE_HEADER_NOT_HANDLED;
}
int deviceBatteryGetInterface(unsigned char commandHeader, DeviceInterfaceMode mode, bool fillDeviceArgumentList){
    if (commandHeader == COMMAND_READ_BATTERY ) {
        if (fillDeviceArgumentList) {
            setFunction("Battery Read", 0, 1);
            setResultUnsignedHex4(0, "Battery Value (mV)");
        }
        return commandLengthValueForMode(mode, 0, 4);
    }
    return DEVICE_HEADER_NOT_HANDLED;
}
int deviceTofGetInterface(unsigned char commandHeader, DeviceInterfaceMode mode, bool fillDeviceArgumentList) {
    if (commandHeader == COMMAND_TOF_GET_DISTANCE) {
        if (fillDeviceArgumentList) {
            setFunction("TOF Get Distance", 1, 1);
            setArgumentUnsignedHex2(0, "Tof Index");
            setResultUnsignedHex4(0, "distance (mm)");
        }
        return commandLengthValueForMode(mode, 2, 4);
    }
    else if (commandHeader == COMMAND_TOF_DEBUG) {
        if (fillDeviceArgumentList) {
            setFunctionNoArgumentAndNoResult("TOF Debug List");
        }
        return commandLengthValueForMode(mode, 0, 0);
    }
    return DEVICE_HEADER_NOT_HANDLED;
}
int deviceRobotConfigGetInterface(char commandHeader, DeviceInterfaceMode mode, bool fillDeviceArgumentList) {
    if (commandHeader == COMMAND_GET_CONFIG) {
        if (fillDeviceArgumentList) {
            setFunction("getConfig", 0, 1);
            setResultUnsignedHex4(0, "value");
        }
        return commandLengthValueForMode(mode, 0, 4);
    }
    else if (commandHeader == COMMAND_SET_CONFIG) {
        if (fillDeviceArgumentList) {
            setFunction("setConfig", 1, 0);
            setArgumentUnsignedHex4(0, "value");
        }
        return commandLengthValueForMode(mode, 4, 0);
    }
    return DEVICE_HEADER_NOT_HANDLED;
}
int deviceFileGetInterface(char header, DeviceInterfaceMode mode, bool fillDeviceArgumentList){
    if (header == COMMAND_CREATE_FILE_SYSTEM) {
        if (fillDeviceArgumentList) {
            setFunctionNoArgumentAndNoResult("Create File System");
        }
        return 0;
    }
    else if (header == COMMAND_GET_FREE_SPACE) {
        if (fillDeviceArgumentList) {
            setFunction("Get Free Space", 0, 1);
            setResultUnsignedHex4(0, "result");
        }
        return commandLengthValueForMode(mode, 0, 4);
    }
    else if (header == COMMAND_SHOW_LIST_FILE ) {
        if (fillDeviceArgumentList) {
            setFunctionNoArgumentAndNoResult("Show File List");
        }
        return 0;
    } else if (header == COMMAND_SHOW_CONTENT_FILE) {
        if (fillDeviceArgumentList) {
            setFunction("Show File Content", 1, 0);
            setArgumentUnsignedHex2(0, "fileIndex");
        }
        return commandLengthValueForMode(mode, 2, 0);
    } else if (header == COMMAND_CREATE_NEW_FILE) {
        if (fillDeviceArgumentList) {
            setFunction("Create New File", 1, 0);
            setArgumentUnsignedHex2(0, "fileIndex");
        }
        return commandLengthValueForMode(mode, 2, 0);
    } else if (header == COMMAND_DELETE_FILE) {
        if (fillDeviceArgumentList) {
            setFunction("Delete File", 1, 0);
            setArgumentUnsignedHex2(0, "fileIndex");
        }
        return commandLengthValueForMode(mode, 2, 0);
    }
    return DEVICE_HEADER_NOT_HANDLED;
}
int deviceStartMatchGetInterface(char commandHeader, DeviceInterfaceMode mode, bool fillDeviceArgumentList) {
    if (commandHeader == COMMAND_MATCH_IS_STARTED) {
        if (fillDeviceArgumentList) {
            setFunction("isStarted", 0, 1);
            setResultUnsignedHex2(0, "value");
        }
        return commandLengthValueForMode(mode, 0, 2);
    }
    else if (commandHeader == COMMAND_MATCH_SET_STARTED) {
        if (fillDeviceArgumentList) {
            setFunction("setStarted", 1, 0);
            setArgumentUnsignedHex2(0, "value");
        }
        return commandLengthValueForMode(mode, 2, 0);
    }
    if (commandHeader == COMMAND_STEP_BY_STEP) {
        if (fillDeviceArgumentList) {
            setFunctionNoArgumentAndNoResult("stepByStep");
        }
        return commandLengthValueForMode(mode, 0, 0);
    }
    else if (commandHeader == COMMAND_START_MATCH_GET_INITIAL_POSITION) {
        if (fillDeviceArgumentList) {
            setFunction("getInitialPosition", 1, 7);
            setArgumentUnsignedHex2(0, "side");
            setResultUnsignedHex2(0, "side");
            setResultSeparator(1);
            setResultUnsignedHex4(2, "x (mm)");
            setResultSeparator(3);
            setResultUnsignedHex4(4, "y (mm)");
            setResultSeparator(5);
            setResultUnsignedHex4(6, "angle (mm)");
        }
        return commandLengthValueForMode(mode, 2, 17);
    }
    else if (commandHeader == COMMAND_START_MATCH_SET_INITIAL_POSITION) {
        if (fillDeviceArgumentList) {
            setFunction("setInitialPosition", 7, 0);
            setArgumentUnsignedHex2(0, "side");
            setArgumentSeparator(1);
            setArgumentUnsignedHex4(2, "x (mm)");
            setArgumentSeparator(3);
            setArgumentUnsignedHex4(4, "y (mm)");
            setArgumentSeparator(5);
            setArgumentUnsignedHex4(6, "angle (mm)");
        }
        return commandLengthValueForMode(mode, 17, 0);
    }

    /*
    if (mode == DEVICE_MODE_OUTPUT) {
            if (header == COMMAND_NOTIFY_MATCH_STARTED) {
                    if (fillDeviceArgumentList) {
                            deviceArgumentList->functionName = "notifyMatchStarted";
                            deviceArgumentList->size = 1;
                            deviceArgumentList->args[0].type = DEVICE_ARG_UNSIGNED_CHAR_3;
                            deviceArgumentList->args[0].name = "XyY";
                    }
                    return commandLengthValueForMode(mode, 0, 0);
            }
    }
     */
    return DEVICE_HEADER_NOT_HANDLED;
}
int deviceSystemGetInterface(char commandHeader, DeviceInterfaceMode mode, bool fillDeviceArgumentList) {
    // BoardName
    if (commandHeader == COMMAND_BOARD_NAME) {
        if (fillDeviceArgumentList) {
            setFunctionNoArgumentAndNoResult("getBoardName");
        }
        return commandLengthValueForMode(mode, 0, 0);
    }
    // lastError
    else if (commandHeader == COMMAND_GET_LAST_ERROR) {
        if (fillDeviceArgumentList) {
            setFunction("getLastError", 0, 1);
            setResultUnsignedHex4(0, "error");
        }
        return commandLengthValueForMode(mode, 0, 4);
    }
    if (commandHeader == COMMAND_CLEAR_LAST_ERROR) {
        if (fillDeviceArgumentList) {
            setFunctionNoArgumentAndNoResult("clearLastError");
        }
        return commandLengthValueForMode(mode, 0, 0);
    }

    // DeviceList
    else if (commandHeader == COMMAND_DEVICE_LIST) {
        if (fillDeviceArgumentList) {
            setFunctionNoArgumentAndNoResult("deviceList");
        }
        return commandLengthValueForMode(mode, 0, 0);
    }
    // Ping
    else if (commandHeader == COMMAND_PING) {
        if (fillDeviceArgumentList) {
            setFunction("ping", 1, 1);
            setArgumentUnsignedHex2(0, "pingIndex");
            setResultUnsignedHex2(0, "pingIndex");
        }
        return commandLengthValueForMode(mode, 2, 2);
    }
    // wait
    else if (commandHeader == COMMAND_WAIT) {
        if (fillDeviceArgumentList) {
            setFunction("wait", 1, 0);
            setArgumentUnsignedHex4(0, "ms");                
        }
        return commandLengthValueForMode(mode, 4, 0);
    }
    // usage
    else if (commandHeader == COMMAND_USAGE) {
        if (fillDeviceArgumentList) {
            setFunctionNoArgumentAndNoResult("usage");
        }
        return commandLengthValueForMode(mode, 0, 0);
    }
    else if (commandHeader == COMMAND_USAGE_PROBLEM) {
        if (fillDeviceArgumentList) {
            setFunctionNoArgumentAndNoResult("usage (only Problems)");
        }
        return commandLengthValueForMode(mode, 0, 0);
    }
    // Usage Specific
    else if (commandHeader == COMMAND_USAGE_SPECIFIC_DEVICE) {
        if (fillDeviceArgumentList) {
            setFunction("usageSpecificDevice", 1, 0);
            setArgumentUnsignedChar1(0, "deviceHeaderChar");
        }
        return commandLengthValueForMode(mode, 1, 0);
    }
	else if (commandHeader == COMMAND_CLS) {
		if (fillDeviceArgumentList) {
			setFunctionNoArgumentAndNoResult("clearScreen");
		}
		return commandLengthValueForMode(mode, 0, 0);
	}
	else if (commandHeader == COMMAND_RESET) {
		if (fillDeviceArgumentList) {
			setFunctionNoArgumentAndNoResult("reset MicroController");
		}
		return commandLengthValueForMode(mode, 0, 0);
	}
    // Notification
    else if (commandHeader == COMMAND_NOTIFICATION) {
        if (fillDeviceArgumentList) {
            setFunctionNoArgumentAndNoResult("notification");
        }
        return commandLengthValueForMode(mode, 0, 0);
    }

    return DEVICE_HEADER_NOT_HANDLED;
}
int trajectoryGetInterface(unsigned char commandHeader, DeviceInterfaceMode mode, bool fillDeviceArgumentList) {
    if (commandHeader == COMMAND_TRAJECTORY_GET_ABSOLUTE_POSITION) {
        if (fillDeviceArgumentList) {
            setFunction(GET_ABS_POS_STRING, 0, 5);
            setResultFloatHex4(0, X_MM);
            setResultSeparator(1);
            setResultFloatHex4(2, Y_MM);
            setResultSeparator(3);
            setResultUnsignedHex4(4, ANGLE_1_10_DEG);
        }
        return commandLengthValueForMode(mode, 0, 14);
    } else if (commandHeader == COMMAND_TRAJECTORY_DEBUG_GET_ABSOLUTE_POSITION) {
        // Same return in case of input / output
        if (fillDeviceArgumentList) {
            setFunctionNoArgumentAndNoResult(GET_DEBUG_ABS_POS_STRING);
        }
        return commandLengthValueForMode(mode, 0, 0);
	}
	else if (commandHeader == COMMAND_TRAJECTORY_DEBUG_CODERS) {
		// Same return in case of input / output
		if (fillDeviceArgumentList) {
			setFunctionNoArgumentAndNoResult("Debug Coders History");
		}
		return commandLengthValueForMode(mode, 0, 0);
	} else if (commandHeader == COMMAND_TRAJECTORY_SET_ABSOLUTE_POSITION) {
        if (fillDeviceArgumentList) {
            setFunction(SET_ABS_POS_STRING, 5, 0);
            setArgumentFloatHex6(0, X_MM);
            setArgumentSeparator(1);
            setArgumentFloatHex6(2, Y_MM);
            setArgumentSeparator(3);
            setArgumentUnsignedHex4(4, ANGLE_1_10_DEG);
        }
        return commandLengthValueForMode(mode, 18, 0);
	} else if (commandHeader == COMMAND_TRAJECTORY_ADJUST_X) {
        if (fillDeviceArgumentList) {
            setFunction("Adjust X", 1, 1);
            setArgumentFloatHex6(0, X_MM);
            setResultUnsignedChar1(0, "Done or not");
        }
        return commandLengthValueForMode(mode, 6, 1);
	} else if (commandHeader == COMMAND_TRAJECTORY_ADJUST_Y) {
        if (fillDeviceArgumentList) {
            setFunction("Adjust Y", 1, 1);
            setArgumentFloatHex6(0, X_MM);
            setResultUnsignedChar1(0, "Done or not");
        }
        return commandLengthValueForMode(mode, 6, 1);
    }
    // NOTIFY PARAMETERS
    else if (commandHeader == COMMAND_TRAJECTORY_NOTIFY_OFF) {
        if (fillDeviceArgumentList) {
            setFunctionNoArgumentAndNoResult("Notify Off");
        }
        return commandLengthValueForMode(mode, 0, 0);
    }
    else if (commandHeader == COMMAND_TRAJECTORY_NOTIFY_ON) {
        if (fillDeviceArgumentList) {
            setFunctionNoArgumentAndNoResult("Notify On");
        }
        return commandLengthValueForMode(mode, 0, 0);
    }
    else if (commandHeader == COMMAND_TRAJECTORY_NOTIFY_SET_PARAMETERS) {
        if (fillDeviceArgumentList) {
            setFunction("Notify Set Param", 3, 0);  
            setArgumentFloatHex4(0, "Dist (mm)");
            setArgumentSeparator(1);
            setArgumentFloatHex4(2, "Angle (deciDegree)");
        }
        return commandLengthValueForMode(mode, 9, 0);
    }
    // NOTIFICATION
    if (DEVICE_MODE_NOTIFY == mode) {
        if (commandHeader == NOTIFY_TRAJECTORY_CHANGED) {
            if (fillDeviceArgumentList) {
                setNotification("Trajectory Changed", 7);
                setArgumentUnsignedHex4(0, "x(mm)");
                setArgumentSeparator(1);
                setArgumentUnsignedHex4(2, "y(mm)");
                setArgumentSeparator(3);
                setArgumentUnsignedHex4(4, "ang(1/10)deg");
                setArgumentSeparator(5);
                setArgumentUnsignedChar1(6, "Trajectory Type");
            }
            return 16;
        }
    }
    return DEVICE_HEADER_NOT_HANDLED;
}
int deviceTimerGetInterface(unsigned char commandHeader, DeviceInterfaceMode mode, bool fillDeviceArgumentList) {
    if (commandHeader == COMMAND_TIMER_LIST) {
        if (fillDeviceArgumentList) {
            setFunctionNoArgumentAndNoResult("show Timer List");
        }
        return commandLengthValueForMode(mode, 0, 0);
    }
    else if (commandHeader == COMMAND_TIMER_COUNT) {
        if (fillDeviceArgumentList) {
            setFunction("timer Count", 0, 1);
            setResultUnsignedHex2(0, "count");
        }
        return commandLengthValueForMode(mode, 0, 2);
    }
    else if (commandHeader == COMMAND_TIMER_READ) {
        if (fillDeviceArgumentList) {
            setFunction("timer Read", 1, 13);
            setArgumentUnsignedHex2(0, "timerIndex");
            setResultUnsignedHex2(0, "Index");
            setResultSeparator(1);
            setResultUnsignedHex2(2, "Code");
            setResultSeparator(3);
            setResultUnsignedHex4(4, "Diviser");
            setResultSeparator(5);
            setResultUnsignedHex4(6, "InternalCounter");
            setResultSeparator(7);
            setResultUnsignedHex6(8, "time");
            setResultSeparator(9);
            setResultUnsignedHex6(10, "markTime");
            setResultSeparator(11);
            setResultUnsignedChar1(12, "enabled");
        }
        return commandLengthValueForMode(mode, 2, 31);
    }
    else if (commandHeader == COMMAND_TIMER_ENABLE_DISABLE) {
        if (fillDeviceArgumentList) {
            setFunction("timer Enable", 3, 0);
            setArgumentUnsignedHex2(0, "timerIndex");
            setArgumentSeparator(1);
            setArgumentUnsignedChar1(2, "enable/disable");
        }
        return commandLengthValueForMode(mode, 4, 0);
    }
    // Mark
    else if (commandHeader == COMMAND_TIMER_TIME_SINCE_LAST_MARK) {
        if (fillDeviceArgumentList) {
            setFunction("time Since Last Mark", 1, 1);
            setArgumentUnsignedHex2(0, "timerIndex");
            setResultUnsignedHex6(0, "mark");
        }
        return commandLengthValueForMode(mode, 2, 6);
    }
    else if (commandHeader == COMMAND_TIMER_MARK) {
        if (fillDeviceArgumentList) {
            setFunction("mark Timer !", 1, 1);
            setArgumentUnsignedHex2(0, "timerIndex");
            setResultUnsignedHex6(0, "markTime");
        }
        return commandLengthValueForMode(mode, 2, 6);
    }
    else if (commandHeader == COMMAND_TIMER_TIMEOUT) {
        if (fillDeviceArgumentList) {
            setFunction("timeout check", 3, 3);
            setArgumentUnsignedHex2(0, "timerIndex");
            setArgumentSeparator(1);
            setArgumentUnsignedHex6(2, "time to check");
            setResultUnsignedHex2(0, "timerIndex");
            setResultSeparator(1);
            setResultUnsignedChar1(2, "timeout or not");
        }
        return commandLengthValueForMode(mode, 9, 4);
    }
    
    // Demo
    else if (commandHeader == COMMAND_TIMER_DEMO) {
        if (fillDeviceArgumentList) {
            setFunction("Enable/Disable Timer Demo", 1, 0);
            setArgumentUnsignedChar1(0, "enable/disable");
        }
        return commandLengthValueForMode(mode, 1, 0);
    }
    // wait
    else if (commandHeader == COMMAND_TIMER_DELAY_WAIT) {
        if (fillDeviceArgumentList) {
            setFunction("Timer Delay Wait", 1, 0);
            setArgumentUnsignedHex4(0, "milli Seconds");                
        }
        return commandLengthValueForMode(mode, 4, 0);
    }
    return DEVICE_HEADER_NOT_HANDLED;
}