mirror of
https://github.com/PepperDash/PepperDashCore.git
synced 2026-02-10 18:24:42 +00:00
Changes to GenericTcpIpClient to accomodate S+ wrapper; Moved Web API and JsonToSimpl in
This commit is contained in:
BIN
Pepperdash Core/Pepperdash Core.suo
Normal file
BIN
Pepperdash Core/Pepperdash Core.suo
Normal file
Binary file not shown.
@@ -29,6 +29,31 @@ namespace PepperDash.Core
|
||||
//public event GenericSocketStatusChangeEventDelegate SocketStatusChange;
|
||||
public event EventHandler<GenericSocketStatusChageEventArgs> ConnectionChange;
|
||||
|
||||
/// <summary>
|
||||
/// Address of server
|
||||
/// </summary>
|
||||
public string Hostname { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Port on server
|
||||
/// </summary>
|
||||
public int Port { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Another damn S+ helper because S+ seems to treat large port nums as signed ints
|
||||
/// which screws up things
|
||||
/// </summary>
|
||||
public ushort UPort
|
||||
{
|
||||
get { return Convert.ToUInt16(Port); }
|
||||
set { Port = Convert.ToInt32(value); }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Defaults to 2000
|
||||
/// </summary>
|
||||
public int BufferSize { get; set; }
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
@@ -37,33 +62,70 @@ namespace PepperDash.Core
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public bool IsConnected { get { return Client.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED; } }
|
||||
public bool IsConnected
|
||||
{
|
||||
get { return Client != null && Client.ClientStatus == SocketStatus.SOCKET_STATUS_CONNECTED; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// S+ helper for IsConnected
|
||||
/// </summary>
|
||||
public ushort UIsConnected
|
||||
{
|
||||
get { return (ushort)(IsConnected ? 1 : 0); }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public SocketStatus ClientStatus { get { return Client.ClientStatus; } }
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public string ClientStatusText { get { return Client.ClientStatus.ToString(); } }
|
||||
public SocketStatus ClientStatus
|
||||
{
|
||||
get
|
||||
{
|
||||
if (Client == null)
|
||||
return SocketStatus.SOCKET_STATUS_NO_CONNECT;
|
||||
return Client.ClientStatus;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Contains the familiar Simpl analog status values. This drives the ConnectionChange event
|
||||
/// and IsConnected with be true when this == 2.
|
||||
/// </summary>
|
||||
public ushort UStatus
|
||||
{
|
||||
get { return (ushort)ClientStatus; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public ushort UClientStatus { get { return (ushort)Client.ClientStatus; } }
|
||||
public string ClientStatusText { get { return ClientStatus.ToString(); } }
|
||||
|
||||
[Obsolete]
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public ushort UClientStatus { get { return (ushort)ClientStatus; } }
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public string ConnectionFailure { get { return Client.ClientStatus.ToString(); } }
|
||||
public string ConnectionFailure { get { return ClientStatus.ToString(); } }
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public bool AutoReconnect { get; set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// S+ helper for AutoReconnect
|
||||
/// </summary>
|
||||
public ushort UAutoReconnect
|
||||
{
|
||||
get { return (ushort)(AutoReconnect ? 1 : 0); }
|
||||
set { AutoReconnect = value == 1; }
|
||||
}
|
||||
/// <summary>
|
||||
/// Milliseconds to wait before attempting to reconnect. Defaults to 5000
|
||||
/// </summary>
|
||||
@@ -87,24 +149,60 @@ namespace PepperDash.Core
|
||||
public GenericTcpIpClient(string key, string address, int port, int bufferSize)
|
||||
: base(key)
|
||||
{
|
||||
if (string.IsNullOrEmpty(address))
|
||||
{
|
||||
Debug.Console(1, Debug.ErrorLogLevel.Warning, "GenericTcpIpClient '{0}': No address set", key);
|
||||
return;
|
||||
}
|
||||
if (port < 1 || port > 65535)
|
||||
{
|
||||
{
|
||||
Debug.Console(1, Debug.ErrorLogLevel.Warning, "GenericTcpIpClient '{0}': Invalid port", key);
|
||||
return;
|
||||
}
|
||||
}
|
||||
Hostname = address;
|
||||
Port = port;
|
||||
BufferSize = bufferSize;
|
||||
AutoReconnectIntervalMs = 5000;
|
||||
|
||||
Client = new TCPClient(address, port, bufferSize);
|
||||
Client.SocketStatusChange += Client_SocketStatusChange;
|
||||
//if (string.IsNullOrEmpty(address))
|
||||
//{
|
||||
// Debug.Console(1, Debug.ErrorLogLevel.Warning, "GenericTcpIpClient '{0}': No address set", key);
|
||||
// return;
|
||||
//}
|
||||
//if (port < 1 || port > 65535)
|
||||
//{
|
||||
// {
|
||||
// Debug.Console(1, Debug.ErrorLogLevel.Warning, "GenericTcpIpClient '{0}': Invalid port", key);
|
||||
// return;
|
||||
// }
|
||||
//}
|
||||
|
||||
//Client = new TCPClient(address, port, bufferSize);
|
||||
//Client.SocketStatusChange += Client_SocketStatusChange;
|
||||
}
|
||||
|
||||
public GenericTcpIpClient()
|
||||
: base("Uninitialized TcpIpClient")
|
||||
{
|
||||
CrestronEnvironment.ProgramStatusEventHandler += new ProgramStatusEventHandler(CrestronEnvironment_ProgramStatusEventHandler);
|
||||
AutoReconnectIntervalMs = 5000;
|
||||
BufferSize = 2000;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Just to help S+ set the key
|
||||
/// </summary>
|
||||
public void Initialize(string key)
|
||||
{
|
||||
Key = key;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Handles closing this up when the program shuts down
|
||||
/// </summary>
|
||||
void CrestronEnvironment_ProgramStatusEventHandler(eProgramStatusEventType programEventType)
|
||||
{
|
||||
if (programEventType == eProgramStatusEventType.Stopping)
|
||||
{
|
||||
if (Client != null)
|
||||
{
|
||||
Debug.Console(1, this, "Program stopping. Closing connection");
|
||||
Client.DisconnectFromServer();
|
||||
Client.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//public override bool CustomActivate()
|
||||
//{
|
||||
// return true;
|
||||
@@ -112,12 +210,32 @@ namespace PepperDash.Core
|
||||
|
||||
public override bool Deactivate()
|
||||
{
|
||||
Client.SocketStatusChange -= this.Client_SocketStatusChange;
|
||||
if(Client != null)
|
||||
Client.SocketStatusChange -= this.Client_SocketStatusChange;
|
||||
return true;
|
||||
}
|
||||
|
||||
public void Connect()
|
||||
{
|
||||
if (IsConnected)
|
||||
return;
|
||||
|
||||
if (string.IsNullOrEmpty(Hostname))
|
||||
{
|
||||
Debug.Console(1, Debug.ErrorLogLevel.Warning, "GenericTcpIpClient '{0}': No address set", Key);
|
||||
return;
|
||||
}
|
||||
if (Port < 1 || Port > 65535)
|
||||
{
|
||||
{
|
||||
Debug.Console(1, Debug.ErrorLogLevel.Warning, "GenericTcpIpClient '{0}': Invalid port", Key);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Client = new TCPClient(Hostname, Port, BufferSize);
|
||||
Client.SocketStatusChange += Client_SocketStatusChange;
|
||||
|
||||
Client.ConnectToServerAsync(null);
|
||||
DisconnectCalledByUser = false;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,97 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Crestron.SimplSharp;
|
||||
|
||||
namespace PepperDash.Core.JsonToSimpl
|
||||
{
|
||||
public class JsonToSimplConstants
|
||||
{
|
||||
public const ushort JsonIsValidBoolChange = 2;
|
||||
|
||||
public const ushort BoolValueChange = 1;
|
||||
public const ushort UshortValueChange = 101;
|
||||
public const ushort StringValueChange = 201;
|
||||
}
|
||||
|
||||
//**************************************************************************************************//
|
||||
public delegate void SPlusValuesDelegate();
|
||||
|
||||
public class SPlusValueWrapper
|
||||
{
|
||||
public SPlusType ValueType { get; private set; }
|
||||
public ushort Index { get; private set; }
|
||||
public ushort BoolUShortValue { get; set; }
|
||||
public string StringValue { get; set; }
|
||||
|
||||
public SPlusValueWrapper() { }
|
||||
|
||||
public SPlusValueWrapper(SPlusType type, ushort index)
|
||||
{
|
||||
ValueType = type;
|
||||
Index = index;
|
||||
}
|
||||
}
|
||||
|
||||
public enum SPlusType
|
||||
{
|
||||
Digital, Analog, String
|
||||
}
|
||||
|
||||
|
||||
//**************************************************************************************************//
|
||||
public class BoolChangeEventArgs : EventArgs
|
||||
{
|
||||
public bool State { get; set; }
|
||||
public ushort IntValue { get { return (ushort)(State ? 1 : 0); } }
|
||||
public ushort Type { get; set; }
|
||||
public ushort Index { get; set; }
|
||||
|
||||
public BoolChangeEventArgs()
|
||||
{
|
||||
}
|
||||
|
||||
public BoolChangeEventArgs(bool state, ushort type)
|
||||
{
|
||||
State = state;
|
||||
Type = type;
|
||||
}
|
||||
}
|
||||
|
||||
//**************************************************************************************************//
|
||||
public class UshrtChangeEventArgs : EventArgs
|
||||
{
|
||||
public ushort IntValue { get; set; }
|
||||
public ushort Type { get; set; }
|
||||
public ushort Index { get; set; }
|
||||
|
||||
public UshrtChangeEventArgs()
|
||||
{
|
||||
}
|
||||
|
||||
public UshrtChangeEventArgs(ushort intValue, ushort type)
|
||||
{
|
||||
IntValue = intValue;
|
||||
Type = type;
|
||||
}
|
||||
}
|
||||
|
||||
//**************************************************************************************************//
|
||||
public class StringChangeEventArgs : EventArgs
|
||||
{
|
||||
public string StringValue { get; set; }
|
||||
public ushort Type { get; set; }
|
||||
public ushort Index { get; set; }
|
||||
|
||||
public StringChangeEventArgs()
|
||||
{
|
||||
}
|
||||
|
||||
public StringChangeEventArgs(string stringValue, ushort type)
|
||||
{
|
||||
StringValue = stringValue;
|
||||
Type = type;
|
||||
}
|
||||
}
|
||||
}
|
||||
55
Pepperdash Core/Pepperdash Core/JsonToSimpl/Global.cs
Normal file
55
Pepperdash Core/Pepperdash Core/JsonToSimpl/Global.cs
Normal file
@@ -0,0 +1,55 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Crestron.SimplSharp;
|
||||
|
||||
//using PepperDash.Core;
|
||||
|
||||
namespace PepperDash.Core.JsonToSimpl
|
||||
{
|
||||
public class J2SGlobal
|
||||
{
|
||||
static List<JsonToSimplMaster> Masters = new List<JsonToSimplMaster>();
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Adds a file master. If the master's key or filename is equivalent to any existing
|
||||
/// master, this will fail
|
||||
/// </summary>
|
||||
/// <param name="master">New master to add</param>
|
||||
public static void AddMaster(JsonToSimplMaster master)
|
||||
{
|
||||
if (master == null)
|
||||
throw new ArgumentNullException("master");
|
||||
|
||||
if (string.IsNullOrEmpty(master.UniqueID))
|
||||
throw new InvalidOperationException("JSON Master cannot be added with a null UniqueId");
|
||||
|
||||
Debug.Console(0, "JSON Global adding master {0}", master.UniqueID);
|
||||
|
||||
if (Masters.Contains(master)) return;
|
||||
|
||||
var existing = Masters.FirstOrDefault(m =>
|
||||
m.UniqueID.Equals(master.UniqueID, StringComparison.OrdinalIgnoreCase));
|
||||
if (existing == null)
|
||||
{
|
||||
Masters.Add(master);
|
||||
}
|
||||
else
|
||||
{
|
||||
var msg = string.Format("Cannot add JSON Master with unique ID '{0}'.\rID is already in use on another master.", master.UniqueID);
|
||||
CrestronConsole.PrintLine(msg);
|
||||
ErrorLog.Warn(msg);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets a master by its key. Case-insensitive
|
||||
/// </summary>
|
||||
public static JsonToSimplMaster GetMasterByFile(string file)
|
||||
{
|
||||
return Masters.FirstOrDefault(m => m.UniqueID.Equals(file, StringComparison.OrdinalIgnoreCase));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Crestron.SimplSharp;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
|
||||
namespace PepperDash.Core.JsonToSimpl
|
||||
{
|
||||
public class JsonToSimplArrayLookupChild : JsonToSimplChildObjectBase
|
||||
{
|
||||
public string SearchPropertyName { get; set; }
|
||||
public string SearchPropertyValue { get; set; }
|
||||
|
||||
int ArrayIndex;
|
||||
|
||||
public void Initialize(string file, string key, string pathPrefix, string pathSuffix,
|
||||
string searchPropertyName, string searchPropertyValue)
|
||||
{
|
||||
base.Initialize(file, key, pathPrefix, pathSuffix);
|
||||
SearchPropertyName = searchPropertyName;
|
||||
SearchPropertyValue = searchPropertyValue;
|
||||
}
|
||||
|
||||
|
||||
//PathPrefix+ArrayName+[x]+path+PathSuffix
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="path"></param>
|
||||
/// <returns></returns>
|
||||
protected override string GetFullPath(string path)
|
||||
{
|
||||
return string.Format("{0}[{1}].{2}{3}",
|
||||
PathPrefix == null ? "" : PathPrefix,
|
||||
ArrayIndex, path,
|
||||
PathSuffix == null ? "" : PathSuffix);
|
||||
}
|
||||
|
||||
public override void ProcessAll()
|
||||
{
|
||||
if(FindInArray())
|
||||
base.ProcessAll();
|
||||
}
|
||||
|
||||
bool FindInArray()
|
||||
{
|
||||
if (Master == null)
|
||||
throw new InvalidOperationException("Cannot do operations before master is linked");
|
||||
if (Master.JsonObject == null)
|
||||
throw new InvalidOperationException("Cannot do operations before master JSON has read");
|
||||
if (PathPrefix == null)
|
||||
throw new InvalidOperationException("Cannot do operations before PathPrefix is set");
|
||||
|
||||
var token = Master.JsonObject.SelectToken(PathPrefix);
|
||||
if (token is JArray)
|
||||
{
|
||||
var array = token as JArray;
|
||||
try
|
||||
{
|
||||
var item = array.FirstOrDefault(o =>
|
||||
{
|
||||
var prop = o[SearchPropertyName];
|
||||
return prop != null && prop.Value<string>()
|
||||
.Equals(SearchPropertyValue, StringComparison.OrdinalIgnoreCase);
|
||||
});
|
||||
if (item == null)
|
||||
{
|
||||
Debug.Console(0, "Child[{0}] Array '{1}' '{2}={3}' not found: ", Key,
|
||||
PathPrefix, SearchPropertyName, SearchPropertyValue);
|
||||
return false;
|
||||
}
|
||||
|
||||
ArrayIndex = array.IndexOf(item);
|
||||
Debug.Console(0, "Child[{0}] Found array match at index {1}", Key, ArrayIndex);
|
||||
return true;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Debug.Console(0, "Child[{0}] Array '{1}' lookup error: '{2}={3}'\r{4}", Key,
|
||||
PathPrefix, SearchPropertyName, SearchPropertyValue, e);
|
||||
}
|
||||
}
|
||||
else
|
||||
Debug.Console(0, "Child[{0}] Path '{1}' is not an array", Key, PathPrefix);
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,312 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Crestron.SimplSharp;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
|
||||
namespace PepperDash.Core.JsonToSimpl
|
||||
{
|
||||
public abstract class JsonToSimplChildObjectBase: IKeyed
|
||||
{
|
||||
|
||||
public event EventHandler<BoolChangeEventArgs> BoolChange;
|
||||
public event EventHandler<UshrtChangeEventArgs> UShortChange;
|
||||
public event EventHandler<StringChangeEventArgs> StringChange;
|
||||
|
||||
public SPlusValuesDelegate GetAllValuesDelegate { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Use a callback to reduce task switch/threading
|
||||
/// </summary>
|
||||
public SPlusValuesDelegate SetAllPathsDelegate { get; set; }
|
||||
|
||||
public string Key { get; protected set; }
|
||||
|
||||
/// <summary>
|
||||
/// This will be prepended to all paths to allow path swapping or for more organized
|
||||
/// sub-paths
|
||||
/// </summary>
|
||||
public string PathPrefix { get; protected set; }
|
||||
|
||||
/// <summary>
|
||||
/// This is added to the end of all paths
|
||||
/// </summary>
|
||||
public string PathSuffix { get; protected set; }
|
||||
|
||||
protected JsonToSimplMaster Master;
|
||||
|
||||
// The sent-in JPaths for the various types
|
||||
protected Dictionary<ushort, string> BoolPaths = new Dictionary<ushort, string>();
|
||||
protected Dictionary<ushort, string> UshortPaths = new Dictionary<ushort, string>();
|
||||
protected Dictionary<ushort, string> StringPaths = new Dictionary<ushort, string>();
|
||||
|
||||
/// <summary>
|
||||
/// Call this before doing anything else
|
||||
/// </summary>
|
||||
/// <param name="file"></param>
|
||||
/// <param name="key"></param>
|
||||
/// <param name="pathPrefix"></param>
|
||||
/// <param name="pathSuffix"></param>
|
||||
public void Initialize(string masterUniqueId, string key, string pathPrefix, string pathSuffix)
|
||||
{
|
||||
Key = key;
|
||||
PathPrefix = pathPrefix;
|
||||
PathSuffix = pathSuffix;
|
||||
|
||||
Master = J2SGlobal.GetMasterByFile(masterUniqueId);
|
||||
if (Master != null)
|
||||
Master.AddChild(this);
|
||||
else
|
||||
Debug.Console(0, "JSON Child [{0}] cannot link to master {1}", key, masterUniqueId);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Set the JPath to evaluate for a given bool out index.
|
||||
/// </summary>
|
||||
public void SetBoolPath(ushort index, string path)
|
||||
{
|
||||
Debug.Console(0, "JSON Child[{0}] SetBoolPath {1}={2}", Key, index, path);
|
||||
if (path == null || path.Trim() == string.Empty) return;
|
||||
BoolPaths[index] = path;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Set the JPath for a ushort out index.
|
||||
/// </summary>
|
||||
public void SetUshortPath(ushort index, string path)
|
||||
{
|
||||
Debug.Console(0, "JSON Child[{0}] SetUshortPath {1}={2}", Key, index, path);
|
||||
if (path == null || path.Trim() == string.Empty) return;
|
||||
UshortPaths[index] = path;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Set the JPath for a string output index.
|
||||
/// </summary>
|
||||
public void SetStringPath(ushort index, string path)
|
||||
{
|
||||
Debug.Console(0, "JSON Child[{0}] SetStringPath {1}={2}", Key, index, path);
|
||||
if (path == null || path.Trim() == string.Empty) return;
|
||||
StringPaths[index] = path;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Evalutates all outputs with defined paths. called by S+ when paths are ready to process
|
||||
/// and by Master when file is read.
|
||||
/// </summary>
|
||||
public virtual void ProcessAll()
|
||||
{
|
||||
if (SetAllPathsDelegate == null)
|
||||
{
|
||||
Debug.Console(1, this, "No SetAllPathsDelegate set. Ignoring ProcessAll");
|
||||
return;
|
||||
}
|
||||
SetAllPathsDelegate();
|
||||
foreach (var kvp in BoolPaths)
|
||||
ProcessBoolPath(kvp.Key);
|
||||
foreach (var kvp in UshortPaths)
|
||||
ProcessUshortPath(kvp.Key);
|
||||
foreach (var kvp in StringPaths)
|
||||
ProcessStringPath(kvp.Key);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Processes a bool property, converting to bool, firing off a BoolChange event
|
||||
/// </summary>
|
||||
void ProcessBoolPath(ushort index)
|
||||
{
|
||||
string response;
|
||||
if (Process(BoolPaths[index], out response))
|
||||
OnBoolChange(response.Equals("true", StringComparison.OrdinalIgnoreCase),
|
||||
index, JsonToSimplConstants.BoolValueChange);
|
||||
else
|
||||
OnBoolChange(false, index, JsonToSimplConstants.BoolValueChange);
|
||||
}
|
||||
|
||||
// Processes the path to a ushort, converting to ushort if able, firing off UshrtChange event
|
||||
void ProcessUshortPath(ushort index)
|
||||
{
|
||||
string response;
|
||||
if (Process(UshortPaths[index], out response))
|
||||
{
|
||||
ushort val;
|
||||
try { val = Convert.ToUInt16(response); }
|
||||
catch { val = 0; }
|
||||
OnUShortChange(val, index, JsonToSimplConstants.UshortValueChange);
|
||||
}
|
||||
else
|
||||
OnUShortChange(0, index, JsonToSimplConstants.UshortValueChange);
|
||||
}
|
||||
|
||||
// Processes the path to a string property and fires of a StringChange event.
|
||||
void ProcessStringPath(ushort index)
|
||||
{
|
||||
string response;
|
||||
if (Process(StringPaths[index], out response))
|
||||
OnStringChange(response, index, JsonToSimplConstants.StringValueChange);
|
||||
else
|
||||
OnStringChange("", index, JsonToSimplConstants.StringValueChange);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Processes the given path.
|
||||
/// </summary>
|
||||
/// <param name="path">JPath formatted path to the desired property</param>
|
||||
/// <param name="response">The string value of the property, or a default value if it
|
||||
/// doesn't exist</param>
|
||||
/// <returns> This will return false in the case that EvaulateAllOnJsonChange
|
||||
/// is false and the path does not evaluate to a property in the incoming JSON. </returns>
|
||||
bool Process(string path, out string response)
|
||||
{
|
||||
path = GetFullPath(path);
|
||||
Debug.Console(0, "Child[{0}] Processing {1}", Key, path);
|
||||
response = "";
|
||||
if (Master == null)
|
||||
{
|
||||
Debug.Console(0, "JSONChild[{0}] cannot process without Master attached", Key);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (Master.JsonObject != null && path != string.Empty)
|
||||
{
|
||||
bool isCount = false;
|
||||
path = path.Trim();
|
||||
if (path.EndsWith(".Count"))
|
||||
{
|
||||
path = path.Remove(path.Length - 6, 6);
|
||||
isCount = true;
|
||||
}
|
||||
try // Catch a strange cast error on a bad path
|
||||
{
|
||||
var t = Master.JsonObject.SelectToken(path);
|
||||
if (t != null)
|
||||
{
|
||||
// return the count of children objects - if any
|
||||
if (isCount)
|
||||
response = (t.HasValues ? t.Children().Count() : 0).ToString();
|
||||
else
|
||||
response = t.Value<string>();
|
||||
Debug.Console(0, " ='{0}'", response);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
response = "";
|
||||
}
|
||||
}
|
||||
// If the path isn't found, return this to determine whether to pass out the non-value or not.
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
//************************************************************************************************
|
||||
// Save-related functions
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Called from Master to read inputs and update their values in master JObject
|
||||
/// Callback should hit one of the following four methods
|
||||
/// </summary>
|
||||
public void UpdateInputsForMaster()
|
||||
{
|
||||
if (SetAllPathsDelegate == null)
|
||||
{
|
||||
Debug.Console(1, this, "No SetAllPathsDelegate set. Ignoring UpdateInputsForMaster");
|
||||
return;
|
||||
}
|
||||
SetAllPathsDelegate();
|
||||
var del = GetAllValuesDelegate;
|
||||
if (del != null)
|
||||
GetAllValuesDelegate();
|
||||
}
|
||||
|
||||
public void USetBoolValue(ushort key, ushort theValue)
|
||||
{
|
||||
SetBoolValue(key, theValue == 1);
|
||||
}
|
||||
|
||||
public void SetBoolValue(ushort key, bool theValue)
|
||||
{
|
||||
if (BoolPaths.ContainsKey(key))
|
||||
SetValueOnMaster(BoolPaths[key], new JValue(theValue));
|
||||
}
|
||||
|
||||
public void SetUShortValue(ushort key, ushort theValue)
|
||||
{
|
||||
if (UshortPaths.ContainsKey(key))
|
||||
SetValueOnMaster(UshortPaths[key], new JValue(theValue));
|
||||
}
|
||||
|
||||
public void SetStringValue(ushort key, string theValue)
|
||||
{
|
||||
if (StringPaths.ContainsKey(key))
|
||||
SetValueOnMaster(StringPaths[key], new JValue(theValue));
|
||||
}
|
||||
|
||||
public void SetValueOnMaster(string keyPath, JValue valueToSave)
|
||||
{
|
||||
var path = GetFullPath(keyPath);
|
||||
try
|
||||
{
|
||||
Debug.Console(0, "Child[{0}] Queueing value on master {1}='{2}'", Key, path, valueToSave);
|
||||
|
||||
//var token = Master.JsonObject.SelectToken(path);
|
||||
//if (token != null) // The path exists in the file
|
||||
Master.AddUnsavedValue(path, valueToSave);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Debug.Console(0, "Child[{0}] Failed setting value for path '{1}'\r{2}", Key, path, e);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Called during Process(...) to get the path to a given property. By default,
|
||||
/// returns PathPrefix+path+PathSuffix. Override to change the way path is built.
|
||||
/// </summary>
|
||||
protected virtual string GetFullPath(string path)
|
||||
{
|
||||
return (PathPrefix != null ? PathPrefix : "") +
|
||||
path + (PathSuffix != null ? PathSuffix : "");
|
||||
}
|
||||
|
||||
// Helpers for events
|
||||
//******************************************************************************************
|
||||
protected void OnBoolChange(bool state, ushort index, ushort type)
|
||||
{
|
||||
var handler = BoolChange;
|
||||
if (handler != null)
|
||||
{
|
||||
var args = new BoolChangeEventArgs(state, type);
|
||||
args.Index = index;
|
||||
BoolChange(this, args);
|
||||
}
|
||||
}
|
||||
|
||||
//******************************************************************************************
|
||||
protected void OnUShortChange(ushort state, ushort index, ushort type)
|
||||
{
|
||||
var handler = UShortChange;
|
||||
if (handler != null)
|
||||
{
|
||||
var args = new UshrtChangeEventArgs(state, type);
|
||||
args.Index = index;
|
||||
UShortChange(this, args);
|
||||
}
|
||||
}
|
||||
|
||||
protected void OnStringChange(string value, ushort index, ushort type)
|
||||
{
|
||||
var handler = StringChange;
|
||||
if (handler != null)
|
||||
{
|
||||
var args = new StringChangeEventArgs(value, type);
|
||||
args.Index = index;
|
||||
StringChange(this, args);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,175 @@
|
||||
using System;
|
||||
//using System.IO;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Crestron.SimplSharp;
|
||||
using Crestron.SimplSharp.CrestronIO;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
|
||||
namespace PepperDash.Core.JsonToSimpl
|
||||
{
|
||||
public class JsonToSimplFileMaster : JsonToSimplMaster
|
||||
{
|
||||
/// <summary>
|
||||
/// Sets the filepath as well as registers this with the Global.Masters list
|
||||
/// </summary>
|
||||
public string Filepath { get; private set; }
|
||||
|
||||
string ActualFilePath;
|
||||
|
||||
/*****************************************************************************************/
|
||||
/** Privates **/
|
||||
|
||||
|
||||
// The JSON file in JObject form
|
||||
// For gathering the incoming data
|
||||
object StringBuilderLock = new object();
|
||||
// To prevent multiple same-file access
|
||||
static object FileLock = new object();
|
||||
|
||||
/*****************************************************************************************/
|
||||
|
||||
/// <summary>
|
||||
/// SIMPL+ default constructor.
|
||||
/// </summary>
|
||||
public JsonToSimplFileMaster()
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Read, evaluate and udpate status
|
||||
/// </summary>
|
||||
public void EvaluateFile(string filepath)
|
||||
{
|
||||
Filepath = filepath;
|
||||
|
||||
OnBoolChange(false, 0, JsonToSimplConstants.JsonIsValidBoolChange);
|
||||
if (string.IsNullOrEmpty(Filepath))
|
||||
{
|
||||
CrestronConsole.PrintLine("Cannot evaluate file. JSON file path not set");
|
||||
return;
|
||||
}
|
||||
|
||||
// Resolve wildcard
|
||||
var dir = Path.GetDirectoryName(Filepath);
|
||||
Debug.Console(0, "Checking directory {0}", dir);
|
||||
var fileName = Path.GetFileName(Filepath);
|
||||
var directory = new DirectoryInfo(dir);
|
||||
|
||||
var actualFile = directory.GetFiles(fileName).FirstOrDefault();
|
||||
if(actualFile == null)
|
||||
{
|
||||
var msg = string.Format("JSON file not found: {0}", Filepath);
|
||||
CrestronConsole.PrintLine(msg);
|
||||
ErrorLog.Error(msg);
|
||||
return;
|
||||
}
|
||||
//var actualFileName = actualFile.FullName;
|
||||
ActualFilePath = actualFile.FullName;
|
||||
Debug.Console(0, "Actual JSON file is {0}", ActualFilePath);
|
||||
|
||||
string json = File.ReadToEnd(ActualFilePath, System.Text.Encoding.ASCII);
|
||||
|
||||
try
|
||||
{
|
||||
JsonObject = JObject.Parse(json);
|
||||
foreach (var child in Children)
|
||||
child.ProcessAll();
|
||||
OnBoolChange(true, 0, JsonToSimplConstants.JsonIsValidBoolChange);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
var msg = string.Format("JSON parsing failed:\r{0}", e);
|
||||
CrestronConsole.PrintLine(msg);
|
||||
ErrorLog.Error(msg);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
public override void Save()
|
||||
{
|
||||
// this code is duplicated in the other masters!!!!!!!!!!!!!
|
||||
UnsavedValues = new Dictionary<string, JValue>();
|
||||
// Make each child update their values into master object
|
||||
foreach (var child in Children)
|
||||
{
|
||||
Debug.Console(0, "Master [{0}] checking child [{1}] for updates to save", UniqueID, child.Key);
|
||||
child.UpdateInputsForMaster();
|
||||
}
|
||||
|
||||
if (UnsavedValues == null || UnsavedValues.Count == 0)
|
||||
{
|
||||
Debug.Console(0, "Master [{0}] No updated values to save. Skipping", UniqueID);
|
||||
return;
|
||||
}
|
||||
lock (FileLock)
|
||||
{
|
||||
Debug.Console(0, "Saving");
|
||||
foreach (var path in UnsavedValues.Keys)
|
||||
{
|
||||
var tokenToReplace = JsonObject.SelectToken(path);
|
||||
if (tokenToReplace != null)
|
||||
{// It's found
|
||||
tokenToReplace.Replace(UnsavedValues[path]);
|
||||
Debug.Console(0, "JSON Master[{0}] Updating '{1}'", UniqueID, path);
|
||||
}
|
||||
else // No token. Let's make one
|
||||
{
|
||||
//http://stackoverflow.com/questions/17455052/how-to-set-the-value-of-a-json-path-using-json-net
|
||||
Debug.Console(0, "JSON Master[{0}] Cannot write value onto missing property: '{1}'", UniqueID, path);
|
||||
|
||||
// JContainer jpart = JsonObject;
|
||||
// // walk down the path and find where it goes
|
||||
//#warning Does not handle arrays.
|
||||
// foreach (var part in path.Split('.'))
|
||||
// {
|
||||
|
||||
// var openPos = part.IndexOf('[');
|
||||
// if (openPos > -1)
|
||||
// {
|
||||
// openPos++; // move to number
|
||||
// var closePos = part.IndexOf(']');
|
||||
// var arrayName = part.Substring(0, openPos - 1); // get the name
|
||||
// var index = Convert.ToInt32(part.Substring(openPos, closePos - openPos));
|
||||
|
||||
// // Check if the array itself exists and add the item if so
|
||||
// if (jpart[arrayName] != null)
|
||||
// {
|
||||
// var arrayObj = jpart[arrayName] as JArray;
|
||||
// var item = arrayObj[index];
|
||||
// if (item == null)
|
||||
// arrayObj.Add(new JObject());
|
||||
// }
|
||||
|
||||
// Debug.Console(0, "IGNORING MISSING ARRAY VALUE FOR NOW");
|
||||
// continue;
|
||||
// }
|
||||
// // Build the
|
||||
// if (jpart[part] == null)
|
||||
// jpart.Add(new JProperty(part, new JObject()));
|
||||
// jpart = jpart[part] as JContainer;
|
||||
// }
|
||||
// jpart.Replace(UnsavedValues[path]);
|
||||
}
|
||||
}
|
||||
using (StreamWriter sw = new StreamWriter(ActualFilePath))
|
||||
{
|
||||
try
|
||||
{
|
||||
sw.Write(JsonObject.ToString());
|
||||
sw.Flush();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
string err = string.Format("Error writing JSON file:\r{0}", e);
|
||||
Debug.Console(0, err);
|
||||
ErrorLog.Warn(err);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
using System;
|
||||
//using System.IO;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Crestron.SimplSharp;
|
||||
using Crestron.SimplSharp.CrestronIO;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
|
||||
namespace PepperDash.Core.JsonToSimpl
|
||||
{
|
||||
|
||||
public class JsonToSimplFixedPathObject : JsonToSimplChildObjectBase
|
||||
{
|
||||
public JsonToSimplFixedPathObject()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,153 @@
|
||||
using System;
|
||||
//using System.IO;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Crestron.SimplSharp;
|
||||
using Crestron.SimplSharp.CrestronIO;
|
||||
using Crestron.SimplSharp.Net.Http;
|
||||
using Crestron.SimplSharp.Net.Https;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
|
||||
namespace PepperDash.Core.JsonToSimpl
|
||||
{
|
||||
public class JsonToSimplGenericMaster : JsonToSimplMaster
|
||||
{
|
||||
/*****************************************************************************************/
|
||||
/** Privates **/
|
||||
|
||||
|
||||
// The JSON file in JObject form
|
||||
// For gathering the incoming data
|
||||
object StringBuilderLock = new object();
|
||||
// To prevent multiple same-file access
|
||||
static object WriteLock = new object();
|
||||
|
||||
public Action<string> SaveCallback { get; set; }
|
||||
|
||||
/*****************************************************************************************/
|
||||
|
||||
/// <summary>
|
||||
/// SIMPL+ default constructor.
|
||||
/// </summary>
|
||||
public JsonToSimplGenericMaster()
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Loads in JSON and triggers evaluation on all children
|
||||
/// </summary>
|
||||
/// <param name="json"></param>
|
||||
public void LoadWithJson(string json)
|
||||
{
|
||||
OnBoolChange(false, 0, JsonToSimplConstants.JsonIsValidBoolChange);
|
||||
try
|
||||
{
|
||||
JsonObject = JObject.Parse(json);
|
||||
foreach (var child in Children)
|
||||
child.ProcessAll();
|
||||
OnBoolChange(true, 0, JsonToSimplConstants.JsonIsValidBoolChange);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
var msg = string.Format("JSON parsing failed:\r{0}", e);
|
||||
CrestronConsole.PrintLine(msg);
|
||||
ErrorLog.Error(msg);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Loads JSON into JsonObject, but does not trigger evaluation by children
|
||||
/// </summary>
|
||||
/// <param name="json"></param>
|
||||
public void SetJsonWithoutEvaluating(string json)
|
||||
{
|
||||
try
|
||||
{
|
||||
JsonObject = JObject.Parse(json);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Debug.Console(0, this, "JSON parsing failed:\r{0}", e);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public override void Save()
|
||||
{
|
||||
// this code is duplicated in the other masters!!!!!!!!!!!!!
|
||||
UnsavedValues = new Dictionary<string, JValue>();
|
||||
// Make each child update their values into master object
|
||||
foreach (var child in Children)
|
||||
{
|
||||
Debug.Console(1, this, "Master. checking child [{0}] for updates to save", child.Key);
|
||||
child.UpdateInputsForMaster();
|
||||
}
|
||||
|
||||
if (UnsavedValues == null || UnsavedValues.Count == 0)
|
||||
{
|
||||
Debug.Console(1, this, "Master. No updated values to save. Skipping");
|
||||
return;
|
||||
}
|
||||
|
||||
lock (WriteLock)
|
||||
{
|
||||
Debug.Console(1, this, "Saving");
|
||||
foreach (var path in UnsavedValues.Keys)
|
||||
{
|
||||
var tokenToReplace = JsonObject.SelectToken(path);
|
||||
if (tokenToReplace != null)
|
||||
{// It's found
|
||||
tokenToReplace.Replace(UnsavedValues[path]);
|
||||
Debug.Console(1, this, "Master Updating '{0}'", path);
|
||||
}
|
||||
else // No token. Let's make one
|
||||
{
|
||||
Debug.Console(1, "Master Cannot write value onto missing property: '{0}'", path);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (SaveCallback != null)
|
||||
SaveCallback(JsonObject.ToString());
|
||||
else
|
||||
Debug.Console(0, this, "WARNING: No save callback defined.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// JContainer jpart = JsonObject;
|
||||
// // walk down the path and find where it goes
|
||||
//#warning Does not handle arrays.
|
||||
// foreach (var part in path.Split('.'))
|
||||
// {
|
||||
|
||||
// var openPos = part.IndexOf('[');
|
||||
// if (openPos > -1)
|
||||
// {
|
||||
// openPos++; // move to number
|
||||
// var closePos = part.IndexOf(']');
|
||||
// var arrayName = part.Substring(0, openPos - 1); // get the name
|
||||
// var index = Convert.ToInt32(part.Substring(openPos, closePos - openPos));
|
||||
|
||||
// // Check if the array itself exists and add the item if so
|
||||
// if (jpart[arrayName] != null)
|
||||
// {
|
||||
// var arrayObj = jpart[arrayName] as JArray;
|
||||
// var item = arrayObj[index];
|
||||
// if (item == null)
|
||||
// arrayObj.Add(new JObject());
|
||||
// }
|
||||
|
||||
// Debug.Console(0, "IGNORING MISSING ARRAY VALUE FOR NOW");
|
||||
// continue;
|
||||
// }
|
||||
// // Build the
|
||||
// if (jpart[part] == null)
|
||||
// jpart.Add(new JProperty(part, new JObject()));
|
||||
// jpart = jpart[part] as JContainer;
|
||||
// }
|
||||
// jpart.Replace(UnsavedValues[path]);
|
||||
191
Pepperdash Core/Pepperdash Core/JsonToSimpl/JsonToSimplMaster.cs
Normal file
191
Pepperdash Core/Pepperdash Core/JsonToSimpl/JsonToSimplMaster.cs
Normal file
@@ -0,0 +1,191 @@
|
||||
using System;
|
||||
//using System.IO;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Crestron.SimplSharp;
|
||||
using Crestron.SimplSharp.CrestronIO;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
|
||||
namespace PepperDash.Core.JsonToSimpl
|
||||
{
|
||||
public abstract class JsonToSimplMaster : IKeyed
|
||||
{
|
||||
/*****************************************************************************************/
|
||||
/** Events **/
|
||||
|
||||
public event EventHandler<BoolChangeEventArgs> BoolChange;
|
||||
public event EventHandler<UshrtChangeEventArgs> UshrtChange;
|
||||
public event EventHandler<StringChangeEventArgs> StringChange;
|
||||
|
||||
protected List<JsonToSimplChildObjectBase> Children = new List<JsonToSimplChildObjectBase>();
|
||||
|
||||
/*****************************************************************************************/
|
||||
|
||||
/// <summary>
|
||||
/// Mirrors the Unique ID for now.
|
||||
/// </summary>
|
||||
public string Key { get { return UniqueID; } }
|
||||
|
||||
public string UniqueID { get; protected set; }
|
||||
|
||||
/// <summary>
|
||||
/// Merely for use in debug messages
|
||||
/// </summary>
|
||||
public string DebugName
|
||||
{
|
||||
get { return _DebugName; }
|
||||
set { if (DebugName == null) _DebugName = ""; else _DebugName = value; }
|
||||
}
|
||||
string _DebugName = "";
|
||||
|
||||
/// <summary>
|
||||
/// This will be prepended to all paths to allow path swapping or for more organized
|
||||
/// sub-paths
|
||||
/// </summary>
|
||||
public string PathPrefix { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// This is added to the end of all paths
|
||||
/// </summary>
|
||||
public string PathSuffix { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Enables debugging output to the console. Certain error messages will be logged to the
|
||||
/// system's error log regardless of this setting
|
||||
/// </summary>
|
||||
public bool DebugOn { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Ushort helper for Debug property
|
||||
/// </summary>
|
||||
public ushort UDebug
|
||||
{
|
||||
get { return (ushort)(DebugOn ? 1 : 0); }
|
||||
set
|
||||
{
|
||||
DebugOn = (value == 1);
|
||||
CrestronConsole.PrintLine("JsonToSimpl debug={0}", DebugOn);
|
||||
}
|
||||
}
|
||||
|
||||
public JObject JsonObject { get; protected set; }
|
||||
|
||||
/*****************************************************************************************/
|
||||
/** Privates **/
|
||||
|
||||
|
||||
// The JSON file in JObject form
|
||||
// For gathering the incoming data
|
||||
protected Dictionary<string, JValue> UnsavedValues = new Dictionary<string, JValue>();
|
||||
|
||||
/*****************************************************************************************/
|
||||
|
||||
/// <summary>
|
||||
/// SIMPL+ default constructor.
|
||||
/// </summary>
|
||||
public JsonToSimplMaster()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Sets up class - overriding methods should always call this.
|
||||
/// </summary>
|
||||
/// <param name="uniqueId"></param>
|
||||
public virtual void Initialize(string uniqueId)
|
||||
{
|
||||
UniqueID = uniqueId;
|
||||
J2SGlobal.AddMaster(this); // Should not re-add
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds a child "module" to this master
|
||||
/// </summary>
|
||||
/// <param name="child"></param>
|
||||
public void AddChild(JsonToSimplChildObjectBase child)
|
||||
{
|
||||
if (Children.Contains(child)) return;
|
||||
Children.Add(child);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Called from the child to add changed or new values for saving
|
||||
/// </summary>
|
||||
public void AddUnsavedValue(string path, JValue value)
|
||||
{
|
||||
if (UnsavedValues.ContainsKey(path))
|
||||
{
|
||||
Debug.Console(0, "Master[{0}] WARNING - Attempt to add duplicate value for path '{1}'.\r Ingoring. Please ensure that path does not exist on multiple modules.", UniqueID, path);
|
||||
}
|
||||
else
|
||||
UnsavedValues.Add(path, value);
|
||||
//Debug.Console(0, "Master[{0}] Unsaved size={1}", UniqueID, UnsavedValues.Count);
|
||||
}
|
||||
|
||||
public abstract void Save();
|
||||
|
||||
|
||||
//******************************************************************************************
|
||||
public static class JsonFixes
|
||||
{
|
||||
public static JObject ParseObject(string json)
|
||||
{
|
||||
using (var reader = new JsonTextReader(new Crestron.SimplSharp.CrestronIO.StringReader(json)))
|
||||
{
|
||||
var startDepth = reader.Depth;
|
||||
var obj = JObject.Load(reader);
|
||||
if (startDepth != reader.Depth)
|
||||
throw new JsonSerializationException("Unenclosed json found");
|
||||
return obj;
|
||||
}
|
||||
}
|
||||
|
||||
public static JArray ParseArray(string json)
|
||||
{
|
||||
using (var reader = new JsonTextReader(new Crestron.SimplSharp.CrestronIO.StringReader(json)))
|
||||
{
|
||||
var startDepth = reader.Depth;
|
||||
var obj = JArray.Load(reader);
|
||||
if (startDepth != reader.Depth)
|
||||
throw new JsonSerializationException("Unenclosed json found");
|
||||
return obj;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Helpers for events
|
||||
//******************************************************************************************
|
||||
protected void OnBoolChange(bool state, ushort index, ushort type)
|
||||
{
|
||||
if (BoolChange != null)
|
||||
{
|
||||
var args = new BoolChangeEventArgs(state, type);
|
||||
args.Index = index;
|
||||
BoolChange(this, args);
|
||||
}
|
||||
}
|
||||
|
||||
//******************************************************************************************
|
||||
protected void OnUshrtChange(ushort state, ushort index, ushort type)
|
||||
{
|
||||
if (UshrtChange != null)
|
||||
{
|
||||
var args = new UshrtChangeEventArgs(state, type);
|
||||
args.Index = index;
|
||||
UshrtChange(this, args);
|
||||
}
|
||||
}
|
||||
|
||||
protected void OnStringChange(string value, ushort index, ushort type)
|
||||
{
|
||||
if (StringChange != null)
|
||||
{
|
||||
var args = new StringChangeEventArgs(value, type);
|
||||
args.Index = index;
|
||||
StringChange(this, args);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
//using System;
|
||||
////using System.IO;
|
||||
//using System.Collections.Generic;
|
||||
//using System.Linq;
|
||||
//using System.Text;
|
||||
//using Crestron.SimplSharp;
|
||||
//using Crestron.SimplSharp.CrestronIO;
|
||||
//using Newtonsoft.Json;
|
||||
//using Newtonsoft.Json.Linq;
|
||||
|
||||
//namespace PepperDash.Core.JsonToSimpl
|
||||
//{
|
||||
|
||||
// public class JsonToSimplFixedPathObject : JsonToSimplChildObjectBase
|
||||
// {
|
||||
// public JsonToSimplFixedPathObject()
|
||||
// {
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
@@ -73,8 +73,20 @@
|
||||
<Compile Include="Device.cs" />
|
||||
<Compile Include="EthernetHelper.cs" />
|
||||
<Compile Include="Comm\GenericTcpIpClient.cs" />
|
||||
<Compile Include="JsonToSimpl\EventArgs and Constants.cs" />
|
||||
<Compile Include="JsonToSimpl\Global.cs" />
|
||||
<Compile Include="JsonToSimpl\JsonToSimplArrayLookupChild.cs" />
|
||||
<Compile Include="JsonToSimpl\JsonToSimplChildObjectBase.cs" />
|
||||
<Compile Include="JsonToSimpl\JsonToSimplFileMaster.cs" />
|
||||
<Compile Include="JsonToSimpl\JsonToSimplFixedPathObject.cs" />
|
||||
<Compile Include="JsonToSimpl\REMOVE JsonToSimplFixedPathObject.cs" />
|
||||
<Compile Include="JsonToSimpl\JsonToSimplGenericMaster.cs" />
|
||||
<Compile Include="JsonToSimpl\JsonToSimplMaster.cs" />
|
||||
<Compile Include="Network\DiscoveryThings.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="WebApi\Presets\Preset.cs" />
|
||||
<Compile Include="WebApi\Presets\User.cs" />
|
||||
<Compile Include="WebApi\Presets\WebApiPasscodeClient.cs" />
|
||||
<None Include="Properties\ControlSystem.cfg" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CompactFramework.CSharp.targets" />
|
||||
|
||||
Binary file not shown.
@@ -4,5 +4,5 @@
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("Pepperdash_Core")]
|
||||
[assembly: AssemblyCopyright("Copyright © 2016")]
|
||||
[assembly: AssemblyVersion("1.0.0.*")]
|
||||
[assembly: AssemblyVersion("1.0.*")]
|
||||
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
12/29/2016 1:56:10 PM, Info: Initializing SIMPLSharp Services...
|
||||
12/29/2016 1:56:10 PM, Info: ProjectInfo successfully initialized.
|
||||
12/29/2016 2:14:42 PM, Info: Validating assembly C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.dll...
|
||||
12/29/2016 2:14:42 PM, Info: Verifying assembly C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.dll
|
||||
12/29/2016 2:14:42 PM, Info: Creating Archive C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.clz...
|
||||
12/29/2016 2:14:43 PM, Info: Saving project information...
|
||||
12/29/2016 2:16:45 PM, Info: Validating assembly C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.dll...
|
||||
12/29/2016 2:16:46 PM, Info: Verifying assembly C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.dll
|
||||
12/29/2016 2:16:46 PM, Info: Creating Archive C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.clz...
|
||||
12/29/2016 2:16:46 PM, Info: Saving project information...
|
||||
1/3/2017 2:45:48 PM, Info: Terminating SIMPLSharp Services
|
||||
@@ -0,0 +1,3 @@
|
||||
1/3/2017 3:30:31 PM, Info: Initializing SIMPLSharp Services...
|
||||
1/3/2017 3:30:32 PM, Info: ProjectInfo successfully initialized.
|
||||
1/3/2017 3:33:21 PM, Info: Terminating SIMPLSharp Services
|
||||
@@ -0,0 +1,7 @@
|
||||
1/3/2017 3:34:10 PM, Info: Initializing SIMPLSharp Services...
|
||||
1/3/2017 3:34:10 PM, Info: ProjectInfo successfully initialized.
|
||||
1/3/2017 3:35:44 PM, Info: Validating assembly C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.dll...
|
||||
1/3/2017 3:35:44 PM, Info: Verifying assembly C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.dll
|
||||
1/3/2017 3:35:44 PM, Info: Creating Archive C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.clz...
|
||||
1/3/2017 3:35:45 PM, Info: Saving project information...
|
||||
1/3/2017 4:32:09 PM, Info: Terminating SIMPLSharp Services
|
||||
@@ -0,0 +1,29 @@
|
||||
1/4/2017 9:38:26 AM, Info: Initializing SIMPLSharp Services...
|
||||
1/4/2017 9:38:27 AM, Info: ProjectInfo successfully initialized.
|
||||
1/4/2017 9:48:06 AM, Info: Saving project information...
|
||||
1/4/2017 9:48:06 AM, Info: Saving project information...
|
||||
1/4/2017 9:50:00 AM, Info: Saving project information...
|
||||
1/4/2017 9:50:00 AM, Info: Saving project information...
|
||||
1/4/2017 9:50:00 AM, Info: Saving project information...
|
||||
1/4/2017 9:50:00 AM, Info: Saving project information...
|
||||
1/4/2017 9:50:01 AM, Info: Validating assembly C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.dll...
|
||||
1/4/2017 9:50:02 AM, Info: Verifying assembly C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.dll
|
||||
1/4/2017 9:50:02 AM, Info: Creating Archive C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.clz...
|
||||
1/4/2017 9:50:02 AM, Info: Saving project information...
|
||||
1/4/2017 10:37:54 AM, Info: Saving project information...
|
||||
1/4/2017 10:37:54 AM, Info: Saving project information...
|
||||
1/4/2017 10:37:54 AM, Info: Saving project information...
|
||||
1/4/2017 10:37:54 AM, Info: Saving project information...
|
||||
1/4/2017 10:37:54 AM, Info: Validating assembly C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.dll...
|
||||
1/4/2017 10:37:55 AM, Info: Verifying assembly C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.dll
|
||||
1/4/2017 10:37:55 AM, Info: Creating Archive C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.clz...
|
||||
1/4/2017 10:37:55 AM, Info: Saving project information...
|
||||
1/4/2017 10:44:01 AM, Info: Saving project information...
|
||||
1/4/2017 10:44:01 AM, Info: Saving project information...
|
||||
1/4/2017 10:44:01 AM, Info: Saving project information...
|
||||
1/4/2017 10:44:01 AM, Info: Saving project information...
|
||||
1/4/2017 10:44:02 AM, Info: Validating assembly C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.dll...
|
||||
1/4/2017 10:44:02 AM, Info: Verifying assembly C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.dll
|
||||
1/4/2017 10:44:02 AM, Info: Creating Archive C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.clz...
|
||||
1/4/2017 10:44:03 AM, Info: Saving project information...
|
||||
1/4/2017 11:06:47 AM, Info: Terminating SIMPLSharp Services
|
||||
@@ -0,0 +1,39 @@
|
||||
1/4/2017 12:35:17 PM, Info: Initializing SIMPLSharp Services...
|
||||
1/4/2017 12:35:17 PM, Info: ProjectInfo successfully initialized.
|
||||
1/4/2017 12:43:03 PM, Info: Validating assembly C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.dll...
|
||||
1/4/2017 12:43:04 PM, Info: Verifying assembly C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.dll
|
||||
1/4/2017 12:43:04 PM, Info: Creating Archive C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.clz...
|
||||
1/4/2017 12:43:04 PM, Info: Saving project information...
|
||||
1/4/2017 1:50:06 PM, Info: Validating assembly C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.dll...
|
||||
1/4/2017 1:50:06 PM, Info: Verifying assembly C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.dll
|
||||
1/4/2017 1:50:06 PM, Info: Creating Archive C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.clz...
|
||||
1/4/2017 1:50:06 PM, Info: Saving project information...
|
||||
1/4/2017 1:55:36 PM, Info: Validating assembly C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.dll...
|
||||
1/4/2017 1:55:36 PM, Info: Verifying assembly C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.dll
|
||||
1/4/2017 1:55:36 PM, Info: Creating Archive C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.clz...
|
||||
1/4/2017 1:55:36 PM, Info: Saving project information...
|
||||
1/4/2017 1:58:48 PM, Info: Validating assembly C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.dll...
|
||||
1/4/2017 1:58:48 PM, Info: Verifying assembly C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.dll
|
||||
1/4/2017 1:58:48 PM, Info: Creating Archive C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.clz...
|
||||
1/4/2017 1:58:48 PM, Info: Saving project information...
|
||||
1/4/2017 2:00:00 PM, Info: Validating assembly C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.dll...
|
||||
1/4/2017 2:00:01 PM, Info: Verifying assembly C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.dll
|
||||
1/4/2017 2:00:01 PM, Info: Creating Archive C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.clz...
|
||||
1/4/2017 2:00:01 PM, Info: Saving project information...
|
||||
1/4/2017 2:00:10 PM, Info: Validating assembly C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.dll...
|
||||
1/4/2017 2:00:11 PM, Info: Verifying assembly C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.dll
|
||||
1/4/2017 2:00:11 PM, Info: Creating Archive C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.clz...
|
||||
1/4/2017 2:00:11 PM, Info: Saving project information...
|
||||
1/4/2017 2:00:32 PM, Info: Validating assembly C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.dll...
|
||||
1/4/2017 2:00:32 PM, Info: Verifying assembly C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.dll
|
||||
1/4/2017 2:00:32 PM, Info: Creating Archive C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.clz...
|
||||
1/4/2017 2:00:33 PM, Info: Saving project information...
|
||||
1/4/2017 2:18:17 PM, Info: Validating assembly C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.dll...
|
||||
1/4/2017 2:18:18 PM, Info: Verifying assembly C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.dll
|
||||
1/4/2017 2:18:18 PM, Info: Creating Archive C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.clz...
|
||||
1/4/2017 2:18:18 PM, Info: Saving project information...
|
||||
1/4/2017 2:31:43 PM, Info: Validating assembly C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.dll...
|
||||
1/4/2017 2:31:43 PM, Info: Verifying assembly C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.dll
|
||||
1/4/2017 2:31:43 PM, Info: Creating Archive C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.clz...
|
||||
1/4/2017 2:31:44 PM, Info: Saving project information...
|
||||
1/4/2017 2:41:56 PM, Info: Terminating SIMPLSharp Services
|
||||
51
Pepperdash Core/Pepperdash Core/WebApi/Presets/Preset.cs
Normal file
51
Pepperdash Core/Pepperdash Core/WebApi/Presets/Preset.cs
Normal file
@@ -0,0 +1,51 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Crestron.SimplSharp;
|
||||
|
||||
using Newtonsoft.Json;
|
||||
|
||||
|
||||
namespace PepperDash.Core.WebApi.Presets
|
||||
{
|
||||
public class Preset
|
||||
{
|
||||
public int Id { get; set; }
|
||||
|
||||
public int UserId { get; set; }
|
||||
|
||||
public int RoomTypeId { get; set; }
|
||||
|
||||
public string PresetName { get; set; }
|
||||
|
||||
public int PresetNumber { get; set; }
|
||||
|
||||
public string Data { get; set; }
|
||||
|
||||
public Preset()
|
||||
{
|
||||
PresetName = "";
|
||||
PresetNumber = 1;
|
||||
Data = "{}";
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public class PresetReceivedEventArgs : EventArgs
|
||||
{
|
||||
public Preset Preset { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// For Simpl+
|
||||
/// </summary>
|
||||
public PresetReceivedEventArgs() { }
|
||||
|
||||
public PresetReceivedEventArgs(Preset preset)
|
||||
{
|
||||
Preset = preset;
|
||||
}
|
||||
}
|
||||
}
|
||||
53
Pepperdash Core/Pepperdash Core/WebApi/Presets/User.cs
Normal file
53
Pepperdash Core/Pepperdash Core/WebApi/Presets/User.cs
Normal file
@@ -0,0 +1,53 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Crestron.SimplSharp;
|
||||
|
||||
namespace PepperDash.Core.WebApi.Presets
|
||||
{
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public class User
|
||||
{
|
||||
public int Id { get; set; }
|
||||
|
||||
public string ExternalId { get; set; }
|
||||
|
||||
public string FirstName { get; set; }
|
||||
|
||||
public string LastName { get; set; }
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public class UserReceivedEventArgs : EventArgs
|
||||
{
|
||||
public User User { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// For Simpl+
|
||||
/// </summary>
|
||||
public UserReceivedEventArgs() { }
|
||||
|
||||
public UserReceivedEventArgs(User user)
|
||||
{
|
||||
User = user;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public class UserAndRoomMessage
|
||||
{
|
||||
public int UserId { get; set; }
|
||||
|
||||
public int RoomTypeId { get; set; }
|
||||
|
||||
public int PresetNumber { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,231 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
using Crestron.SimplSharp; // For Basic SIMPL# Classes
|
||||
using Crestron.SimplSharp.CrestronIO;
|
||||
using Crestron.SimplSharp.Net;
|
||||
using Crestron.SimplSharp.Net.Http;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Linq;
|
||||
|
||||
using PepperDash.Core;
|
||||
using PepperDash.Core.JsonToSimpl;
|
||||
|
||||
|
||||
namespace PepperDash.Core.WebApi.Presets
|
||||
{
|
||||
public class WebApiPasscodeClient : IKeyed
|
||||
{
|
||||
public event EventHandler<UserReceivedEventArgs> UserReceived;
|
||||
|
||||
public event EventHandler<PresetReceivedEventArgs> PresetReceived;
|
||||
|
||||
public string Key { get; private set; }
|
||||
|
||||
//string JsonMasterKey;
|
||||
|
||||
/// <summary>
|
||||
/// An embedded JsonToSimpl master object.
|
||||
/// </summary>
|
||||
JsonToSimplGenericMaster J2SMaster;
|
||||
|
||||
string UrlBase;
|
||||
|
||||
string DefaultPresetJsonFilePath;
|
||||
|
||||
User CurrentUser;
|
||||
|
||||
Preset CurrentPreset;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// SIMPL+ can only execute the default constructor. If you have variables that require initialization, please
|
||||
/// use an Initialize method
|
||||
/// </summary>
|
||||
public WebApiPasscodeClient()
|
||||
{
|
||||
}
|
||||
|
||||
public void Initialize(string key, string jsonMasterKey, string urlBase, string defaultPresetJsonFilePath)
|
||||
{
|
||||
Key = key;
|
||||
//JsonMasterKey = jsonMasterKey;
|
||||
UrlBase = urlBase;
|
||||
DefaultPresetJsonFilePath = defaultPresetJsonFilePath;
|
||||
|
||||
J2SMaster = new JsonToSimplGenericMaster();
|
||||
J2SMaster.SaveCallback = this.SaveCallback;
|
||||
J2SMaster.Initialize(jsonMasterKey);
|
||||
}
|
||||
|
||||
public void GetUserForPasscode(string passcode)
|
||||
{
|
||||
|
||||
|
||||
var req = new HttpClientRequest();
|
||||
req.Url = new UrlParser(UrlBase + "/api/users/dopin");
|
||||
req.RequestType = RequestType.Post;
|
||||
req.Header.AddHeader(new HttpHeader("Content-Type", "application/json"));
|
||||
req.Header.AddHeader(new HttpHeader("Accept", "application/json"));
|
||||
var jo = new JObject();
|
||||
jo.Add("pin", passcode);
|
||||
req.ContentString = jo.ToString();
|
||||
|
||||
var client = new HttpClient();
|
||||
var resp = client.Dispatch(req);
|
||||
if (resp.Code == 200)
|
||||
{
|
||||
CrestronConsole.PrintLine("Received: {0}", resp.ContentString);
|
||||
var user = JsonConvert.DeserializeObject<User>(resp.ContentString);
|
||||
#warning CHECK for user success here??
|
||||
CurrentUser = user;
|
||||
var handler = UserReceived;
|
||||
if (handler != null)
|
||||
UserReceived(this, new UserReceivedEventArgs(user));
|
||||
}
|
||||
else
|
||||
CrestronConsole.PrintLine("No user received: {0}", resp.Code);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="roomTypeId"></param>
|
||||
/// <param name="presetNumber"></param>
|
||||
public void GetPresetForThisUser(int roomTypeId, int presetNumber)
|
||||
{
|
||||
if (CurrentUser == null)
|
||||
{
|
||||
CrestronConsole.PrintLine("GetPresetForThisUser no user loaded");
|
||||
return;
|
||||
}
|
||||
|
||||
var msg = new UserAndRoomMessage
|
||||
{
|
||||
UserId = CurrentUser.Id,
|
||||
RoomTypeId = roomTypeId,
|
||||
PresetNumber = presetNumber
|
||||
};
|
||||
|
||||
var req = new HttpClientRequest();
|
||||
req.Url = new UrlParser(UrlBase + "/api/presets/userandroom");
|
||||
req.RequestType = RequestType.Post;
|
||||
req.Header.AddHeader(new HttpHeader("Content-Type", "application/json"));
|
||||
req.Header.AddHeader(new HttpHeader("Accept", "application/json"));
|
||||
req.ContentString = JsonConvert.SerializeObject(msg);
|
||||
|
||||
var client = new HttpClient();
|
||||
try
|
||||
{
|
||||
var resp = client.Dispatch(req);
|
||||
if (resp.Code == 200)
|
||||
{
|
||||
Debug.Console(1, this, "Received: {0}", resp.ContentString);
|
||||
var preset = JsonConvert.DeserializeObject<Preset>(resp.ContentString);
|
||||
|
||||
CurrentPreset = preset;
|
||||
|
||||
//if there's no preset data, load the template
|
||||
if (preset.Data == null || preset.Data.Trim() == string.Empty || JObject.Parse(preset.Data).Count == 0)
|
||||
{
|
||||
Debug.Console(1, this, "Loaded preset has no data. Loading default template.");
|
||||
LoadDefaultPresetData();
|
||||
return;
|
||||
}
|
||||
|
||||
J2SMaster.LoadWithJson(preset.Data);
|
||||
var handler = PresetReceived;
|
||||
if (handler != null)
|
||||
PresetReceived(this, new PresetReceivedEventArgs(preset));
|
||||
}
|
||||
}
|
||||
catch (HttpException e)
|
||||
{
|
||||
var resp = e.Response;
|
||||
Debug.Console(1, this, "No preset received (code {0}). Loading default template", resp.Code);
|
||||
LoadDefaultPresetData();
|
||||
}
|
||||
}
|
||||
|
||||
void LoadDefaultPresetData()
|
||||
{
|
||||
CurrentPreset = null;
|
||||
if (!File.Exists(DefaultPresetJsonFilePath))
|
||||
{
|
||||
Debug.Console(0, this, "Cannot load default preset file. Saving will not work");
|
||||
return;
|
||||
}
|
||||
using (StreamReader sr = new StreamReader(DefaultPresetJsonFilePath))
|
||||
{
|
||||
try
|
||||
{
|
||||
var data = sr.ReadToEnd();
|
||||
J2SMaster.SetJsonWithoutEvaluating(data);
|
||||
CurrentPreset = new Preset() { Data = data, UserId = CurrentUser.Id };
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Debug.Console(0, this, "Error reading default preset JSON: \r{0}", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="roomTypeId"></param>
|
||||
/// <param name="presetNumber"></param>
|
||||
public void SavePresetForThisUser(int roomTypeId, int presetNumber)
|
||||
{
|
||||
if (CurrentPreset == null)
|
||||
LoadDefaultPresetData();
|
||||
//return;
|
||||
|
||||
//// A new preset needs to have its numbers set
|
||||
//if (CurrentPreset.IsNewPreset)
|
||||
//{
|
||||
CurrentPreset.UserId = CurrentUser.Id;
|
||||
CurrentPreset.RoomTypeId = roomTypeId;
|
||||
CurrentPreset.PresetNumber = presetNumber;
|
||||
//}
|
||||
J2SMaster.Save(); // Will trigger callback when ready
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// After save operation on JSON master happens, send it to server
|
||||
/// </summary>
|
||||
/// <param name="json"></param>
|
||||
void SaveCallback(string json)
|
||||
{
|
||||
CurrentPreset.Data = json;
|
||||
|
||||
var req = new HttpClientRequest();
|
||||
req.RequestType = RequestType.Post;
|
||||
req.Url = new UrlParser(string.Format("{0}/api/presets/addorchange", UrlBase));
|
||||
req.Header.AddHeader(new HttpHeader("Content-Type", "application/json"));
|
||||
req.Header.AddHeader(new HttpHeader("Accept", "application/json"));
|
||||
req.ContentString = JsonConvert.SerializeObject(CurrentPreset);
|
||||
|
||||
var client = new HttpClient();
|
||||
try
|
||||
{
|
||||
var resp = client.Dispatch(req);
|
||||
|
||||
// 201=created
|
||||
// 204=empty content
|
||||
if (resp.Code == 201)
|
||||
CrestronConsole.PrintLine("Preset added");
|
||||
else if (resp.Code == 204)
|
||||
CrestronConsole.PrintLine("Preset updated");
|
||||
else if (resp.Code == 209)
|
||||
CrestronConsole.PrintLine("Preset already exists. Cannot save as new.");
|
||||
else
|
||||
CrestronConsole.PrintLine("Preset save failed: {0}\r", resp.Code, resp.ContentString);
|
||||
}
|
||||
catch (HttpException e)
|
||||
{
|
||||
|
||||
CrestronConsole.PrintLine("Preset save exception {0}", e.Response.Code);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
BIN
Pepperdash Core/Pepperdash Core/bin/Newtonsoft.Json.Compact.dll
Normal file
BIN
Pepperdash Core/Pepperdash Core/bin/Newtonsoft.Json.Compact.dll
Normal file
Binary file not shown.
Binary file not shown.
@@ -10,8 +10,8 @@
|
||||
<ArchiveName />
|
||||
</RequiredInfo>
|
||||
<OptionalInfo>
|
||||
<CompiledOn>12/7/2016 11:49:31 AM</CompiledOn>
|
||||
<CompilerRev>1.0.0.21285</CompilerRev>
|
||||
<CompiledOn>1/4/2017 2:31:43 PM</CompiledOn>
|
||||
<CompilerRev>1.0.6213.26151</CompilerRev>
|
||||
</OptionalInfo>
|
||||
<Plugin>
|
||||
<Version>Crestron.SIMPLSharp, Version=2.0.48.0, Culture=neutral, PublicKeyToken=812d080f93e2de10</Version>
|
||||
|
||||
Binary file not shown.
BIN
Pepperdash Core/Pepperdash Core/bin/PepperDash_Core.pdb
Normal file
BIN
Pepperdash Core/Pepperdash Core/bin/PepperDash_Core.pdb
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Pepperdash Core/Pepperdash Core/bin/SimplSharpNewtonsoft.dll
Normal file
BIN
Pepperdash Core/Pepperdash Core/bin/SimplSharpNewtonsoft.dll
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,7 +1,11 @@
|
||||
MainAssembly=PepperDash_Core.dll:b01629320e6c37f54b704d6f0e45c085
|
||||
MainAssembly=PepperDash_Core.dll:e116822f63c3419f6399d53e084bd358
|
||||
MainAssemblyMinFirmwareVersion=1.007.0017
|
||||
MainAssemblyResource=SimplSharpData.dat:315526abf906cded47fb0c7510266a7e
|
||||
ü
|
||||
DependencySource=Newtonsoft.Json.Compact.dll:ea996aa2ec65aa1878e7c9d09e37a896
|
||||
DependencyPath=PepperDash_Core.clz:Newtonsoft.Json.Compact.dll
|
||||
DependencyMainAssembly=Newtonsoft.Json.Compact.dll:ea996aa2ec65aa1878e7c9d09e37a896
|
||||
ü
|
||||
DependencySource=SimplSharpCustomAttributesInterface.dll:9c4b4d4c519b655af90016edca2d66b9
|
||||
DependencyPath=PepperDash_Core.clz:SimplSharpCustomAttributesInterface.dll
|
||||
DependencyMainAssembly=SimplSharpCustomAttributesInterface.dll:9c4b4d4c519b655af90016edca2d66b9
|
||||
|
||||
Binary file not shown.
BIN
Pepperdash Core/Pepperdash Core/obj/Debug/PepperDash_Core.dll
Normal file
BIN
Pepperdash Core/Pepperdash Core/obj/Debug/PepperDash_Core.dll
Normal file
Binary file not shown.
BIN
Pepperdash Core/Pepperdash Core/obj/Debug/PepperDash_Core.pdb
Normal file
BIN
Pepperdash Core/Pepperdash Core/obj/Debug/PepperDash_Core.pdb
Normal file
Binary file not shown.
@@ -8,3 +8,13 @@ C:\Users\hvolm\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepper
|
||||
C:\Users\hvolm\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\obj\Debug\ResolveAssemblyReference.cache
|
||||
C:\Users\hvolm\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\obj\Debug\PepperDash_Core.dll
|
||||
C:\Users\hvolm\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\obj\Debug\PepperDash_Core.pdb
|
||||
C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.dll
|
||||
C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\PepperDash_Core.pdb
|
||||
C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\SimplSharpCustomAttributesInterface.dll
|
||||
C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\SimplSharpHelperInterface.dll
|
||||
C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\SimplSharpNewtonsoft.dll
|
||||
C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\SimplSharpSQLHelperInterface.dll
|
||||
C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\bin\SimplSharpReflectionInterface.dll
|
||||
C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\obj\Debug\ResolveAssemblyReference.cache
|
||||
C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\obj\Debug\PepperDash_Core.dll
|
||||
C:\Users\hvolmer\Desktop\working\pepperdash-simplsharp-core\Pepperdash Core\Pepperdash Core\obj\Debug\PepperDash_Core.pdb
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user