/** * Send an API command to the DSC Alarm system. * * @param apiCode * @param apiData * @return */ public boolean sendCommand(APICode apiCode, String... apiData) { boolean successful = false; boolean validCommand = false; String command = apiCode.getCode(); String data = ""; switch (apiCode) { case Poll: /*000*/ case StatusReport: /*001*/ validCommand = true; break; case LabelsRequest: /*002*/ if (!connectorType.equals(DSCAlarmConnectorType.SERIAL)) { break; } validCommand = true; break; case NetworkLogin: /*005*/ if (!connectorType.equals(DSCAlarmConnectorType.TCP)) { break; } if (password == null || password.length() < 1 || password.length() > 6) { logger.error( "sendCommand(): Password is invalid, must be between 1 and 6 chars", password); break; } data = password; validCommand = true; break; case DumpZoneTimers: /*008*/ if (!connectorType.equals(DSCAlarmConnectorType.TCP)) { break; } validCommand = true; break; case SetTimeDate: /*010*/ Date date = new Date(); SimpleDateFormat dateTime = new SimpleDateFormat("HHmmMMddYY"); data = dateTime.format(date); validCommand = true; break; case CommandOutputControl: /*020*/ if (apiData[0] == null || !apiData[0].matches("[1-8]")) { logger.error( "sendCommand(): Partition number must be a single character string from 1 to 8, it was: " + apiData[0]); break; } if (apiData[1] == null || !apiData[1].matches("[1-4]")) { logger.error( "sendCommand(): Output number must be a single character string from 1 to 4, it was: " + apiData[1]); break; } data = apiData[0]; validCommand = true; break; case KeepAlive: /*074*/ if (!connectorType.equals(DSCAlarmConnectorType.TCP)) { break; } case PartitionArmControlAway: /*030*/ case PartitionArmControlStay: /*031*/ case PartitionArmControlZeroEntryDelay: /*032*/ if (apiData[0] == null || !apiData[0].matches("[1-8]")) { logger.error( "sendCommand(): Partition number must be a single character string from 1 to 8, it was: {}", apiData[0]); break; } data = apiData[0]; validCommand = true; break; case PartitionArmControlWithUserCode: /*033*/ case PartitionDisarmControl: /*040*/ if (apiData[0] == null || !apiData[0].matches("[1-8]")) { logger.error( "sendCommand(): Partition number must be a single character string from 1 to 8, it was: {}", apiData[0]); break; } if (dscAlarmUserCode == null || dscAlarmUserCode.length() < 4 || dscAlarmUserCode.length() > 6) { logger.error( "sendCommand(): User Code is invalid, must be between 4 and 6 chars: {}", dscAlarmUserCode); break; } data = apiData[0] + dscAlarmUserCode; validCommand = true; break; case VirtualKeypadControl: /*058*/ if (!connectorType.equals(DSCAlarmConnectorType.SERIAL)) { break; } case TimeStampControl: /*055*/ case TimeDateBroadcastControl: /*056*/ case TemperatureBroadcastControl: /*057*/ if (apiData[0] == null || !apiData[0].matches("[0-1]")) { logger.error( "sendCommand(): Value must be a single character string of 0 or 1: {}", apiData[0]); break; } data = apiData[0]; validCommand = true; break; case TriggerPanicAlarm: /*060*/ if (apiData[0] == null || !apiData[0].matches("[1-8]")) { logger.error( "sendCommand(): Partition number must be a single character string from 1 to 8, it was: {}", apiData[0]); break; } if (apiData[1] == null || !apiData[1].matches("[1-3]")) { logger.error( "sendCommand(): FAPcode must be a single character string from 1 to 3, it was: {}", apiData[1]); break; } data = apiData[0] + apiData[1]; validCommand = true; break; case KeyStroke: /*070*/ if (apiData[0] == null || apiData[0].length() != 1 || !apiData[0].matches("[0-9]|A|#|\\*")) { logger.error( "sendCommand(): \'keystroke\' must be a single character string from 0 to 9, *, #, or A, it was: {}", apiData[0]); break; } data = apiData[0]; validCommand = true; break; case KeySequence: /*071*/ if (!connectorType.equals(DSCAlarmConnectorType.TCP)) { break; } if (apiData[0] == null || apiData[0].length() > 6 || !apiData[0].matches("(\\d|#|\\*)+")) { logger.error( "sendCommand(): \'keysequence\' must be a string of up to 6 characters consiting of 0 to 9, *, or #, it was: {}", apiData[0]); break; } data = apiData[0]; validCommand = true; break; case CodeSend: /*200*/ if (dscAlarmUserCode == null || dscAlarmUserCode.length() < 4 || dscAlarmUserCode.length() > 6) { logger.error( "sendCommand(): Access Code is invalid, must be between 4 and 6 chars: {}", apiData[0]); break; } data = dscAlarmUserCode; validCommand = true; break; default: validCommand = false; break; } if (validCommand) { APICommand apiCommand = new APICommand(); apiCommand.setAPICommand(command, data); dscAlarmConnector.write(apiCommand.toString()); successful = true; logger.debug("sendCommand(): Command Sent - {}", apiCommand.toString()); } else logger.error("sendCommand(): Command Not Sent - Invalid!"); return successful; }