···138138 /// Device communication error: {0}
139139 DeviceCommunicationError(String),
140140 /// Device feature only has {0} steps for control, but {1} steps specified.
141141- DeviceStepRangeError(u32, u32),
141141+ DeviceStepRangeError(i32, i32),
142142 /// Device got {0} message but has no actuators
143143 DeviceNoActuatorError(String),
144144 /// Device got {0} message but has no sensors
···109109 let value = cmd.command().value();
110110 let new_value = output_map
111111 .calculate_from_value(output_type, value as i32)
112112- .map_err(|_| ButtplugDeviceError::DeviceStepRangeError(0, value.abs() as u32))?;
112112+ .map_err(|e| {
113113+ error!("{:?}", e);
114114+ ButtplugDeviceError::DeviceStepRangeError(0, value)
115115+ })?;
113116 let mut new_command = cmd.command();
114117 new_command.set_value(new_value);
115118 // We can't make a private trait impl to turn a ValueCmd into a CheckedValueCmd, and this
···143143 };
144144 let current_value = value.unsigned_abs();
145145 let mult = if value < 0 { -1 } else { 1 };
146146- if value > 0 && range.contains(&(range.start() + current_value)) {
146146+ if value != 0 && range.contains(&(range.start() + current_value)) {
147147 Ok((range.start() + current_value) as i32 * mult)
148148 } else if value == 0 {
149149 Ok(0)
···7272 // We can use the convenience functions on ButtplugClientDevice to
7373 // send the message. This version sets all of the motors on a
7474 // vibrating device to the same speed.
7575- test_client_device.vibrate(10).await?;
7575+ test_client_device.vibrate(0.5f64).await?;
76767777 // If we wanted to just set one motor on and the other off, we could
7878 // try this version that uses an array. It'll throw an exception if