A UWP dashboard which provides live updates for the 'Personal Flash in Real-Time (Andy)' and 'Personal Flash in Real-Time (Tony)' artworks -- part of the 'Return to Ritherdon' project by Nicola Ellis. Documentation can be found at
https://git.abbether.net/return-to-ritherdon/rtr-docs/src/branch/master/eyes-and-ears
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
5.9 KiB
150 lines
5.9 KiB
using EyesAndEars.UWP.Models; |
|
using System; |
|
using System.Diagnostics; |
|
using System.Text.Json; |
|
using System.Threading.Tasks; |
|
using Windows.Storage; |
|
using Windows.UI; |
|
using Windows.UI.Xaml.Media; |
|
|
|
namespace EyesAndEars.UWP.Services { |
|
public static class DataServices { |
|
|
|
public static async Task<Device> UpdateDevice(string url, int deviceId) { |
|
try { |
|
var id = MapFactoryDeviceToGalleyDevice(deviceId); // Has note. |
|
var readingAPI = $"{url}/api/readings/latest/{id}"; |
|
var statusAPI = $"{url}/api/status/latest/{deviceId}"; |
|
var readingJSON = await WebServices.GetJSON(readingAPI); |
|
var statusJSON = await WebServices.GetJSON(statusAPI); |
|
var r = MapToLightReading(readingJSON); |
|
var s = MapToDeviceStatus(statusJSON); |
|
var c = UpdateStatusColour(s.status); |
|
return new Device(deviceId, r, s, c); |
|
} |
|
catch (Exception e) { |
|
Debug.WriteLine(e.Message); |
|
return CreateFallBackDevice(deviceId); |
|
} |
|
} |
|
|
|
static SolidColorBrush UpdateStatusColour(string status) { |
|
try { |
|
return status.Equals("on", StringComparison.OrdinalIgnoreCase) ? |
|
new SolidColorBrush(Colors.SeaGreen) : |
|
new SolidColorBrush(Colors.DarkRed); |
|
} |
|
catch (Exception e) { |
|
Debug.WriteLine(e.Message); |
|
return new SolidColorBrush(Colors.DarkOrange); |
|
} |
|
} |
|
|
|
/* Note: The Purpose of Mapping a Factory to a Gallery Device. |
|
* ================================================================ |
|
* Every device in the project is paired up with another. |
|
* Factory1 => Gallery1 | Device1 => Device4 |
|
* Factory1 => Gallery2 | Device2 => Device5 |
|
* Factory1 => Gallery3 | Device3 => Device6 |
|
* At the moment, when a device completes a status update, each one |
|
* is ran throught the "UpdateDevice" function (above). This means |
|
* the latest light reading for a light meter (factory) must be |
|
* retrieved when a galley-based device's status is updated. |
|
* From a strict point-of-view, the gallery device does not need it |
|
* so I should/could seperate out this functionality into seperate |
|
* functions. For now though, a light reading is still needed to be |
|
* retrieved because of the way the functions are called. |
|
* This function just maps/pairs the (factory) light reading to the |
|
* appropriate gallery device. By doing this, the gallery device |
|
* has extra information on its paired up light meter. One way I |
|
* have used that information is to show a small piece of text in |
|
* the gallery status box to quickly check the accuracy of the |
|
* synchronisation between the factory and gallery devices. |
|
*/ |
|
static int MapFactoryDeviceToGalleyDevice(int deviceId) { |
|
int id = 0; |
|
if (deviceId > 3) { |
|
switch (deviceId) { |
|
case 4: |
|
id = 1; |
|
break; |
|
case 5: |
|
id = 2; |
|
break; |
|
case 6: |
|
id = 3; |
|
break; |
|
default: |
|
break; |
|
} |
|
} |
|
else { |
|
id = deviceId; |
|
} |
|
return id; |
|
} |
|
|
|
static LightReading MapToLightReading(string json) { |
|
try { |
|
var reading = JsonSerializer.Deserialize<LightReading>(json); |
|
return reading; |
|
} |
|
catch (Exception e) { |
|
Debug.WriteLine(e.Message); |
|
return CreateDefaultLightReading(); |
|
} |
|
} |
|
|
|
static DeviceStatus MapToDeviceStatus(string json) { |
|
try { |
|
var status = JsonSerializer.Deserialize<DeviceStatus>(json); |
|
return status; |
|
} |
|
catch (Exception e) { |
|
Debug.WriteLine(e.Message); |
|
return CreateDefaultDeviceStatus(); |
|
} |
|
} |
|
|
|
public static Device CreateFallBackDevice(int deviceId) { |
|
// "999" and "err" are acting as sentinals in this context. |
|
var r = new LightReading { id = 0, reading = 999, time = DateTime.Now }; |
|
var s = new DeviceStatus { id = 0, status = "err", time = DateTime.Now }; |
|
var c = new SolidColorBrush(Colors.DarkOrange); |
|
var d = new Device(deviceId, r, s, c); |
|
return d; |
|
} |
|
|
|
static LightReading CreateDefaultLightReading() => |
|
new LightReading { id = 0, reading = 999, time = DateTime.Now }; |
|
|
|
static DeviceStatus CreateDefaultDeviceStatus() => |
|
new DeviceStatus { id = 0, status = "err", time = DateTime.Now }; |
|
|
|
public static async Task SaveBaseURLAsync(string contents) { |
|
try { |
|
var storageFolder = ApplicationData.Current.LocalFolder; |
|
var baseURLFile = await storageFolder.CreateFileAsync("baseURL.txt", |
|
CreationCollisionOption.ReplaceExisting); |
|
await FileIO.WriteTextAsync(baseURLFile, contents); |
|
} |
|
catch (Exception e) { |
|
Debug.WriteLine(e.Message); |
|
} |
|
} |
|
|
|
public static async Task<string> GetBaseURLAsync() { |
|
try { |
|
var storageFolder = ApplicationData.Current.LocalFolder; |
|
var baseURLFile = await storageFolder.GetFileAsync("baseURL.txt"); |
|
var text = await FileIO.ReadTextAsync(baseURLFile); |
|
return text; |
|
} |
|
catch (Exception e) { |
|
Debug.WriteLine(e.Message); |
|
return ""; |
|
} |
|
|
|
} |
|
} |
|
}
|
|
|