001// Copyright (c) FIRST and other WPILib contributors. 002// Open Source Software; you can modify and/or share it under the terms of 003// the WPILib BSD license file in the root directory of this project. 004 005package edu.wpi.first.wpilibj.simulation; 006 007import edu.wpi.first.hal.simulation.DIODataJNI; 008import edu.wpi.first.hal.simulation.NotifyCallback; 009import edu.wpi.first.wpilibj.DigitalInput; 010import edu.wpi.first.wpilibj.DigitalOutput; 011 012/** Class to control a simulated digital input or output. */ 013public class DIOSim { 014 private final int m_index; 015 016 /** 017 * Constructs from a DigitalInput object. 018 * 019 * @param input DigitalInput to simulate 020 */ 021 public DIOSim(DigitalInput input) { 022 m_index = input.getChannel(); 023 } 024 025 /** 026 * Constructs from a DigitalOutput object. 027 * 028 * @param output DigitalOutput to simulate 029 */ 030 public DIOSim(DigitalOutput output) { 031 m_index = output.getChannel(); 032 } 033 034 /** 035 * Constructs from an digital I/O channel number. 036 * 037 * @param channel Channel number 038 */ 039 public DIOSim(int channel) { 040 m_index = channel; 041 } 042 043 /** 044 * Register a callback to be run when this DIO is initialized. 045 * 046 * @param callback the callback 047 * @param initialNotify whether to run the callback with the initial state 048 * @return the {@link CallbackStore} object associated with this callback. Save a reference to 049 * this object so GC doesn't cancel the callback. 050 */ 051 public CallbackStore registerInitializedCallback(NotifyCallback callback, boolean initialNotify) { 052 int uid = DIODataJNI.registerInitializedCallback(m_index, callback, initialNotify); 053 return new CallbackStore(m_index, uid, DIODataJNI::cancelInitializedCallback); 054 } 055 056 /** 057 * Check whether this DIO has been initialized. 058 * 059 * @return true if initialized 060 */ 061 public boolean getInitialized() { 062 return DIODataJNI.getInitialized(m_index); 063 } 064 065 /** 066 * Define whether this DIO has been initialized. 067 * 068 * @param initialized whether this object is initialized 069 */ 070 public void setInitialized(boolean initialized) { 071 DIODataJNI.setInitialized(m_index, initialized); 072 } 073 074 /** 075 * Register a callback to be run whenever the DIO value changes. 076 * 077 * @param callback the callback 078 * @param initialNotify whether the callback should be called with the initial value 079 * @return the {@link CallbackStore} object associated with this callback. Save a reference to 080 * this object so GC doesn't cancel the callback. 081 */ 082 public CallbackStore registerValueCallback(NotifyCallback callback, boolean initialNotify) { 083 int uid = DIODataJNI.registerValueCallback(m_index, callback, initialNotify); 084 return new CallbackStore(m_index, uid, DIODataJNI::cancelValueCallback); 085 } 086 087 /** 088 * Read the value of the DIO port. 089 * 090 * @return the DIO value 091 */ 092 public boolean getValue() { 093 return DIODataJNI.getValue(m_index); 094 } 095 096 /** 097 * Change the DIO value. 098 * 099 * @param value the new value 100 */ 101 public void setValue(boolean value) { 102 DIODataJNI.setValue(m_index, value); 103 } 104 105 /** 106 * Register a callback to be run whenever the pulse length changes. 107 * 108 * @param callback the callback 109 * @param initialNotify whether to call the callback with the initial state 110 * @return the {@link CallbackStore} object associated with this callback. Save a reference to 111 * this object so GC doesn't cancel the callback. 112 */ 113 public CallbackStore registerPulseLengthCallback(NotifyCallback callback, boolean initialNotify) { 114 int uid = DIODataJNI.registerPulseLengthCallback(m_index, callback, initialNotify); 115 return new CallbackStore(m_index, uid, DIODataJNI::cancelPulseLengthCallback); 116 } 117 118 /** 119 * Read the pulse length. 120 * 121 * @return the pulse length of this DIO port 122 */ 123 public double getPulseLength() { 124 return DIODataJNI.getPulseLength(m_index); 125 } 126 127 /** 128 * Change the pulse length of this DIO port. 129 * 130 * @param pulseLength the new pulse length 131 */ 132 public void setPulseLength(double pulseLength) { 133 DIODataJNI.setPulseLength(m_index, pulseLength); 134 } 135 136 /** 137 * Register a callback to be run whenever this DIO changes to be an input. 138 * 139 * @param callback the callback 140 * @param initialNotify whether the callback should be called with the initial state 141 * @return the {@link CallbackStore} object associated with this callback. Save a reference to 142 * this object so GC doesn't cancel the callback. 143 */ 144 public CallbackStore registerIsInputCallback(NotifyCallback callback, boolean initialNotify) { 145 int uid = DIODataJNI.registerIsInputCallback(m_index, callback, initialNotify); 146 return new CallbackStore(m_index, uid, DIODataJNI::cancelIsInputCallback); 147 } 148 149 /** 150 * Check whether this DIO port is currently an Input. 151 * 152 * @return true if Input 153 */ 154 public boolean getIsInput() { 155 return DIODataJNI.getIsInput(m_index); 156 } 157 158 /** 159 * Define whether this DIO port is an Input. 160 * 161 * @param isInput whether this DIO should be an Input 162 */ 163 public void setIsInput(boolean isInput) { 164 DIODataJNI.setIsInput(m_index, isInput); 165 } 166 167 /** 168 * Register a callback to be run whenever the filter index changes. 169 * 170 * @param callback the callback 171 * @param initialNotify whether the callback should be called with the initial value 172 * @return the {@link CallbackStore} object associated with this callback. Save a reference to 173 * this object so GC doesn't cancel the callback. 174 */ 175 public CallbackStore registerFilterIndexCallback(NotifyCallback callback, boolean initialNotify) { 176 int uid = DIODataJNI.registerFilterIndexCallback(m_index, callback, initialNotify); 177 return new CallbackStore(m_index, uid, DIODataJNI::cancelFilterIndexCallback); 178 } 179 180 /** 181 * Read the filter index. 182 * 183 * @return the filter index of this DIO port 184 */ 185 public int getFilterIndex() { 186 return DIODataJNI.getFilterIndex(m_index); 187 } 188 189 /** 190 * Change the filter index of this DIO port. 191 * 192 * @param filterIndex the new filter index 193 */ 194 public void setFilterIndex(int filterIndex) { 195 DIODataJNI.setFilterIndex(m_index, filterIndex); 196 } 197 198 /** Reset all simulation data of this object. */ 199 public void resetData() { 200 DIODataJNI.resetData(m_index); 201 } 202}