mirror of
https://github.com/PepperDash/Essentials.git
synced 2026-02-18 14:15:08 +00:00
Compare commits
5 Commits
1.9.2-pr73
...
1.9.2-hotf
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
eec86fde48 | ||
|
|
7b57ce439e | ||
|
|
5d120391a5 | ||
|
|
db5aa319ec | ||
|
|
4cc40227fd |
3
.github/ISSUE_TEMPLATE/bug_report.md
vendored
3
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -7,6 +7,9 @@ assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Was this bug identified in a specific build version?**
|
||||
Please note the build version where this bug was identified
|
||||
|
||||
**Describe the bug**
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
|
||||
@@ -131,46 +131,29 @@ namespace PepperDash.Essentials
|
||||
|
||||
if (CrestronEnvironment.DevicePlatform != eDevicePlatform.Server) // Handles 3-series running Windows CE OS
|
||||
{
|
||||
string userFolder;
|
||||
string nvramFolder;
|
||||
bool is4series = false;
|
||||
|
||||
if (eCrestronSeries.Series4 == (Global.ProcessorSeries & eCrestronSeries.Series4)) // Handle 4-series
|
||||
{
|
||||
is4series = true;
|
||||
// Set path to user/
|
||||
userFolder = "user";
|
||||
nvramFolder = "nvram";
|
||||
}
|
||||
else
|
||||
{
|
||||
userFolder = "User";
|
||||
nvramFolder = "Nvram";
|
||||
}
|
||||
|
||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Starting Essentials v{0} on {1} Appliance", Global.AssemblyVersion, is4series ? "4-series" : "3-series");
|
||||
Debug.Console(0, Debug.ErrorLogLevel.Notice, "Starting Essentials v{0} on {1} Appliance", Global.AssemblyVersion, Global.ProcessorSeries.ToString());
|
||||
|
||||
// Check if User/ProgramX exists
|
||||
if (Directory.Exists(Global.ApplicationDirectoryPathPrefix + dirSeparator + userFolder
|
||||
if (Directory.Exists(Global.ApplicationDirectoryPathPrefix + dirSeparator + "User"
|
||||
+ dirSeparator + string.Format("program{0}", InitialParametersClass.ApplicationNumber)))
|
||||
{
|
||||
Debug.Console(0, @"{0}/program{1} directory found", userFolder, InitialParametersClass.ApplicationNumber);
|
||||
filePathPrefix = directoryPrefix + dirSeparator + userFolder
|
||||
Debug.Console(0, @"User/program{0} directory found", InitialParametersClass.ApplicationNumber);
|
||||
filePathPrefix = directoryPrefix + dirSeparator + "User"
|
||||
+ dirSeparator + string.Format("program{0}", InitialParametersClass.ApplicationNumber) + dirSeparator;
|
||||
}
|
||||
// Check if Nvram/Programx exists
|
||||
else if (Directory.Exists(directoryPrefix + dirSeparator + nvramFolder
|
||||
else if (Directory.Exists(directoryPrefix + dirSeparator + "Nvram"
|
||||
+ dirSeparator + string.Format("program{0}", InitialParametersClass.ApplicationNumber)))
|
||||
{
|
||||
Debug.Console(0, @"{0}/program{1} directory found", nvramFolder, InitialParametersClass.ApplicationNumber);
|
||||
filePathPrefix = directoryPrefix + dirSeparator + nvramFolder
|
||||
Debug.Console(0, @"Nvram/program{0} directory found", InitialParametersClass.ApplicationNumber);
|
||||
filePathPrefix = directoryPrefix + dirSeparator + "Nvram"
|
||||
+ dirSeparator + string.Format("program{0}", InitialParametersClass.ApplicationNumber) + dirSeparator;
|
||||
}
|
||||
// If neither exists, set path to User/ProgramX
|
||||
else
|
||||
{
|
||||
Debug.Console(0, @"No previous directory found. Using {0}/program{1}", userFolder, InitialParametersClass.ApplicationNumber);
|
||||
filePathPrefix = directoryPrefix + dirSeparator + userFolder
|
||||
Debug.Console(0, @"No previous directory found. Using User/program{0}", InitialParametersClass.ApplicationNumber);
|
||||
filePathPrefix = directoryPrefix + dirSeparator + "User"
|
||||
+ dirSeparator + string.Format("program{0}", InitialParametersClass.ApplicationNumber) + dirSeparator;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -79,6 +79,16 @@ namespace PepperDash.Essentials
|
||||
Panel = new Tsw1052(id, Global.ControlSystem);
|
||||
else if (type == "tsw1060")
|
||||
Panel = new Tsw1060(id, Global.ControlSystem);
|
||||
else if (type == "tsw570")
|
||||
Panel = new Tsw570(id, Global.ControlSystem);
|
||||
else if (type == "tsw770")
|
||||
Panel = new Tsw770(id, Global.ControlSystem);
|
||||
else if (type == "ts770")
|
||||
Panel = new Ts770(id, Global.ControlSystem);
|
||||
else if (type == "tsw1070")
|
||||
Panel = new Tsw1070(id, Global.ControlSystem);
|
||||
else if (type == "ts1070")
|
||||
Panel = new Ts1070(id, Global.ControlSystem);
|
||||
else
|
||||
{
|
||||
Debug.Console(0, this, Debug.ErrorLogLevel.Notice, "WARNING: Cannot create TSW controller with type '{0}'", type);
|
||||
@@ -203,7 +213,7 @@ namespace PepperDash.Essentials
|
||||
{
|
||||
public EssentialsTouchpanelControllerFactory()
|
||||
{
|
||||
TypeNames = new List<string>() { "tsw550", "tsw750", "tsw1050", "tsw560", "tsw760", "tsw1060", "xpanel" };
|
||||
TypeNames = new List<string>() { "tsw550", "tsw750", "tsw1050", "tsw560", "tsw760", "tsw1060", "tsw570", "tsw770", "ts770", "tsw1070", "ts1070", "xpanel" };
|
||||
}
|
||||
|
||||
public override EssentialsDevice BuildDevice(DeviceConfig dc)
|
||||
|
||||
@@ -764,10 +764,6 @@ namespace PepperDash.Essentials
|
||||
/// </summary>
|
||||
public const uint NextMeetingModalVisible = 15049;
|
||||
/// <summary>
|
||||
/// 15050
|
||||
/// </summary>
|
||||
public const uint NextMeetingNotificationRibbonVisible = 15050;
|
||||
/// <summary>
|
||||
/// 15051
|
||||
/// </summary>
|
||||
public const uint Display1SelectPressAndFb = 15051;
|
||||
|
||||
@@ -77,9 +77,10 @@ namespace PepperDash.Essentials.Core
|
||||
var mParams = method.GetParameters();
|
||||
|
||||
var convertedParams = mParams
|
||||
.Select((p, i) => ConvertType(action.Params[i], p.ParameterType))
|
||||
.Select((p, i) => Convert.ChangeType(action.Params[i], p.ParameterType,
|
||||
System.Globalization.CultureInfo.InvariantCulture))
|
||||
.ToArray();
|
||||
method.Invoke(obj, convertedParams);
|
||||
var ret = method.Invoke(obj, convertedParams);
|
||||
|
||||
CrestronConsole.ConsoleCommandResponse("Method {0} successfully called on device {1}", method.Name,
|
||||
action.DeviceKey);
|
||||
@@ -90,23 +91,6 @@ namespace PepperDash.Essentials.Core
|
||||
ex.Message);}
|
||||
}
|
||||
|
||||
private static object ConvertType(object value, Type conversionType)
|
||||
{
|
||||
if (!conversionType.IsEnum)
|
||||
{
|
||||
return Convert.ChangeType(value, conversionType, System.Globalization.CultureInfo.InvariantCulture);
|
||||
}
|
||||
|
||||
var stringValue = Convert.ToString(value);
|
||||
|
||||
if (String.IsNullOrEmpty(stringValue))
|
||||
{
|
||||
throw new InvalidCastException(
|
||||
String.Format("{0} cannot be converted to a string prior to conversion to enum"));
|
||||
}
|
||||
return Enum.Parse(conversionType, stringValue, true);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the properties on a device
|
||||
/// </summary>
|
||||
@@ -291,8 +275,6 @@ namespace PepperDash.Essentials.Core
|
||||
//var props = t.GetProperties().Select(p => new PropertyNameType(p, obj));
|
||||
//return JsonConvert.SerializeObject(props, Formatting.Indented);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
public class DeviceActionWrapper
|
||||
|
||||
@@ -435,7 +435,7 @@ namespace PepperDash.Essentials.Core
|
||||
var min = Convert.ToUInt32(timeout);
|
||||
|
||||
device.StreamDebugging.SetDebuggingWithSpecificTimeout(debugSetting, min);
|
||||
Debug.Console(0, "Device: '{0}' debug level set to {1} for {2} minutes", deviceKey, debugSetting, min);
|
||||
Debug.Console(0, "Device: '{0}' debug level set to {1) for {2} minutes", deviceKey, debugSetting, min);
|
||||
|
||||
}
|
||||
catch (Exception e)
|
||||
|
||||
@@ -59,9 +59,6 @@ namespace PepperDash.Essentials.Core
|
||||
|
||||
VolumeLevelFeedback = new IntFeedback(() => { return _FakeVolumeLevel; });
|
||||
MuteFeedback = new BoolFeedback("MuteOn", () => _IsMuted);
|
||||
|
||||
WarmupTime = 10000;
|
||||
CooldownTime = 5000;
|
||||
}
|
||||
|
||||
public override void PowerOn()
|
||||
|
||||
@@ -4,20 +4,15 @@ using System.Linq;
|
||||
using System.Text;
|
||||
using Crestron.SimplSharp;
|
||||
|
||||
using PepperDash.Core;
|
||||
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace PepperDash.Essentials.Devices.Common.Codec
|
||||
{
|
||||
[Flags]
|
||||
public enum eMeetingEventChangeType
|
||||
{
|
||||
Unknown = 0,
|
||||
MeetingStartWarning = 1,
|
||||
MeetingStart = 2,
|
||||
MeetingEndWarning = 4,
|
||||
MeetingEnd = 8
|
||||
Unkown = 0,
|
||||
MeetingStartWarning,
|
||||
MeetingStart,
|
||||
MeetingEndWarning,
|
||||
MeetingEnd
|
||||
}
|
||||
|
||||
public interface IHasScheduleAwareness
|
||||
@@ -37,10 +32,6 @@ namespace PepperDash.Essentials.Devices.Common.Codec
|
||||
|
||||
private int _meetingWarningMinutes = 5;
|
||||
|
||||
private Meeting _previousChangedMeeting;
|
||||
|
||||
private eMeetingEventChangeType _previousChangeType = eMeetingEventChangeType.Unknown;
|
||||
|
||||
public int MeetingWarningMinutes
|
||||
{
|
||||
get { return _meetingWarningMinutes; }
|
||||
@@ -84,72 +75,38 @@ namespace PepperDash.Essentials.Devices.Common.Codec
|
||||
_scheduleChecker = new CTimer(CheckSchedule, null, pollTime, pollTime);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Helper method to fire MeetingEventChange. Should only fire once for each changeType on each meeting
|
||||
/// </summary>
|
||||
/// <param name="changeType"></param>
|
||||
/// <param name="meeting"></param>
|
||||
private void OnMeetingChange(eMeetingEventChangeType changeType, Meeting meeting)
|
||||
{
|
||||
Debug.Console(2, "*****************OnMeetingChange. id: {0} changeType: {1}**********************", meeting.Id, changeType);
|
||||
if (changeType != (changeType & meeting.NotifiedChangeTypes))
|
||||
var handler = MeetingEventChange;
|
||||
if (handler != null)
|
||||
{
|
||||
// Add this change type to the NotifiedChangeTypes
|
||||
meeting.NotifiedChangeTypes |= changeType;
|
||||
|
||||
var handler = MeetingEventChange;
|
||||
if (handler != null)
|
||||
{
|
||||
handler(this, new MeetingEventArgs() { ChangeType = changeType, Meeting = meeting });
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.Console(2, "Meeting: {0} already notified of changeType: {1}", meeting.Id, changeType);
|
||||
handler(this, new MeetingEventArgs() { ChangeType = changeType, Meeting = meeting });
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Checks the schedule to see if any MeetingEventChange updates should be fired
|
||||
/// </summary>
|
||||
/// <param name="o"></param>
|
||||
private void CheckSchedule(object o)
|
||||
{
|
||||
// Iterate the meeting list and check if any meeting need to do anything
|
||||
// Iterate the meeting list and check if any meeting need to do anythingk
|
||||
|
||||
const double meetingTimeEpsilon = 0.05;
|
||||
const double meetingTimeEpsilon = 0.0001;
|
||||
foreach (var m in Meetings)
|
||||
{
|
||||
var changeType = eMeetingEventChangeType.Unknown;
|
||||
var changeType = eMeetingEventChangeType.Unkown;
|
||||
|
||||
if (eMeetingEventChangeType.MeetingStartWarning != (m.NotifiedChangeTypes & eMeetingEventChangeType.MeetingStartWarning) && m.TimeToMeetingStart.TotalMinutes <= m.MeetingWarningMinutes.TotalMinutes && m.TimeToMeetingStart.Seconds > 0) // Meeting is about to start
|
||||
{
|
||||
Debug.Console(2, "********************* MeetingStartWarning. TotalMinutes: {0} Seconds: {1}", m.TimeToMeetingStart.TotalMinutes, m.TimeToMeetingStart.Seconds);
|
||||
if (m.TimeToMeetingStart.TotalMinutes <= m.MeetingWarningMinutes.TotalMinutes) // Meeting is about to start
|
||||
changeType = eMeetingEventChangeType.MeetingStartWarning;
|
||||
}
|
||||
else if (eMeetingEventChangeType.MeetingStart != (m.NotifiedChangeTypes & eMeetingEventChangeType.MeetingStart) && Math.Abs(m.TimeToMeetingStart.TotalMinutes) < meetingTimeEpsilon) // Meeting Start
|
||||
{
|
||||
Debug.Console(2, "********************* MeetingStart");
|
||||
else if (Math.Abs(m.TimeToMeetingStart.TotalMinutes) < meetingTimeEpsilon) // Meeting Start
|
||||
changeType = eMeetingEventChangeType.MeetingStart;
|
||||
}
|
||||
else if (eMeetingEventChangeType.MeetingEndWarning != (m.NotifiedChangeTypes & eMeetingEventChangeType.MeetingEndWarning) && m.TimeToMeetingEnd.TotalMinutes <= m.MeetingWarningMinutes.TotalMinutes && m.TimeToMeetingEnd.Seconds > 0) // Meeting is about to end
|
||||
{
|
||||
Debug.Console(2, "********************* MeetingEndWarning. TotalMinutes: {0} Seconds: {1}", m.TimeToMeetingEnd.TotalMinutes, m.TimeToMeetingEnd.Seconds);
|
||||
else if (m.TimeToMeetingEnd.TotalMinutes <= m.MeetingWarningMinutes.TotalMinutes) // Meeting is about to end
|
||||
changeType = eMeetingEventChangeType.MeetingEndWarning;
|
||||
}
|
||||
else if (eMeetingEventChangeType.MeetingEnd != (m.NotifiedChangeTypes & eMeetingEventChangeType.MeetingEnd) && Math.Abs(m.TimeToMeetingEnd.TotalMinutes) < meetingTimeEpsilon) // Meeting has ended
|
||||
{
|
||||
Debug.Console(2, "********************* MeetingEnd");
|
||||
else if (Math.Abs(m.TimeToMeetingEnd.TotalMinutes) < meetingTimeEpsilon) // Meeting has ended
|
||||
changeType = eMeetingEventChangeType.MeetingEnd;
|
||||
}
|
||||
|
||||
if (changeType != eMeetingEventChangeType.Unknown)
|
||||
{
|
||||
OnMeetingChange(changeType, m);
|
||||
}
|
||||
if (changeType != eMeetingEventChangeType.Unkown)
|
||||
OnMeetingChange(changeType, m);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -158,24 +115,17 @@ namespace PepperDash.Essentials.Devices.Common.Codec
|
||||
/// </summary>
|
||||
public class Meeting
|
||||
{
|
||||
[JsonProperty("minutesBeforeMeeting")]
|
||||
public int MinutesBeforeMeeting;
|
||||
|
||||
[JsonProperty("id")]
|
||||
public string Id { get; set; }
|
||||
[JsonProperty("organizer")]
|
||||
public string Organizer { get; set; }
|
||||
[JsonProperty("title")]
|
||||
public string Title { get; set; }
|
||||
[JsonProperty("agenda")]
|
||||
public string Agenda { get; set; }
|
||||
|
||||
[JsonProperty("meetingWarningMinutes")]
|
||||
public TimeSpan MeetingWarningMinutes
|
||||
{
|
||||
get { return TimeSpan.FromMinutes(MinutesBeforeMeeting); }
|
||||
}
|
||||
[JsonProperty("timeToMeetingStart")]
|
||||
public TimeSpan TimeToMeetingStart
|
||||
{
|
||||
get
|
||||
@@ -183,7 +133,6 @@ namespace PepperDash.Essentials.Devices.Common.Codec
|
||||
return StartTime - DateTime.Now;
|
||||
}
|
||||
}
|
||||
[JsonProperty("timeToMeetingEnd")]
|
||||
public TimeSpan TimeToMeetingEnd
|
||||
{
|
||||
get
|
||||
@@ -191,11 +140,8 @@ namespace PepperDash.Essentials.Devices.Common.Codec
|
||||
return EndTime - DateTime.Now;
|
||||
}
|
||||
}
|
||||
[JsonProperty("startTime")]
|
||||
public DateTime StartTime { get; set; }
|
||||
[JsonProperty("endTime")]
|
||||
public DateTime EndTime { get; set; }
|
||||
[JsonProperty("duration")]
|
||||
public TimeSpan Duration
|
||||
{
|
||||
get
|
||||
@@ -203,34 +149,21 @@ namespace PepperDash.Essentials.Devices.Common.Codec
|
||||
return EndTime - StartTime;
|
||||
}
|
||||
}
|
||||
[JsonProperty("privacy")]
|
||||
public eMeetingPrivacy Privacy { get; set; }
|
||||
[JsonProperty("joinable")]
|
||||
public bool Joinable
|
||||
{
|
||||
get
|
||||
{
|
||||
var joinable = StartTime.AddMinutes(-MinutesBeforeMeeting) <= DateTime.Now
|
||||
&& DateTime.Now <= EndTime.AddMinutes(-5);
|
||||
//Debug.Console(2, "Meeting Id: {0} joinable: {1}", Id, joinable);
|
||||
return joinable;
|
||||
return StartTime.AddMinutes(-MinutesBeforeMeeting) <= DateTime.Now
|
||||
&& DateTime.Now <= EndTime; //.AddMinutes(-5);
|
||||
}
|
||||
}
|
||||
//public string ConferenceNumberToDial { get; set; }
|
||||
[JsonProperty("conferencePassword")]
|
||||
public string ConferencePassword { get; set; }
|
||||
[JsonProperty("isOneButtonToPushMeeting")]
|
||||
public bool IsOneButtonToPushMeeting { get; set; }
|
||||
|
||||
[JsonProperty("calls")]
|
||||
public List<Call> Calls { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Tracks the change types that have already been notified for
|
||||
/// </summary>
|
||||
[JsonIgnore]
|
||||
public eMeetingEventChangeType NotifiedChangeTypes { get; set; }
|
||||
|
||||
public Meeting()
|
||||
{
|
||||
Calls = new List<Call>();
|
||||
|
||||
@@ -139,20 +139,7 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
|
||||
public override void Dial(Meeting meeting)
|
||||
{
|
||||
Debug.Console(1, this, "Dial Meeting: {0}", meeting.Id);
|
||||
var call = new CodecActiveCallItem() { Name = meeting.Title, Number = meeting.Id, Id = meeting.Id, Status = eCodecCallStatus.Dialing, Direction = eCodecCallDirection.Outgoing, Type = eCodecCallType.Video };
|
||||
ActiveCalls.Add(call);
|
||||
OnCallStatusChange(call);
|
||||
|
||||
//ActiveCallCountFeedback.FireUpdate();
|
||||
// Simulate 2-second ring, then connecting, then connected
|
||||
new CTimer(o =>
|
||||
{
|
||||
call.Type = eCodecCallType.Video;
|
||||
SetNewCallStatusAndFireCallStatusChange(eCodecCallStatus.Connecting, call);
|
||||
new CTimer(oo => SetNewCallStatusAndFireCallStatusChange(eCodecCallStatus.Connected, call), 1000);
|
||||
}, 2000);
|
||||
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -409,15 +396,12 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec
|
||||
if (_CodecSchedule == null || _CodecSchedule.Meetings.Count == 0
|
||||
|| _CodecSchedule.Meetings[_CodecSchedule.Meetings.Count - 1].StartTime < DateTime.Now)
|
||||
{
|
||||
_CodecSchedule = new CodecScheduleAwareness(1000);
|
||||
_CodecSchedule = new CodecScheduleAwareness();
|
||||
for (int i = 0; i < 5; i++)
|
||||
{
|
||||
var m = new Meeting();
|
||||
m.MinutesBeforeMeeting = 5;
|
||||
m.Id = i.ToString();
|
||||
m.Organizer = "Employee " + 1;
|
||||
m.StartTime = DateTime.Now.AddMinutes(6).AddHours(i);
|
||||
m.EndTime = DateTime.Now.AddHours(i).AddMinutes(16);
|
||||
m.StartTime = DateTime.Now.AddMinutes(3).AddHours(i);
|
||||
m.EndTime = DateTime.Now.AddHours(i).AddMinutes(30);
|
||||
m.Title = "Meeting " + i;
|
||||
m.Calls.Add(new Call() { Number = i + "meeting@fake.com"});
|
||||
_CodecSchedule.Meetings.Add(m);
|
||||
|
||||
@@ -667,6 +667,8 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
||||
{
|
||||
DirectoryRoot = new CodecDirectory();
|
||||
|
||||
_currentDirectoryResult = DirectoryRoot;
|
||||
|
||||
DirectoryBrowseHistory = new List<CodecDirectory>();
|
||||
DirectoryBrowseHistoryStack = new Stack<CodecDirectory>();
|
||||
|
||||
@@ -970,10 +972,12 @@ namespace PepperDash.Essentials.Devices.Common.VideoCodec.ZoomRoom
|
||||
SendText("echo off");
|
||||
Thread.Sleep(100);
|
||||
// set feedback exclusions
|
||||
SendText("zFeedback Register Op: ex Path: /Event/InfoResult/info/callin_country_list");
|
||||
SendText("zFeedback Register Op: ex Path: /Event/InfoResult/Info/callin_country_list");
|
||||
Thread.Sleep(100);
|
||||
SendText("zFeedback Register Op: ex Path: /Event/InfoResult/info/callout_country_list");
|
||||
SendText("zFeedback Register Op: ex Path: /Event/InfoResult/Info/callout_country_list");
|
||||
Thread.Sleep(100);
|
||||
SendText("zFeedback Register Op: ex Path: /Event/InfoResult/Info/toll_free_callinLlist");
|
||||
Thread.Sleep(100);
|
||||
|
||||
if (!_props.DisablePhonebookAutoDownload)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user