io.helins.linux.gpio.GpioEventRequest Maven / Gradle / Ivy
Show all versions of linux-gpio Show documentation
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/. */
package io.helins.linux.gpio ;
import com.sun.jna.Memory ;
import io.helins.linux.gpio.GpioEdgeDetection ;
import io.helins.linux.gpio.GpioFlags ;
import io.helins.linux.gpio.GpioUtils ;
import io.helins.linux.gpio.internal.NativeGpioEventRequest ;
/**
* Class representing a request for obtaining a GPIO event handle for reading a line and
* especially setting edge-detection.
*
* Edge-detection is monitoring changes of state, for instance when the line goes from low
* to high.
*/
public class GpioEventRequest {
// Gpio flags meant to be reused
//
private static final int DEFAULT_FLAGS = new GpioFlags().setInput()
.forRequest() ;
// Pointer to the native structure
//
final Memory memory ;
// Selected edge-detection mode ;
//
private GpioEdgeDetection edgeDetection ;
/**
* Basic constructor requesting a regular input for both rising and falling edge.
*
* @param line
* Number of the line.
*/
public GpioEventRequest( int line ) {
this( line ,
GpioEdgeDetection.RISING_AND_FALLING ,
DEFAULT_FLAGS ) ;
}
/**
* Constructor requesting a regular input leaving the choice of edge-detection.
*
* @param line
* Number of the line.
*
* @param edgeDetection
* Edge-detection mode.
*/
public GpioEventRequest( int line ,
GpioEdgeDetection edgeDetection ) {
this( line ,
edgeDetection ,
DEFAULT_FLAGS ) ;
}
/**
* Constructor leaving all configuration to the user.
*
* @param line
* Number of the line.
*
* @param edgeDetection
* Edge-detection mode.
*
* @param flags
* Flags describing how the line will be handled.
*/
public GpioEventRequest( int line ,
GpioEdgeDetection edgeDetection ,
GpioFlags flags ) {
this( line ,
edgeDetection ,
flags.forRequest() ) ;
}
// Private constructor accepting raw flags.
//
private GpioEventRequest( int line ,
GpioEdgeDetection edgeDetection ,
int flags ) {
this.memory = new Memory( NativeGpioEventRequest.SIZE ) ;
this.memory.clear() ;
this.setLine( line ) ;
this.setEdgeDetection( edgeDetection ) ;
this.setRawFlags( flags ) ;
}
// Sets flags using an int.
//
private GpioEventRequest setRawFlags( int flags ) {
this.memory.setInt( NativeGpioEventRequest.OFFSET_HANDLE_FLAGS ,
flags ) ;
return this ;
}
/**
* Retrieves the flags describing how the lines involved in this request should be handled.
*
* @return Flags.
*/
public GpioFlags getFlags() {
return new GpioFlags().fromRequest( this.memory.getInt( NativeGpioEventRequest.OFFSET_HANDLE_FLAGS ) ) ;
}
/**
* Sets flags describing how the lines involved in this request should be handled.
*
* @param flags
* Flags.
*
* @return This instance.
*/
public GpioEventRequest setFlags( GpioFlags flags ) {
return this.setRawFlags( flags.forRequest() ) ;
}
/**
* Clears the flags associated with this requests.
*
* Means that lines will be requested "as-is".
*
* @return This instance.
*/
public GpioEventRequest unsetFlags() {
return this.setRawFlags( 0 ) ;
}
/**
* Retrieves what kind of edge-detection this request if for.
*
* @return Edge-detection mode.
*/
public GpioEdgeDetection getEdgeDetection() {
return this.edgeDetection ;
}
/**
* Selects edge-detection.
*
* @param edgeDetection
* Edge-detection mode.
*
* @return This instance.
*/
public GpioEventRequest setEdgeDetection( GpioEdgeDetection edgeDetection ) {
this.memory.setInt( NativeGpioEventRequest.OFFSET_EVENT_FLAGS ,
edgeDetection.flags ) ;
this.edgeDetection = edgeDetection ;
return this ;
}
// Retrieves the linux file descriptor after the request has been accepted.
//
int getFD() {
return this.memory.getInt( NativeGpioEventRequest.OFFSET_FD ) ;
}
/**
* Retrieves which line will be requested.
*
* @return Number of the line.
*/
public int getLine() {
return this.memory.getInt( NativeGpioEventRequest.OFFSET_LINE ) ;
}
/**
* Selects which line will be requested.
*
* @param line
* Number of the line.
*
* @return This instance.
*/
public GpioEventRequest setLine( int line ) {
this.memory.setInt( NativeGpioEventRequest.OFFSET_LINE ,
line ) ;
return this ;
}
/**
* Retrieves the consumer this line will be request under.
*
* @return Name of the consumer or null if none.
*/
public String getConsumer() {
return GpioUtils.getString( this.memory ,
NativeGpioEventRequest.OFFSET_CONSUMER ) ;
}
/**
* Sets the consumer this line will be request under.
*
* @param consumer
* Name of the consumer, length must be smaller than 32.
*
* @return This instance.
*
* @throws IllegalArgumentException
* When the length of the consumer is equal or greater than 32.
*/
public GpioEventRequest setConsumer( String consumer ) {
GpioUtils.setConsumer( this.memory ,
NativeGpioEventRequest.OFFSET_CONSUMER ,
consumer ) ;
return this ;
}
}