Rewrite Hierachy that shockers now contain the api they use.
This commit is contained in:
64
CShocker/Devices/APIs/OpenShockHttp.cs
Normal file
64
CShocker/Devices/APIs/OpenShockHttp.cs
Normal file
@ -0,0 +1,64 @@
|
||||
using System.Net.Http.Headers;
|
||||
using System.Text;
|
||||
using CShocker.Devices.Abstract;
|
||||
using CShocker.Devices.Additional;
|
||||
using CShocker.Ranges;
|
||||
using CShocker.Shockers;
|
||||
using CShocker.Shockers.Abstract;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace CShocker.Devices.APIs;
|
||||
|
||||
public class OpenShockHttp : OpenShockApi
|
||||
{
|
||||
|
||||
|
||||
protected override void ControlInternal(ControlAction action, Shocker shocker, int intensity, int duration)
|
||||
{
|
||||
if (shocker is not OpenShockShocker openShockShocker)
|
||||
{
|
||||
this.Logger?.Log(LogLevel.Warning, $"Shocker {shocker} is not {typeof(OpenShockShocker).FullName}");
|
||||
return;
|
||||
}
|
||||
|
||||
HttpRequestMessage request = new (HttpMethod.Post, $"{Endpoint}/2/shockers/control")
|
||||
{
|
||||
Headers =
|
||||
{
|
||||
UserAgent = { new ProductInfoHeaderValue("CShocker", "1") },
|
||||
Accept = { new MediaTypeWithQualityHeaderValue("application/json") }
|
||||
},
|
||||
Content = new StringContent("{" +
|
||||
" \"shocks\": [" +
|
||||
" {" +
|
||||
$" \"id\": \"{openShockShocker.id}\"," +
|
||||
$" \"type\": {ControlActionToByte(action)}," +
|
||||
$" \"intensity\": {intensity}," +
|
||||
$" \"duration\": {duration}" +
|
||||
" }" +
|
||||
" ]," +
|
||||
" \"customName\": \"CShocker\"" +
|
||||
"}", Encoding.UTF8, new MediaTypeHeaderValue("application/json"))
|
||||
};
|
||||
request.Headers.Add("OpenShockToken", ApiKey);
|
||||
this.Logger?.Log(LogLevel.Debug, $"Request-Content: {request.Content.ReadAsStringAsync().Result}");
|
||||
HttpResponseMessage response = HttpClient.Send(request);
|
||||
this.Logger?.Log(!response.IsSuccessStatusCode ? LogLevel.Error : LogLevel.Debug,
|
||||
$"{request.RequestUri} response: {response.StatusCode}");
|
||||
}
|
||||
|
||||
private byte ControlActionToByte(ControlAction action)
|
||||
{
|
||||
return action switch
|
||||
{
|
||||
ControlAction.Beep => 3,
|
||||
ControlAction.Vibrate => 2,
|
||||
ControlAction.Shock => 1,
|
||||
_ => 0
|
||||
};
|
||||
}
|
||||
|
||||
public OpenShockHttp(IntensityRange intensityRange, DurationRange durationRange, string apiKey, string endpoint = "https://api.shocklink.net", ILogger? logger = null) : base(intensityRange, durationRange, DeviceApi.OpenShockHttp, apiKey, endpoint, logger)
|
||||
{
|
||||
}
|
||||
}
|
59
CShocker/Devices/APIs/OpenShockSerial.cs
Normal file
59
CShocker/Devices/APIs/OpenShockSerial.cs
Normal file
@ -0,0 +1,59 @@
|
||||
using System.IO.Ports;
|
||||
using CShocker.Devices.Abstract;
|
||||
using CShocker.Devices.Additional;
|
||||
using CShocker.Ranges;
|
||||
using CShocker.Shockers;
|
||||
using CShocker.Shockers.Abstract;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace CShocker.Devices.APIs;
|
||||
|
||||
public class OpenShockSerial : OpenShockApi
|
||||
{
|
||||
private const int BaudRate = 115200;
|
||||
public SerialPortInfo SerialPortI;
|
||||
private readonly SerialPort _serialPort;
|
||||
|
||||
public OpenShockSerial(IntensityRange intensityRange, DurationRange durationRange, SerialPortInfo serialPortI, string apiKey, string endpoint = "https://api.shocklink.net", ILogger? logger = null) : base(intensityRange, durationRange, DeviceApi.OpenShockSerial, apiKey, endpoint, logger)
|
||||
{
|
||||
this.SerialPortI = serialPortI;
|
||||
this._serialPort = new SerialPort(serialPortI.PortName, BaudRate);
|
||||
try
|
||||
{
|
||||
this._serialPort.Open();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
this.Logger?.Log(LogLevel.Error, e.Message);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
protected override void ControlInternal(ControlAction action, Shocker shocker, int intensity, int duration)
|
||||
{
|
||||
if (shocker is not OpenShockShocker openShockShocker)
|
||||
{
|
||||
this.Logger?.Log(LogLevel.Warning, $"Shocker {shocker} is not {typeof(OpenShockShocker).FullName}");
|
||||
return;
|
||||
}
|
||||
string json = "rftransmit {" +
|
||||
$"\"model\":\"{Enum.GetName(openShockShocker.model)!.ToLower()}\"," +
|
||||
$"\"id\":{openShockShocker.rfId}," +
|
||||
$"\"type\":\"{ControlActionToString(action)}\"," +
|
||||
$"\"intensity\":{intensity}," +
|
||||
$"\"durationMs\":{duration}" +
|
||||
"}";
|
||||
_serialPort.WriteLine(json);
|
||||
}
|
||||
|
||||
private static string ControlActionToString(ControlAction action)
|
||||
{
|
||||
return action switch
|
||||
{
|
||||
ControlAction.Beep => "sound",
|
||||
ControlAction.Vibrate => "vibrate",
|
||||
ControlAction.Shock => "shock",
|
||||
_ => "stop"
|
||||
};
|
||||
}
|
||||
}
|
65
CShocker/Devices/APIs/PiShockHttp.cs
Normal file
65
CShocker/Devices/APIs/PiShockHttp.cs
Normal file
@ -0,0 +1,65 @@
|
||||
using System.Net.Http.Headers;
|
||||
using System.Text;
|
||||
using CShocker.Devices.Abstract;
|
||||
using CShocker.Devices.Additional;
|
||||
using CShocker.Ranges;
|
||||
using CShocker.Shockers;
|
||||
using CShocker.Shockers.Abstract;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace CShocker.Devices.APIs;
|
||||
|
||||
public class PiShockHttp : PiShockApi
|
||||
{
|
||||
// ReSharper disable twice MemberCanBePrivate.Global external usage
|
||||
public string Username, Endpoint, ApiKey;
|
||||
protected readonly HttpClient HttpClient = new();
|
||||
|
||||
public PiShockHttp(IntensityRange intensityRange, DurationRange durationRange, string apiKey, string username, string endpoint = "https://do.pishock.com/api/apioperate", ILogger? logger = null) : base(intensityRange, durationRange, DeviceApi.PiShockHttp, logger)
|
||||
{
|
||||
this.Username = username;
|
||||
this.Endpoint = endpoint;
|
||||
this.ApiKey = apiKey;
|
||||
}
|
||||
|
||||
protected override void ControlInternal(ControlAction action, Shocker shocker, int intensity, int duration)
|
||||
{
|
||||
if (shocker is not PiShockShocker piShockShocker)
|
||||
{
|
||||
this.Logger?.Log(LogLevel.Warning, $"Shocker {shocker} is not {typeof(OpenShockShocker).FullName}");
|
||||
return;
|
||||
}
|
||||
|
||||
HttpRequestMessage request = new (HttpMethod.Post, $"{Endpoint}")
|
||||
{
|
||||
Headers =
|
||||
{
|
||||
UserAgent = { new ProductInfoHeaderValue("CShocker", "1") },
|
||||
Accept = { new MediaTypeWithQualityHeaderValue("text/plain") }
|
||||
},
|
||||
Content = new StringContent("{" +
|
||||
$"\"Username\":\"{Username}\"," +
|
||||
"\"Name\":\"CShocker\"," +
|
||||
$"\"Code\":\"{piShockShocker.Code}\"," +
|
||||
$"\"Intensity\":\"{intensity}\"," +
|
||||
$"\"Duration\":\"{duration/1000}\"," + //duration is in seconds no ms
|
||||
$"\"Apikey\":\"{ApiKey}\"," +
|
||||
$"\"Op\":\"{ControlActionToByte(action)}\"" +
|
||||
"}", Encoding.UTF8, new MediaTypeHeaderValue("application/json"))
|
||||
};
|
||||
HttpResponseMessage response = HttpClient.Send(request);
|
||||
this.Logger?.Log(!response.IsSuccessStatusCode ? LogLevel.Error : LogLevel.Debug,
|
||||
$"{request.RequestUri} response: {response.StatusCode}");
|
||||
}
|
||||
|
||||
private byte ControlActionToByte(ControlAction action)
|
||||
{
|
||||
return action switch
|
||||
{
|
||||
ControlAction.Beep => 2,
|
||||
ControlAction.Vibrate => 1,
|
||||
ControlAction.Shock => 0,
|
||||
_ => 2
|
||||
};
|
||||
}
|
||||
}
|
47
CShocker/Devices/APIs/PiShockSerial.cs
Normal file
47
CShocker/Devices/APIs/PiShockSerial.cs
Normal file
@ -0,0 +1,47 @@
|
||||
using System.IO.Ports;
|
||||
using CShocker.Devices.Abstract;
|
||||
using CShocker.Devices.Additional;
|
||||
using CShocker.Ranges;
|
||||
using CShocker.Shockers.Abstract;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace CShocker.Devices.APIs;
|
||||
|
||||
public class PiShockSerial : PiShockApi
|
||||
{
|
||||
private const int BaudRate = 115200;
|
||||
public SerialPortInfo SerialPortI;
|
||||
private readonly SerialPort _serialPort;
|
||||
|
||||
public PiShockSerial(IntensityRange intensityRange, DurationRange durationRange, DeviceApi apiType, SerialPortInfo serialPortI, ILogger? logger = null) : base(intensityRange, durationRange, apiType, logger)
|
||||
{
|
||||
this.SerialPortI = serialPortI;
|
||||
this._serialPort = new SerialPort(this.SerialPortI.PortName, BaudRate);
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
protected override void ControlInternal(ControlAction action, Shocker shocker, int intensity, int duration)
|
||||
{
|
||||
string json = "{" +
|
||||
"\"cmd\": \"operate\"," +
|
||||
"\"value\":{" +
|
||||
$"\"op\": \"{ControlActionToOp(action)}\"," +
|
||||
$"\"duration\": {duration}," +
|
||||
$"\"intensity\": {intensity}," +
|
||||
$"\"id\": " +
|
||||
"}" +
|
||||
"}";
|
||||
_serialPort.WriteLine(json);
|
||||
}
|
||||
|
||||
private static string ControlActionToOp(ControlAction action)
|
||||
{
|
||||
return action switch
|
||||
{
|
||||
ControlAction.Beep => "",
|
||||
ControlAction.Vibrate => "vibrate",
|
||||
ControlAction.Shock => "",
|
||||
_ => ""
|
||||
};
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user