using GMCabsDriverAssistant.Models;
|
|
using GMCabsDriverAssistant.Services;
|
|
using GMCabsDriverAssistant.Utils;
|
|
using GMCabsDriverAssistant.ViewModels;
|
|
using GMCabsDriverAssistantSolution.Views;
|
|
//using Plugin.BluetoothLE;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Collections.ObjectModel;
|
|
using System.ComponentModel;
|
|
using System.Text;
|
|
using System.Threading;
|
|
//using Xamarin.CommunityToolkit.Extensions;
|
|
using Microsoft.Maui;
|
|
using Microsoft.Maui.Controls;
|
|
using GMCabsDriverAssistantSolution.ViewModels;
|
|
|
|
namespace GMCabsDriverAssistant.UserControl.ViewModels
|
|
{
|
|
public delegate void BluetoothStatusChanged();
|
|
|
|
class TripInformationViewModel : BaseViewModel
|
|
{
|
|
[Browsable(true)]
|
|
[Category("Action")]
|
|
[Description("Invoked when user clicks button")]
|
|
public event BluetoothStatusChanged BluetoothStatusChanged;
|
|
|
|
#region Fields
|
|
private bool hasUnreadNotifications;
|
|
public int seconds = 0;
|
|
public string timerSeconds = "00:00:00";
|
|
public string pickUpAddress = "";
|
|
public string dropUpAddress = "";
|
|
private bool isBookingAvailable;
|
|
private string startTripButtonText;
|
|
private bool visibleTrip;
|
|
private string startSuburb;
|
|
private bool isStartTripButtonVisible;
|
|
private string pickUpDateTimeOrEndSuburb;
|
|
|
|
//private List<IGattCharacteristic> Characteristics;
|
|
private bool foundDevice = false;
|
|
//private IAdapter adapter;
|
|
|
|
public bool MeterTripStarted;
|
|
private int lastMeterTripStatus = -1;
|
|
private string startTimeOrEndLocation;
|
|
private bool isOkButtonVisible = false;
|
|
public int autocloseOkSecond = 30;
|
|
Page _page;
|
|
private int mainStackLayoutMargin;
|
|
private int indicatorMargin;
|
|
private int logoMargin;
|
|
private bool isDummyButtonsVisible;
|
|
private int controlsMargin;
|
|
private int dummyButtonLayoutMargin;
|
|
private bool duressReleased;
|
|
private int duressSeconds;
|
|
private string duressButtonText;
|
|
private string bluetoothConnectionStatusText;
|
|
private string imageIcon;
|
|
private int topLayoutMargin;
|
|
private int rightLayoutMargin;
|
|
private bool isPlotButtonVisible;
|
|
#endregion
|
|
|
|
#region Properties
|
|
public Command OnStartEndTripClick { get; }
|
|
|
|
MeterTrip meterTrip = new MeterTrip();
|
|
public ObservableCollection<BookingDto> Bookings { get; }
|
|
public Command<BookingDto> BookingTapped { get; }
|
|
public double CurrentLat { get; set; }
|
|
public double CurrentLng { get; set; }
|
|
public Location CurrentLocation { get; set; }
|
|
public Command onStartTripClick { get; }
|
|
public Command OnOkButtonClick { get; }
|
|
public string StartTripButtonText
|
|
{
|
|
get => startTripButtonText;
|
|
set => SetProperty(ref startTripButtonText, value);
|
|
}
|
|
public bool HasUnreadNotifications
|
|
{
|
|
get => hasUnreadNotifications;
|
|
set => SetProperty(ref hasUnreadNotifications, value);
|
|
}
|
|
|
|
public string TimerSeconds
|
|
{
|
|
get => timerSeconds;
|
|
set => SetProperty(ref timerSeconds, value);
|
|
}
|
|
public string PickUpAddress
|
|
{
|
|
get => pickUpAddress;
|
|
set
|
|
{
|
|
SetProperty(ref pickUpAddress, value);
|
|
}
|
|
}
|
|
public string DropUpAddress
|
|
{
|
|
get => dropUpAddress;
|
|
set
|
|
{
|
|
SetProperty(ref dropUpAddress, value);
|
|
}
|
|
}
|
|
public bool IsBookingAvailable
|
|
{
|
|
get => isBookingAvailable;
|
|
set => SetProperty(ref isBookingAvailable, value);
|
|
}
|
|
|
|
public bool VisibleTrip
|
|
{
|
|
get => visibleTrip;
|
|
set => SetProperty(ref visibleTrip, value);
|
|
}
|
|
public string StartSuburb
|
|
{
|
|
get => startSuburb;
|
|
set
|
|
{
|
|
SetProperty(ref startSuburb, value);
|
|
}
|
|
}
|
|
public bool IsStartTripButtonVisible
|
|
{
|
|
get => isStartTripButtonVisible;
|
|
set => SetProperty(ref isStartTripButtonVisible, value);
|
|
}
|
|
public string PickUpDateTimeOrEndSuburb
|
|
{
|
|
get => pickUpDateTimeOrEndSuburb;
|
|
set => SetProperty(ref pickUpDateTimeOrEndSuburb, value);
|
|
}
|
|
public Thickness MainStackLayoutMargin
|
|
{
|
|
get { return new Thickness(mainStackLayoutMargin, 0, mainStackLayoutMargin, 20); }
|
|
}
|
|
public Thickness IndicatorMargin
|
|
{
|
|
get { return new Thickness(0, indicatorMargin, 0, 0); }
|
|
}
|
|
public Thickness LogoMargin
|
|
{
|
|
#if DEBUG
|
|
get { return new Thickness(0, logoMargin, 0, 0); }
|
|
#else
|
|
get { return new Thickness(logoMargin, 0 , 0, 0); }
|
|
#endif
|
|
}
|
|
public Thickness ImageLayoutMargin
|
|
{
|
|
#if DEBUG
|
|
get { return new Thickness(0, topLayoutMargin, rightLayoutMargin, 0); }
|
|
#else
|
|
get { return new Thickness(0, topLayoutMargin, rightLayoutMargin, 0); }
|
|
#endif
|
|
}
|
|
public Thickness ControlsMargin
|
|
{
|
|
get { return new Thickness(0, controlsMargin, 0, 0); }
|
|
}
|
|
public Thickness DummyButtonLayoutMargin
|
|
{
|
|
get { return new Thickness(0, dummyButtonLayoutMargin, 0, 0); }
|
|
}
|
|
public bool IsDummyButtonsVisible
|
|
{
|
|
get => isDummyButtonsVisible;
|
|
set
|
|
{
|
|
SetProperty(ref isDummyButtonsVisible, value);
|
|
}
|
|
}
|
|
public Command onCancelTripClick { get; }
|
|
public Command OnMeterStartTripClick { get; }
|
|
public Command OnMeterEndTripClick { get; }
|
|
|
|
|
|
public string StartTimeOrEndLocation
|
|
{
|
|
get => startTimeOrEndLocation;
|
|
set => SetProperty(ref startTimeOrEndLocation, value);
|
|
}
|
|
public bool IsOkButtonVisible
|
|
{
|
|
get => isOkButtonVisible;
|
|
set => SetProperty(ref isOkButtonVisible, value);
|
|
}
|
|
|
|
public string BluetoothConnectionStatusText
|
|
{
|
|
get => bluetoothConnectionStatusText;
|
|
set
|
|
{
|
|
SetProperty(ref bluetoothConnectionStatusText, value);
|
|
BluetoothStatusChanged?.Invoke();
|
|
}
|
|
}
|
|
public string DuressButtonText
|
|
{
|
|
get => duressButtonText;
|
|
set
|
|
{
|
|
SetProperty(ref duressButtonText, value);
|
|
}
|
|
}
|
|
public string ImageIcon
|
|
{
|
|
get => imageIcon;
|
|
set
|
|
{
|
|
SetProperty(ref imageIcon, value);
|
|
}
|
|
}
|
|
public bool IsPlotButtonVisible
|
|
{
|
|
get => isPlotButtonVisible;
|
|
set => SetProperty(ref isPlotButtonVisible, value);
|
|
}
|
|
#endregion
|
|
|
|
#region Constructor
|
|
public TripInformationViewModel()
|
|
{
|
|
ContinuouslyShowAllPropertiesStatus();
|
|
ShowStartTimerDuration(DispatchAppComponentService.isTripStarted);
|
|
CountEndTripDuration(DispatchAppComponentService.isTripEndeded);
|
|
lastMeterTripStatus = Preferences.Get("MeterTripStatus", 0);
|
|
OnOkButtonClick = new Command(OnOkClick);
|
|
OnStartEndTripClick = new Command(OnStartEndTripButtonClick);
|
|
OnMeterStartTripClick = new Command(CallMeterStartTrip);
|
|
OnMeterEndTripClick = new Command(MeterEndTrip);
|
|
DuressButtonText = "!";
|
|
|
|
CheckForConnectedMeter();
|
|
|
|
#if DEBUG
|
|
mainStackLayoutMargin = 30;
|
|
indicatorMargin = 5;
|
|
logoMargin = 20;
|
|
IsDummyButtonsVisible = true;
|
|
controlsMargin = 20;
|
|
dummyButtonLayoutMargin = 10;
|
|
topLayoutMargin = -5;
|
|
rightLayoutMargin = -15;
|
|
#else
|
|
mainStackLayoutMargin = 30;
|
|
indicatorMargin = 5;
|
|
logoMargin = 20;
|
|
IsDummyButtonsVisible = true;
|
|
controlsMargin = 20;
|
|
dummyButtonLayoutMargin = 10;
|
|
topLayoutMargin = -5;
|
|
rightLayoutMargin = -15;
|
|
#endif
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Methods
|
|
private void OnStartEndTripButtonClick(object obj)
|
|
{
|
|
ManageDriverTrip(false);
|
|
}
|
|
private void OnOkClick()
|
|
{
|
|
DispatchAppComponentService.OnOkClick();
|
|
DispatchAppComponentService.isPlotButtonVisible = true;
|
|
ShowAllPropertiesStatus();
|
|
}
|
|
private void MeterStartTrip()
|
|
{
|
|
// setting MeterTripStarted only here to ensure a manual trip does not get mistaken for a meter trip
|
|
if (!MeterTripStarted)
|
|
{
|
|
StartTripButtonText = DispatchAppComponentService.MeterStartTrip();
|
|
ManageDriverTrip(true);
|
|
}
|
|
}
|
|
private void MeterEndTrip()
|
|
{
|
|
if (MeterTripStarted)
|
|
{
|
|
StartTripButtonText = DispatchAppComponentService.MeterEndTrip();
|
|
ManageDriverTrip(true);
|
|
}
|
|
}
|
|
public void StartDriverDuress()
|
|
{
|
|
duressReleased = false;
|
|
duressSeconds = 0;
|
|
bool hasVibrated = false;
|
|
Device.StartTimer(TimeSpan.FromSeconds(1), () =>
|
|
{
|
|
duressSeconds++;
|
|
if (duressSeconds > 2)
|
|
{
|
|
if (!hasVibrated)
|
|
{
|
|
hasVibrated = true;
|
|
Vibration.Vibrate(TimeSpan.FromSeconds(1));
|
|
}
|
|
}
|
|
|
|
if (duressReleased)
|
|
{
|
|
return false;
|
|
}
|
|
else
|
|
{
|
|
return true;
|
|
}
|
|
});
|
|
}
|
|
public async void EndDriverDuress()
|
|
{
|
|
duressReleased = true;
|
|
Vibration.Cancel();
|
|
if (duressSeconds > 2)
|
|
{
|
|
var token = Preferences.Get(SecureStorageData.Token,"");
|
|
GMCabsDriverService gmCabsDriverService = new GMCabsDriverService();
|
|
|
|
var currentLocation = Geolocation.GetLastKnownLocationAsync();
|
|
|
|
double currentLat = 0;
|
|
double currentLng = 0;
|
|
if (currentLocation != null && currentLocation.Result != null)
|
|
{
|
|
currentLat = currentLocation.Result.Latitude;
|
|
currentLng = currentLocation.Result.Longitude;
|
|
}
|
|
|
|
await gmCabsDriverService.DriverDistress(token, currentLat, currentLng);
|
|
|
|
DuressButtonText = "...";
|
|
await System.Threading.Tasks.Task.Delay(2000);
|
|
DuressButtonText = "!";
|
|
}
|
|
}
|
|
private void ShowStartTimerDuration(bool isTripStarted)
|
|
{
|
|
seconds = DispatchAppComponentService.seconds;
|
|
if (isTripStarted)
|
|
{
|
|
Device.StartTimer(TimeSpan.FromSeconds(1), () =>
|
|
{
|
|
var meterRunningStatus = Preferences.Get("MeterRunningStatus", "");
|
|
if (meterRunningStatus == "Running")
|
|
{
|
|
Device.BeginInvokeOnMainThread(() =>
|
|
{
|
|
++seconds;
|
|
DispatchAppComponentService.StartTrip(seconds);
|
|
TimerSeconds = DispatchAppComponentService.timerSeconds;
|
|
DispatchAppComponentService.seconds = seconds;
|
|
});
|
|
}
|
|
if (meterRunningStatus == "Running")
|
|
return true;
|
|
else
|
|
return false;
|
|
});
|
|
|
|
}
|
|
}
|
|
private void CountEndTripDuration(bool isTripEnded)
|
|
{
|
|
autocloseOkSecond = DispatchAppComponentService.autocloseOkSecond;
|
|
if (isTripEnded)
|
|
{
|
|
Device.StartTimer(TimeSpan.FromSeconds(1), () =>
|
|
{
|
|
var meterRunningStatus = Preferences.Get("MeterRunningStatus", "");
|
|
if (meterRunningStatus == "Stopped")
|
|
{
|
|
if (autocloseOkSecond == 0)
|
|
{
|
|
Device.BeginInvokeOnMainThread(() =>
|
|
{
|
|
OnOkClick();
|
|
});
|
|
}
|
|
else
|
|
{
|
|
--autocloseOkSecond;
|
|
DispatchAppComponentService.autocloseOkSecond = autocloseOkSecond;
|
|
}
|
|
}
|
|
if (meterRunningStatus == "Stopped")
|
|
return true;
|
|
else
|
|
return false;
|
|
});
|
|
}
|
|
}
|
|
private void ShowAllPropertiesStatus()
|
|
{
|
|
ImageIcon = DispatchAppComponentService.imageIcon;
|
|
IsStartTripButtonVisible = DispatchAppComponentService.isStartTripButtonVisible;
|
|
IsPlotButtonVisible = DispatchAppComponentService.isPlotButtonVisible;
|
|
StartTripButtonText = DispatchAppComponentService.startTripButtonText;
|
|
MeterTripStarted = DispatchAppComponentService.meterTripStarted;
|
|
VisibleTrip = DispatchAppComponentService.visibleTrip;
|
|
StartSuburb = DispatchAppComponentService.startSuburb;
|
|
PickUpDateTimeOrEndSuburb = DispatchAppComponentService.pickUpDateTimeOrEndSuburb;
|
|
StartTimeOrEndLocation = DispatchAppComponentService.startTimeOrEndLocation;
|
|
IsOkButtonVisible = DispatchAppComponentService.isOkButtonVisible;
|
|
TimerSeconds = DispatchAppComponentService.timerSeconds;
|
|
}
|
|
private void ContinuouslyShowAllPropertiesStatus()
|
|
{
|
|
|
|
Device.StartTimer(TimeSpan.FromSeconds(1), () =>
|
|
{
|
|
Device.BeginInvokeOnMainThread(() =>
|
|
{
|
|
ShowAllPropertiesStatus();
|
|
});
|
|
return true;
|
|
});
|
|
}
|
|
public void SetTripStartEndButtonPosition()
|
|
{
|
|
DispatchAppComponentService.isPlotButtonVisible= false;
|
|
ShowAllPropertiesStatus();
|
|
}
|
|
#endregion
|
|
|
|
#region Trip Handling
|
|
private void ManageDriverTrip(bool fromMeter)
|
|
{
|
|
if (StartTripButtonText.Equals("START TRIP"))
|
|
{
|
|
DispatchAppComponentService.isTripStarted = true;
|
|
DispatchAppComponentService.isTripEndeded = false;
|
|
DispatchAppComponentService.ManageDriverTrip(fromMeter);
|
|
StartTimeOrEndLocation = DispatchAppComponentService.startTimeOrEndLocation;
|
|
StartTrip(fromMeter);
|
|
TimerSeconds = DispatchAppComponentService.timerSeconds;
|
|
DispatchAppComponentService.seconds = seconds = 0;
|
|
ShowStartTimerDuration(DispatchAppComponentService.isTripStarted);
|
|
DispatchAppComponentService.isPlotButtonVisible = false;
|
|
}
|
|
else if (StartTripButtonText.Equals("DROP OFF"))
|
|
{
|
|
DispatchAppComponentService.isTripStarted = false;
|
|
DispatchAppComponentService.isTripEndeded = true;
|
|
DispatchAppComponentService.ManageDriverTrip(fromMeter);
|
|
StartTimeOrEndLocation = DispatchAppComponentService.startTimeOrEndLocation;
|
|
EndTrip(fromMeter);
|
|
IsOkButtonVisible = DispatchAppComponentService.isOkButtonVisible;
|
|
DispatchAppComponentService.autocloseOkSecond = autocloseOkSecond = 30;
|
|
CountEndTripDuration(DispatchAppComponentService.isTripEndeded);
|
|
}
|
|
}
|
|
private async void StartTrip(bool fromMeter)
|
|
{
|
|
DispatchAppComponentService.startSuburb = await DispatchAppComponentService.GetSuburbName(fromMeter, true);
|
|
MeterTripStarted = DispatchAppComponentService.meterTripStarted;
|
|
ImageIcon = DispatchAppComponentService.imageIcon;
|
|
VisibleTrip = DispatchAppComponentService.visibleTrip;
|
|
StartSuburb = DispatchAppComponentService.startSuburb;
|
|
PickUpDateTimeOrEndSuburb = DispatchAppComponentService.pickUpDateTimeOrEndSuburb;
|
|
StartTripButtonText = DispatchAppComponentService.startTripButtonText;
|
|
}
|
|
private async void EndTrip(bool fromMeter)
|
|
{
|
|
DispatchAppComponentService.pickUpDateTimeOrEndSuburb = await DispatchAppComponentService.GetSuburbName(fromMeter, false);
|
|
MeterTripStarted = DispatchAppComponentService.meterTripStarted;
|
|
PickUpDateTimeOrEndSuburb = DispatchAppComponentService.pickUpDateTimeOrEndSuburb;
|
|
ImageIcon = DispatchAppComponentService.imageIcon;
|
|
IsStartTripButtonVisible = DispatchAppComponentService.isStartTripButtonVisible;
|
|
}
|
|
private void CallMeterStartTrip()
|
|
{
|
|
DispatchAppComponentService.startTripButtonText = "START TRIP";
|
|
DispatchAppComponentService.meterTripStarted = false;
|
|
DispatchAppComponentService.isTripStarted = true;
|
|
DispatchAppComponentService.isTripEndeded = false;
|
|
DispatchAppComponentService.isOkButtonVisible = false;
|
|
DispatchAppComponentService.isStartTripButtonVisible = true;
|
|
DispatchAppComponentService.ManageDriverTrip(false);
|
|
StartTimeOrEndLocation = DispatchAppComponentService.startTimeOrEndLocation;
|
|
StartTrip(false);
|
|
TimerSeconds = DispatchAppComponentService.timerSeconds;
|
|
DispatchAppComponentService.seconds = seconds = 0;
|
|
ShowStartTimerDuration(DispatchAppComponentService.isTripStarted);
|
|
}
|
|
#endregion Trip Handling
|
|
|
|
#region Meter Handling
|
|
|
|
private void CheckForConnectedMeter()
|
|
{
|
|
// ConnectToMeter();
|
|
}
|
|
//private void ConnectToMeter()
|
|
//{
|
|
// adapter = CrossBleAdapter.Current;
|
|
// var status = adapter.Status.ToString();
|
|
|
|
// if (status.Contains("Off"))
|
|
// {
|
|
// bluetoothConnectionStatusText = "Bluetooth connection off...";
|
|
// }
|
|
// else
|
|
// {
|
|
// BluetoothConnectionStatusText = "Checking meter connection...";
|
|
// BluetoothConnectionStatusText = $"Adapter status {CrossBleAdapter.Current.Status.ToString()}";
|
|
|
|
// IDevice bondedDevice = null;
|
|
|
|
|
|
|
|
// CrossBleAdapter.Current.GetConnectedDevices().Subscribe(deviceResult =>
|
|
// {
|
|
// bondedDevice = deviceResult.GetEnumerator().Current;
|
|
// });
|
|
// if (bondedDevice != null && bondedDevice.Status == ConnectionStatus.Connected)
|
|
// {
|
|
// ListenForCharacteristic(bondedDevice);
|
|
// }
|
|
// else
|
|
// {
|
|
// CrossBleAdapter.Current.GetPairedDevices().Subscribe(devices =>
|
|
// {
|
|
// if (devices != null)
|
|
// {
|
|
// ConnectionConfig conConfig = new ConnectionConfig();
|
|
// conConfig.AutoConnect = true;
|
|
|
|
// BluetoothConnectionStatusText = $"Listening for paired device";
|
|
|
|
// foreach (var pairedDevice in devices)
|
|
// {
|
|
// pairedDevice.ConnectWait(conConfig).Subscribe(device =>
|
|
// {
|
|
// Xamarin.Forms.Device.BeginInvokeOnMainThread(() => { BluetoothConnectionStatusText = $"{device.Status}"; });
|
|
// ListenForCharacteristic(pairedDevice);
|
|
// });
|
|
// }
|
|
// }
|
|
// });
|
|
|
|
// if (CrossBleAdapter.Current.IsScanning)
|
|
// {
|
|
// BluetoothConnectionStatusText = $"resuming scan";
|
|
// }
|
|
// else
|
|
// {
|
|
// BluetoothConnectionStatusText = $"Adapter status {CrossBleAdapter.Current.Status.ToString()} - Scanning";
|
|
// Characteristics = new List<IGattCharacteristic>();
|
|
// var scanResult = CrossBleAdapter.Current.Scan().Subscribe(scResult => { CheckDevice(scResult); }, exception =>
|
|
// {
|
|
// Xamarin.Forms.Device.BeginInvokeOnMainThread(() => { BluetoothConnectionStatusText = $"Error: {exception.Message}"; });
|
|
// });
|
|
// }
|
|
// }
|
|
// }
|
|
//}
|
|
//private void CheckDevice(IScanResult scanResult)
|
|
//{
|
|
// if (scanResult.Device.Name != null && scanResult.Device.Name.StartsWith("MTI_") && !foundDevice)
|
|
// {
|
|
// BluetoothConnectionStatusText = $"Meter found - {scanResult.Device.Name}";
|
|
// foundDevice = true;
|
|
|
|
// CrossBleAdapter.Current.StopScan();
|
|
// ConnectToDevice(scanResult.Device);
|
|
// }
|
|
//}
|
|
//private void ConnectToDevice(IDevice discoveredDevice)
|
|
//{
|
|
// ConnectionConfig conConfig = new ConnectionConfig();
|
|
// conConfig.AutoConnect = true;
|
|
|
|
// Xamarin.Forms.Device.BeginInvokeOnMainThread(() => { BluetoothConnectionStatusText = $"Device Details - P:{discoveredDevice.PairingStatus.ToString()} - C:{discoveredDevice.IsConnected()}"; });
|
|
|
|
// if (discoveredDevice.IsConnected())
|
|
// {
|
|
// Xamarin.Forms.Device.BeginInvokeOnMainThread(() => { BluetoothConnectionStatusText = $"Searching for GUIDs"; });
|
|
// ListenForCharacteristic(discoveredDevice);
|
|
// }
|
|
// else
|
|
// {
|
|
// if (discoveredDevice.PairingStatus == PairingStatus.NotPaired)
|
|
// {
|
|
// Xamarin.Forms.Device.BeginInvokeOnMainThread(() => { BluetoothConnectionStatusText = $"Pairing"; });
|
|
// discoveredDevice.PairingRequest("191135");
|
|
// }
|
|
// Xamarin.Forms.Device.BeginInvokeOnMainThread(() => { BluetoothConnectionStatusText = $"Connecting"; });
|
|
// discoveredDevice.ConnectWait(conConfig).Subscribe(device =>
|
|
// {
|
|
// Xamarin.Forms.Device.BeginInvokeOnMainThread(() => { BluetoothConnectionStatusText = $"{device.Status}"; });
|
|
// ListenForCharacteristic(device);
|
|
// });
|
|
// }
|
|
//}
|
|
//private void ListenForCharacteristic(IDevice device)
|
|
//{
|
|
// bool subscribed = false;
|
|
// try
|
|
// {
|
|
// device.GetKnownCharacteristics(Guid.Parse("de201840-063f-11e5-be3e-0002a5d5c51b"), new Guid[] { Guid.Parse("de000180-063f-11e5-9e69-0002a5d5c503") }).Subscribe(characteristics =>
|
|
// {
|
|
// Xamarin.Forms.Device.BeginInvokeOnMainThread(() => { BluetoothConnectionStatusText = $"Service Detected"; });
|
|
// if (characteristics != null)
|
|
// {
|
|
// characteristics.RegisterAndNotify().Subscribe(registerResult =>
|
|
// {
|
|
// // RegisterAndNotify seems to keep firing each time, there must be a better way
|
|
// // to do this only once, currently just setting a local flag.
|
|
// if (!subscribed)
|
|
// {
|
|
// Xamarin.Forms.Device.BeginInvokeOnMainThread(() =>
|
|
// {
|
|
// BluetoothConnectionStatusText = "Ready";
|
|
// });
|
|
// subscribed = true;
|
|
// characteristics.WhenNotificationReceived().Subscribe(notification => { CheckNotification(notification); });
|
|
// }
|
|
// });
|
|
// }
|
|
// });
|
|
// }
|
|
// catch(Exception ex)
|
|
// {
|
|
|
|
// }
|
|
//}
|
|
//private void CheckNotification(CharacteristicGattResult notification)
|
|
//{
|
|
// if (notification != null && notification.Data != null && notification.Characteristic != null && notification.Characteristic.Uuid.ToString() == "de000180-063f-11e5-9e69-0002a5d5c503")
|
|
// {
|
|
// string data = $"Date:{DateTime.Now.ToString("HH:mm:ss")}, Description:{notification.Characteristic.Uuid},Data:{BitConverter.ToString(notification.Data)}\n";
|
|
// Xamarin.Forms.Device.BeginInvokeOnMainThread(() =>
|
|
// {
|
|
// int tripStatus = 0;
|
|
// if (notification.Data[0] != 0) { tripStatus = 1; }
|
|
// if (lastMeterTripStatus != tripStatus)
|
|
// {
|
|
// lastMeterTripStatus = tripStatus;
|
|
// Preferences.Set("MeterTripStatus", tripStatus);
|
|
// if (tripStatus == 0)
|
|
// {
|
|
// MeterEndTrip();
|
|
// }
|
|
// else if (tripStatus == 1)
|
|
// {
|
|
// //MeterStartTrip();
|
|
// CallMeterStartTrip();
|
|
// }
|
|
// }
|
|
// });
|
|
|
|
// }
|
|
//}
|
|
|
|
#endregion Meter Handling
|
|
}
|
|
}
|