/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #import <Foundation/Foundation.h> #import "MIDIClient.h" #import "MIDIMessage.h" extern NSString * const WALTClientErrorDomain; /** A reasonable timeout to use when reading from the WALT. */ extern const NSTimeInterval kWALTReadTimeout; typedef NS_ENUM(MIDIByte, WALTCommand) { WALTDelayedPingCommand = 'D', // Ping with a delay WALTResetCommand = 'F', // Reset all vars WALTSendSyncCommand = 'I', // Send some digits for clock sync WALTPingCommand = 'P', // Ping with a single byte WALTVersionCommand = 'V', // Determine WALT's firmware version WALTReadoutSyncCommand = 'R', // Read out sync times WALTGShockCommand = 'G', // Send last shock time and watch for another WALTTimeCommand = 'T', // Current time WALTZeroSyncCommand = 'Z', // Initial zero WALTScreenOnCommand = 'C', // Send a message on screen color change WALTScreenOffCommand = 'c', WALTSendLastScreenCommand = 'E', // Send info about last screen color change WALTBrightnessCurveCommand = 'U', // Probe screen for brightness vs time curve WALTLaserOnCommand = 'L', // Send messages on state change of the laser WALTLaserOffCommand = 'l', WALTSendLastLaserCommand = 'J', WALTAudioCommand = 'A', // Start watching for signal on audio out line WALTBeepCommand = 'B', // Generate a tone into the mic and send timestamp WALTBeepStopCommand = 'S', // Stop generating tone WALTMIDICommand = 'M', // Start listening for a MIDI message WALTNoteCommand = 'N', // Generate a MIDI NoteOn message }; typedef struct { char tag; NSTimeInterval t; int value; unsigned int count; } WALTTrigger; /** * A client for a WALT device. * * The client will automatically try to connect to any available WALT device, and monitor the system * for device connections/disconnections. Users should observe the "connected" key to be notified of * connection changes. * * Most commands produce a corresponding response from the WALT. The -sendCommand:error: method * should be used to send the command, and -readResponse used to collect the response. */ @interface WALTClient : NSObject <MIDIClientDelegate> @property (readonly, nonatomic, getter=isConnected) BOOL connected; /** * Returns the base time of the WALT device. * * The time value is an adjusted version of -currentTime. */ @property (readonly, nonatomic) NSTimeInterval baseTime; /** Returns the number of seconds the system has been awake since it was last restarted. */ @property (readonly, nonatomic) NSTimeInterval currentTime; /** Initialises the client and attempts to connect to any available WALT device. */ - (instancetype)initWithError:(NSError **)error; /** Sends a command to the WALT. */ - (BOOL)sendCommand:(WALTCommand)command error:(NSError **)error; /** Reads a response from the WALT, blocking up to timeout until one becomes available. */ - (NSData *)readResponseWithTimeout:(NSTimeInterval)timeout; /** * Reads a trigger response from the WALT. * * If an error occurs, the trigger's tag will be '\0'. */ - (WALTTrigger)readTriggerWithTimeout:(NSTimeInterval)timeout; /** Returns YES if the response data contains a valid acknowledgement for a command. */ - (BOOL)checkResponse:(NSData *)response forCommand:(WALTCommand)command; /** Forces a complete clock synchronisation with the WALT. */ - (BOOL)syncClocksWithError:(NSError **)error; /** Refreshes the min/max error synchronisation bounds. */ - (BOOL)updateSyncBoundsWithError:(NSError **)error; @property (readonly, nonatomic) int64_t minError; @property (readonly, nonatomic) int64_t maxError; /** * Confirms the connection with the WALT (by setting -isConnected). * * Note that this method will only return NO if there is an error in the connection process. The * absence of a device is not such an error. */ - (BOOL)checkConnectionWithError:(NSError **)error; /** Returns the time of the last shock detected by the WALT. */ - (NSTimeInterval)lastShockTimeWithError:(NSError **)error; @end