Esempio n. 1
0
		public async Task<byte[]> GetWriteStepTableDataCommand(StepsTableParameters stepsParamWrite)
		{
			await Task.Run(() =>
			{
				if (this.trioDevInfo.ModelNumber == 961 && this.trioDevInfo.FirmwareVersion >= 5.0f)
					this._rawData = new byte[COMMAND_SIZE_WRITE + 2];
				else
					this._rawData = new byte[COMMAND_SIZE_WRITE_OLD + 2];

				this.yrDataRaw = BitConverter.GetBytes(stepsParamWrite.dbYear);
				this.monthDataRaw = BitConverter.GetBytes(stepsParamWrite.dbMonth);
				this.dayDataRaw = BitConverter.GetBytes(stepsParamWrite.dbDay);
				this.sentHourFlagRaw = BitConverter.GetBytes(stepsParamWrite.sentHourFlag);


				Buffer.BlockCopy(this.yrDataRaw, INDEX_ZERO, this._rawData, YEAR_DATA_BYTE_WRITE_LOC, 1);
				Buffer.BlockCopy(this.monthDataRaw, INDEX_ZERO, this._rawData, MONTH_DATA_BYTE_WRITE_LOC, 1);
				Buffer.BlockCopy(this.dayDataRaw, INDEX_ZERO, this._rawData, DAY_DATA_BYTE_WRITE_LOC, 1);
				Buffer.BlockCopy(this.sentHourFlagRaw, INDEX_ZERO, this._rawData, SENTHOUR_BYTE_WRITE_LOC, 3);

				if (this.trioDevInfo.ModelNumber == 961 && this.trioDevInfo.FirmwareVersion >= 5.0f)
				{
					this.fraudTableRaw = BitConverter.GetBytes(stepsParamWrite.fraudTable);
					Buffer.BlockCopy(this.fraudTableRaw, INDEX_ZERO, this._rawData, FRAUD_BYTE_WRITE_LOC, 1);
				}


				byte[] commandPrefix = BitConverter.GetBytes(COMMAND_PREFIX);
				byte[] commandID = BitConverter.GetBytes(COMMAND_ID_WRITE);
				Buffer.BlockCopy(commandID, INDEX_ZERO, this._rawData, INDEX_ZERO + 1, 1);
				Buffer.BlockCopy(commandPrefix, INDEX_ZERO, this._rawData, INDEX_ZERO, 1);

			});

			return this._rawData;
		}
		public async void ProcessCommands()
		{
			Debug.WriteLine("SyncHandler: ProcessCommands");

			if (this.ProcessQeueue.Count > 0)
			{
				Command = this.ProcessQeueue.Dequeue();

			}
			else {
				Debug.WriteLine("No more commands to be processed! Disconnecting device.");
				this.Adapter.DisconnectDevice(this.Device);
				return;
			}

			ICharacteristic chr = null;

			switch (Command)
			{
				case Constants.SyncHandlerSequence.EnableFF07:
					Debug.WriteLine("SyncDeviceHandler961: Enabling FF07 characteristic");
					Ff07Char = GetServicesCharacteristic(Constants.CharacteristicsUUID._FF07);
					if (Ff07Char == null)
					{
						Debug.WriteLine("FF07 is NULL. Disconnecting device.");
						this.Adapter.DisconnectDevice(Device);
					}
					else {
						Ff07Char.StartUpdates();
					}
					break;
				case Constants.SyncHandlerSequence.EnableFF08:
					Debug.WriteLine("SyncDeviceHandler961: Enabling FF08 characteristic");
					Ff08Char = GetServicesCharacteristic(Constants.CharacteristicsUUID._FF08);
					if (Ff08Char == null)
					{
						Debug.WriteLine("FF08 is NULL. Disconnecting device.");
						this.Adapter.DisconnectDevice(Device);
					}
					else {
						Ff08Char.StartUpdates();
					}
					break;
				case Constants.SyncHandlerSequence.ReadModel:
					Debug.WriteLine("SyncDeviceHandler961: Reading model from characteristic.");
					ReadChar = GetServicesCharacteristic(Constants.CharacteristicsUUID._2A24);
					chr = await ReadChar.ReadAsync();
					int num = 0;
					int.TryParse(System.Text.Encoding.UTF8.GetString(chr.Value, 0, chr.Value.Length).Replace("PE", "").Replace("FT", ""), out num);
					Debug.WriteLine("Model: " + num);
					this.TrioDeviceInformationInstance.ModelNumber = num;
					string[] deviceNameComponents = this.Device.Name.Split(new Char[] {'-'});
					if ( deviceNameComponents.Count() == 3)
						this.TrioDeviceInformationInstance.BroadcastType = deviceNameComponents[1];
					else
						this.TrioDeviceInformationInstance.BroadcastType = "";

					ProcessCommands();
					break;
				case Constants.SyncHandlerSequence.ReadSerial:
					Debug.WriteLine("SyncDeviceHandler961: Reading serial from characterisitic.");
					ReadChar = GetServicesCharacteristic(Constants.CharacteristicsUUID._2A25);
					chr = await ReadChar.ReadAsync();
					long serial = 0;
					long.TryParse(System.Text.Encoding.UTF8.GetString(chr.Value, 0, chr.Value.Length), out serial);
					Debug.WriteLine("Serial: " + serial);
					this.TrioDeviceInformationInstance.SerialNumber = serial;
					ProcessCommands();
					break;
				case Constants.SyncHandlerSequence.ReadFwVersion:
					Debug.WriteLine("SyncDeviceHandler961: Reading fw version from characteristic.");
					ReadChar = GetServicesCharacteristic(Constants.CharacteristicsUUID._2A26);
					chr = await ReadChar.ReadAsync();
					float fwVer = 0;
					float.TryParse(System.Text.Encoding.UTF8.GetString(chr.Value, 0, chr.Value.Length), out fwVer);
					Debug.WriteLine("Firmware Version: " + fwVer);
					this.TrioDeviceInformationInstance.FirmwareVersion = fwVer;
					ProcessCommands();
					break;
				case Constants.SyncHandlerSequence.ReadManufacturer:
					Debug.WriteLine("SyncDeviceHandler961: Reading manufacturer from characteristic.");
					ReadChar = GetServicesCharacteristic(Constants.CharacteristicsUUID._2A29);
					chr = await ReadChar.ReadAsync();
					Debug.WriteLine("Manufacturer: " + System.Text.Encoding.UTF8.GetString(chr.Value, 0, chr.Value.Length));
					this.Adapter.CommandResponse += ReceiveResponse;
					//this.isGettingDeviceInformation = false;
					//if (this.ScanType == Constants.ScanType.SYNCING)
					//	this.isGettingDeviceInformation = true;
					ProcessCommands();
					break;
				case Constants.SyncHandlerSequence.ReadBatteryLevel:
					Debug.WriteLine("SyncDeviceHandler961: Reading battery level from characteristic.");
					ReadChar = GetServicesCharacteristic(Constants.CharacteristicsUUID._2A19);
					chr = await ReadChar.ReadAsync();
					int battery = (int) chr.Value[0];
					Debug.WriteLine("Battery Level: " + battery);
					this.TrioDeviceInformationInstance.BatteryLevel = battery;
					ProcessCommands();
					break;
				case Constants.SyncHandlerSequence.ReadTallies:
					Debug.WriteLine("SyncDeviceHandler961: Read Device Tallies");
					CommandRequest = new byte[] { 0x1B, 0x5D };
					this.Adapter.SendCommand(Ff07Char, CommandRequest);
					break;
				case Constants.SyncHandlerSequence.ReadDeviceInformation:
					Debug.WriteLine("SyncDeviceHandler961: Read Device Information");
					CommandRequest = new byte[] { 0x1B, 0x40 };
					this.Adapter.SendCommand(Ff07Char, CommandRequest);
					break;
				case Constants.SyncHandlerSequence.ReadDeviceStatus:
					Debug.WriteLine("SyncDeviceHandler961: Read Device Status");
					CommandRequest = await DeviceStatusInstance.GetReadCommand();
					this.Adapter.SendCommand(Ff07Char, CommandRequest);
					break;
				case Constants.SyncHandlerSequence.ReadDeviceSettings:
					Debug.WriteLine("SyncDeviceHandler961: Read Device Settings");
					CommandRequest = await DeviceSettingsInstance.GetReadCommand();
					this.Adapter.SendCommand(Ff07Char, CommandRequest);
					break;
				case Constants.SyncHandlerSequence.ReadSeizureSettings:
					Debug.WriteLine("SyncDeviceHandler961: Read Seizure Settings");
					CommandRequest = await SeizureSettingsInstance.GetReadCommand();
					this.Adapter.SendCommand(Ff07Char, CommandRequest);
					break;	
				case Constants.SyncHandlerSequence.ReadUserSettings:
					Debug.WriteLine("SyncDeviceHandler961: Read User Settings");
					CommandRequest = await UserSettingsInstance.GetReadCommand();
					Debug.WriteLine("Read User Settings: " + Motion.Mobile.Utilities.Utils.ByteArrayToHexString(CommandRequest));
					this.Adapter.SendCommand(Ff07Char, CommandRequest);
					break;
				case Constants.SyncHandlerSequence.ReadStepsHeader:
					Debug.WriteLine("SyncDeviceHandler961: Read Steps Header");
					CommandRequest = await StepsTableDataInstance.GetReadStepTableDataCommand();
					this.Adapter.SendCommand(Ff07Char, CommandRequest);
					break;
				case Constants.SyncHandlerSequence.ReadSeizureBlocks:
					Debug.WriteLine("SyncDeviceHandler961: Read Seizure Table");
					CommandRequest = await SeizureBlocksDataInstance.GetReadSeizureBlocksDataCommand();
					this.Adapter.SendCommand(Ff07Char, CommandRequest);
					break;
				case Constants.SyncHandlerSequence.ReadHourlySteps:
					Debug.WriteLine("SyncDeviceHandler961: Read Hourly Steps");
					DateTime dt = this.currentDateForStepTable;
					CommandRequest = await StepsDataInstance.getReadHourRangeCommand(dt, this.currentStartTimeForStepTable, currentEndTimeForStepTable);
					this.Adapter.SendCommand(Ff07Char, CommandRequest);
					Debug.WriteLine("Read Hour Range Settings: " + Motion.Mobile.Utilities.Utils.ByteArrayToHexString(CommandRequest));
					break;
				case Constants.SyncHandlerSequence.ReadCurrentHour:
					Debug.WriteLine("SyncDeviceHandler961: Read Current Hour");
					CommandRequest = await StepsDataInstance.getReadCurrentHourCommand();
					this.Adapter.SendCommand(Ff07Char, CommandRequest);
					break;
				case Constants.SyncHandlerSequence.ReadSignature:
					Debug.WriteLine("SyncDeviceHandler961: Read Signature Data");
					StepsTableParameters sigData = this.SignatureToBeUploadedTableList.ElementAt(0);
					SignatureDataInstance.SDYear = sigData.dbYear;
					SignatureDataInstance.SDMonth = sigData.dbMonth;
					SignatureDataInstance.SDDay = sigData.dbDay;
					CommandRequest = await SignatureDataInstance.GetReadSignDataCommand();
					this.Adapter.SendCommand(Ff07Char, CommandRequest);

					// insert timer here
					break;
				case Constants.SyncHandlerSequence.ReadSeizure:
					Debug.WriteLine("SyncDeviceHandler961: Read seizure Data");
					SeizureBlockInfo seizureBlock = this.SeizureToBeUploadedList.ElementAt(0);
					SeizureDataInstance.SeizureRecToRead = seizureBlock.sbseizureRecordNo;
					SeizureDataInstance.BlockNumber = seizureBlock.sbSeizureBlock;
					CommandRequest = await SeizureDataInstance.GetReadCommand();
					this.Adapter.SendCommand(Ff07Char, CommandRequest);

					// insert timer here
					break;
				case Constants.SyncHandlerSequence.WriteStepsHeader:
					Debug.WriteLine("SyncDeviceHandler961: Writing steps header");
					CommandRequest = await StepsTableDataInstance.GetWriteStepTableDataCommand(StepTableParamInstance);
					this.Adapter.SendCommand(Ff07Char, CommandRequest);
					break;
				case Constants.SyncHandlerSequence.WriteDeviceSettings:
					Debug.WriteLine("SyncDeviceHandler961: Writing device settings");
					CommandRequest = await DeviceSettingsInstance.GetWriteCommand();
					this.Adapter.SendCommand(Ff07Char, CommandRequest);
					break;
				case Constants.SyncHandlerSequence.WriteUserSettings:
					Debug.WriteLine("SyncDeviceHandler961: Writing user settings");
					CommandRequest = await UserSettingsInstance.GetWriteCommand();
					this.Adapter.SendCommand(Ff07Char, CommandRequest);
					break;
				case Constants.SyncHandlerSequence.WriteExerciseSettings:
					Debug.WriteLine("SyncDeviceHandler961: Writing exercise settings");
					CommandRequest = await ExerciseSettingsInstance.GetWriteCommand();
					this.Adapter.SendCommand(Ff07Char, CommandRequest);
					break;
				case Constants.SyncHandlerSequence.WriteCompanySettings:
					Debug.WriteLine("SyncDeviceHandler961: Writing company settings");
					CommandRequest = await CompanySettingsInstance.GetWriteCommand();
					this.Adapter.SendCommand(Ff07Char, CommandRequest);
					break;
				case Constants.SyncHandlerSequence.WriteSignatureSettings:
					Debug.WriteLine("SyncDeviceHandler961: Writing signature settings");
					CommandRequest = await SignatureSettingsInstance.GetWriteCommand();
					this.Adapter.SendCommand(Ff07Char, CommandRequest);
					break;
				case Constants.SyncHandlerSequence.WriteSeizureSettings:
					Debug.WriteLine("SyncDeviceHandler961: Writing seizure settings");
					CommandRequest = await SeizureSettingsInstance.GetWriteCommand();
					this.Adapter.SendCommand(Ff07Char, CommandRequest);
		          	break;
				case Constants.SyncHandlerSequence.WriteScreenFlow:
					Debug.WriteLine("SyncDeviceHandler961: Writing screenflow settings");
					CommandRequest = await FirmwareDisplaySequenceInstance.GetWriteCommand(this.ScreenFlowList);
					this.Adapter.SendCommand(Ff07Char, CommandRequest);
					break;
				case Constants.SyncHandlerSequence.WriteDeviceSensitivity:
					Debug.WriteLine("SyncDeviceHandler961: Writing device sensitivity settings");
					SensitivitySettingsInstance.SensitivityOld = DeviceDataInstance.TrackerSensitivity;
					CommandRequest = await SensitivitySettingsInstance.GetWriteCommand();
					this.Adapter.SendCommand(Ff07Char, CommandRequest);
					break;
				case Constants.SyncHandlerSequence.WriteDeviceStatus:
					Debug.WriteLine("SyncDeviceHandler961: Writing device status settings");
					CommandRequest = await DeviceStatusInstance.GetWriteCommand();
					this.Adapter.SendCommand(Ff07Char, CommandRequest);
					break;
				case Constants.SyncHandlerSequence.WriteDeviceMode:
					Debug.WriteLine("SyncDeviceHandler961: Writing device mode settings");
					DeviceModeInstance.EnableBroadcastAlways = DeviceDataInstance.AdvertiseMode;
					CommandRequest = await DeviceModeInstance.GetWriteCommand();
					this.Adapter.SendCommand(Ff07Char, CommandRequest);
					break;	
				case Constants.SyncHandlerSequence.WriteScreenDisplay:
					Debug.WriteLine("SyncDeviceHandler961: Writing screen display");
					this.ActivationCode = Utils.GetRandomDigits(4); //4 random digits to be generated
					// For testing purposes only
					this.ActivationCode[0] = 0x31;
					this.ActivationCode[1] = 0x32;
					this.ActivationCode[2] = 0x33;
					this.ActivationCode[3] = 0x34;
					// For testing purposes only
					Debug.WriteLine("Random digits: " + Motion.Mobile.Utilities.Utils.ByteArrayToHexString(this.ActivationCode));
					CommandRequest = await DisplayOnScreenInstance.GetWriteCommand(this.ActivationCode);
					this.Adapter.SendCommand(Ff07Char, CommandRequest);
					break;
				case Constants.SyncHandlerSequence.ClearEEProm:
					Debug.WriteLine("SyncDeviceHandler961: Clear eeprom");
					ClearEEPROMInstance.ExerciseData = this.clearMessagesOnly?false:true;
					ClearEEPROMInstance.SettingsData = false;
					ClearEEPROMInstance.SurveyQuestions = true;
					ClearEEPROMInstance.Tallies = true;
					ClearEEPROMInstance.MedicineAlarm = true;
					ClearEEPROMInstance.MotivationalQuotes = true;
					CommandRequest = await ClearEEPROMInstance.GetWriteCommand();
					this.Adapter.SendCommand(Ff07Char, CommandRequest);
					break;

				case Constants.SyncHandlerSequence.WsActivateDeviceWithMember:
					Debug.WriteLine("SyncDeviceHandler961: WS Activate Device With Member");
					WSActivateDeviceWithMemberInstance.request.TrackerModel = TrioDeviceInformationInstance.ModelNumber;
					WSActivateDeviceWithMemberInstance.request.TrackerSerialNumber = TrioDeviceInformationInstance.SerialNumber;
					WSActivateDeviceWithMemberInstance.request.TrackerBtAdd = "";
					WSActivateDeviceWithMemberInstance.request.ApplicationID = UserInformationInstance.ApplicationID;
					WSActivateDeviceWithMemberInstance.request.MemberDermID = UserInformationInstance.MemberID;
					WSActivateDeviceWithMemberInstance.request.TrackerFirmwareVersion = TrioDeviceInformationInstance.FirmwareVersion;
					this.status = await WSActivateDeviceWithMemberInstance.PostRequest();

					if (this.status == WebServiceRequestStatus.SUCCESS)
					{
						Debug.WriteLine("Success");
						if (WSActivateDeviceWithMemberInstance.response != null)
						{
							this.SetSettingsFromActivateDeviceWithMemberResponseWS(WSActivateDeviceWithMemberInstance.response);
							ProcessCommands();
						}


					}
					else
					{
						Debug.WriteLine("ActivateDeviceWithMemeber Response is " + WSActivateDeviceWithMemberInstance.response.ResponseMessage);
						this.Adapter.DisconnectDevice(this.Device);
					}
					//this.Adapter.SendCommand(Ff07Char, CommandRequest);
					break;
				case Constants.SyncHandlerSequence.WsGetDeviceInfo:
					Debug.WriteLine("SyncDeviceHandler961: WS Request GetDeviceInfo");
					WSGetDeviceInformationInstance.request.TrackerModel = TrioDeviceInformationInstance.ModelNumber;
					WSGetDeviceInformationInstance.request.TrackerSerialNumber = TrioDeviceInformationInstance.SerialNumber;
					WSGetDeviceInformationInstance.request.DeviceDateTime = Motion.Mobile.Utilities.Utils.GetDeviceDateTimeWithFormat(DateTime.Now);
					WSGetDeviceInformationInstance.request.ApplicationID = UserInformationInstance.ApplicationID;
					WSGetDeviceInformationInstance.request.DevicePairingStatus = 1;
					WSGetDeviceInformationInstance.request.TrackerFirmwareVersion = TrioDeviceInformationInstance.FirmwareVersion;
					this.status = await WSGetDeviceInformationInstance.PostRequest();

					this.ServerReadTimeDuration = 0;
					if (this.status == WebServiceRequestStatus.SUCCESS)
					{
						Debug.WriteLine("Success");
						if (WSGetDeviceInformationInstance.response != null)
						{
							this.isResettingTrio = false;
							timerForServer = new Timer(timerCallBack, new object(), 0, 1000);
							timerForServer.Increment += TimerForServer_Increment;
							this.SetSettingsFromGetDeviceInfoResponseWS(WSGetDeviceInformationInstance.response);
							ProcessCommands();
						}
						else
						{
							Debug.WriteLine("WS Request GetDeviceInfo Response is " + WSGetDeviceInformationInstance.response.ResponseMessage);
							this.Adapter.DisconnectDevice(this.Device);
						}

					}
					//else if  Tobe Added?
					else if (string.Equals(WSGetDeviceInformationInstance.response.ResponseStatus, "reset"))
					{
						this.isResettingTrio = true;
						DeviceStatusInstance.PairingStatus = 1;
						this.ProcessQeueue.Enqueue(Constants.SyncHandlerSequence.WriteDeviceStatus);
						this.ProcessCommands();
						Debug.WriteLine("Device Not Paired...");
					}
					else
					{ 
						Debug.WriteLine("Get Device Info Failed :(");
					}
						


					break;

				case Constants.SyncHandlerSequence.WsUploadTallies:
					Debug.WriteLine("SyncDeviceHandler961: WS Upload Tallies");

					WSUploadTalliesDataInstance.request.DeviceModel = TrioDeviceInformationInstance.ModelNumber;
					WSUploadTalliesDataInstance.request.DeviceSerial = TrioDeviceInformationInstance.SerialNumber;
					WSUploadTalliesDataInstance.request.MemberDeviceID = UserInformationInstance.MemberDeviceId;
					WSUploadTalliesDataInstance.request.ApplicationID = UserInformationInstance.ApplicationID;
					WSUploadTalliesDataInstance.request.PlatformID = UserInformationInstance.PlatformID;
					WSUploadTalliesDataInstance.request.DeviceDateTime = Motion.Mobile.Utilities.Utils.GetServerDateTimeFromString(MemberServerProfileInstance.ServerDateTime);
					WSUploadTalliesDataInstance.request.talliesData = TalliesDataInstance;

					this.status = await WSUploadTalliesDataInstance.PostRequest();

					if (this.status == WebServiceRequestStatus.SUCCESS)
					{
						Debug.WriteLine("Success");

						if (ApplicationInfoInstance.ApplicationID > 0 && ApplicationInfoInstance.PlatformID > 0)
						{
							if ((AppUpdateSettingsInstance.UpdateFlag && AppUpdateSettingsInstance.UpdateType != 2) || !AppUpdateSettingsInstance.UpdateFlag)
							{
								if (!this.clearTracker)
								{
									this.ProcessQeueue.Enqueue(Constants.SyncHandlerSequence.ReadSeizureSettings);
									this.ProcessCommands();
								}

							}

						}

						else
						{
							this.isValidateAppInfo = true;
							this.ProcessQeueue.Enqueue(Constants.SyncHandlerSequence.WsSendAppInfo);
							this.ProcessCommands();
						}


					}
					else
					{
						Debug.WriteLine("Upload Tallies Response is " + WSUploadTalliesDataInstance.response.ResponseStatus);
						this.Adapter.DisconnectDevice(this.Device);
					}
					break;
				case Constants.SyncHandlerSequence.WsUploadSteps:
					Debug.WriteLine("SyncDeviceHandler961: WS Upload Steps");
					this.CreateUploadStepsDataRequest(WSUploadStepsDataInstance.request);
					this.status = await WSUploadStepsDataInstance.PostRequest();
					if (this.status == WebServiceRequestStatus.SUCCESS)
					{
						Debug.WriteLine("Success");
						if (this.isReadingCurrentHour)
						{
							//READ_DEVICE_SETTING
							this.checkTimeDifferenceAndUpdateDeviceTime();
						}
						else
						{
							//UpdateStepDataTable
							StepTableParamInstance = this.UpdateStepDataTable();
							this.ProcessQeueue.Enqueue(Constants.SyncHandlerSequence.WriteStepsHeader);
							this.ProcessCommands();

						}

					}
					else
					{
						Debug.WriteLine("Upload Steps Response is " + WSUploadStepsDataInstance.response.ResponseMessage);
						this.Adapter.DisconnectDevice(this.Device);
					}
					break;
				case Constants.SyncHandlerSequence.WsUploadSignature:
					Debug.WriteLine("SyncDeviceHandler961: WS Upload Signature");
					this.CreateUploadSignatureRequestData(WSUploadSignatureDataInstance.request);
					this.status = await WSUploadSignatureDataInstance.PostRequest();
					if (this.status == WebServiceRequestStatus.SUCCESS)
					{
						Debug.WriteLine("Success");
						if (this.SignatureToBeUploadedTableList.Count() > 0)
						{
							this.ProcessQeueue.Enqueue(Constants.SyncHandlerSequence.ReadSignature);
							this.ProcessCommands();
						}
						else
						{
							if (this.MemberServerProfileInstance.UpdateFlag > 0)
							{
								this.UpdateSettingsFlag(Utils.USER_SETTINGS_BIT_LOC);
							}
							else
							{
								//if(READ SURVEY)
								//else
								// update settings 
								//CLEAR_MESSAGES_SETTINGS_BIT_LOC
								this.UpdateSettingsFlag(Utils.CLEAR_MESSAGES_SETTINGS_BIT_LOC);
							}
						}
							

					}
					else
					{
						Debug.WriteLine("Upload Signature Response is " + WSUploadSignatureDataInstance.response.ResponseMessage);
						this.Adapter.DisconnectDevice(this.Device);
					}
					break;
				case Constants.SyncHandlerSequence.WsUploadProfile:
					break;
				case Constants.SyncHandlerSequence.WsUnpairDevice:
					Debug.WriteLine("SyncDeviceHandler961: WS Unpair Device");
					WSUnpairMemberDeviceInstance.request.DeviceID = WSActivateDeviceWithMemberInstance.response.DeviceID;
					WSUnpairMemberDeviceInstance.request.MemberID = UserInformationInstance.MemberID;
					WSUnpairMemberDeviceInstance.request.MemberDeviceID = UserInformationInstance.MemberDeviceId;
					this.status = await WSUploadSeiureDataInstance.PostRequest();
					if (this.status == WebServiceRequestStatus.SUCCESS)
					{
						Debug.WriteLine("Deactivating Device Successful");
					}
					break;
				case Constants.SyncHandlerSequence.WsUploadSeizure:
					Debug.WriteLine("SyncDeviceHandler961: WS Upload Seizure");
					this.CreateUploadSeizureRequestData(WSUploadSeiureDataInstance.request);
					this.status = await WSUploadSeiureDataInstance.PostRequest();
					if (this.status == WebServiceRequestStatus.SUCCESS)
					{
						Debug.WriteLine("Success");
						if (this.SeizureToBeUploadedList.Count() > 0)
						{
							this.ProcessQeueue.Enqueue(Constants.SyncHandlerSequence.ReadSeizure);
							this.ProcessCommands();
						}
						else
						{
							if (this.SignatureToBeUploadedTableList.Count() > 0)
							{
								this.ProcessQeueue.Enqueue(Constants.SyncHandlerSequence.ReadSignature);
								this.ProcessCommands();
							}
							else
							{
								if (this.MemberServerProfileInstance.UpdateFlag > 0)
								{
									this.UpdateSettingsFlag(Utils.USER_SETTINGS_BIT_LOC);
								}
								else
								{
									//if(READ SURVEY)
									//else
									// update settings 
									//CLEAR_MESSAGES_SETTINGS_BIT_LOC
									this.UpdateSettingsFlag(Utils.CLEAR_MESSAGES_SETTINGS_BIT_LOC);
								}
							}
						}


					}
					else
					{
						Debug.WriteLine("Upload Seizure Response is " + WSUploadSeiureDataInstance.response.ResponseMessage);
						this.Adapter.DisconnectDevice(this.Device);
					}
					break;
				case Constants.SyncHandlerSequence.WsSendNotifySettingsUpdate:
					Debug.WriteLine("SyncDeviceHandler961: WS Notify Settings Update");

					DateTime currentDateTime = DateTime.Now;

					long dateTimeInUnix = (long)Motion.Mobile.Utilities.Utils.DateTimeToUnixTimestamp(currentDateTime);

					DateTime dateTime = new DateTime(DeviceSettingsInstance.Year + 2000, DeviceSettingsInstance.Month, DeviceSettingsInstance.Day, DeviceSettingsInstance.Hour, DeviceSettingsInstance.Minute, DeviceSettingsInstance.Second);
					dateTime.AddSeconds(this.DeviceReadTimeDuration);

					WSNotifySettingsUpdateInstance.request.MemberID = UserInformationInstance.MemberID;
					WSNotifySettingsUpdateInstance.request.MemberDeviceID = UserInformationInstance.MemberDeviceId;
					WSNotifySettingsUpdateInstance.request.LastSyncSettingDateTime = dateTimeInUnix;
					WSNotifySettingsUpdateInstance.request.TrackerModel = TrioDeviceInformationInstance.ModelNumber;
					WSNotifySettingsUpdateInstance.request.UpdateFlag = MemberServerProfileInstance.UpdateFlag;
					WSNotifySettingsUpdateInstance.request.SettingType = MemberServerProfileInstance.UpdateFlagChanges;
					WSNotifySettingsUpdateInstance.request.DevicePairingStatus = DeviceStatusInstance.PairingStatus;
					WSNotifySettingsUpdateInstance.request.DeviceDateTime = Motion.Mobile.Utilities.Utils.GetDeviceDateTimeWithFormat(dateTime);
					WSNotifySettingsUpdateInstance.request.BatteryLevel = TrioDeviceInformationInstance.BatteryLevel;


					this.status = await WSNotifySettingsUpdateInstance.PostRequest();
					if (this.status == WebServiceRequestStatus.SUCCESS)
					{
						Debug.WriteLine("WS Notify Settings Update Successful");
					}
					else
					{
						Debug.WriteLine("WS Notify Settings Update Response is " + WSNotifySettingsUpdateInstance.response.ResponseMessage);
						this.Adapter.DisconnectDevice(this.Device);
					}
					break;
				case Constants.SyncHandlerSequence.WsUploadCommandResponse:
					Debug.WriteLine("SyncDeviceHandler961: WS Upload Command Response");
					WSUploadCommandResponseInstance.request.commandRespData.UploadCommand = 0x58;
					WSUploadCommandResponseInstance.request.DeviceModel = TrioDeviceInformationInstance.ModelNumber;
					WSUploadCommandResponseInstance.request.DeviceSerial = TrioDeviceInformationInstance.SerialNumber;
					WSUploadCommandResponseInstance.request.MemberDeviceID = UserInformationInstance.MemberDeviceId;
					WSUploadCommandResponseInstance.request.ApplicationID = UserInformationInstance.ApplicationID;
					WSUploadCommandResponseInstance.request.PlatformID = UserInformationInstance.PlatformID;
					WSUploadCommandResponseInstance.request.SynchronizationID = this.MemberServerProfileInstance.SynchronizationID;
					this.status = await WSUploadCommandResponseInstance.PostRequest();
					if (this.status == WebServiceRequestStatus.SUCCESS)
					{
						Debug.WriteLine("WS Upload Command Successful!");
					}
					else
					{
						Debug.WriteLine("WS Upload Command Response is " + WSUploadCommandResponseInstance.response.ResponseMessage);
						this.Adapter.DisconnectDevice(this.Device);
					}
					break;	
				case Constants.SyncHandlerSequence.WsSendAppInfo:
					Debug.WriteLine("SyncDeviceHandler961: WS Validate App Info");
					WSSendAppInfoInstance.request.ApplicationName = ApplicationInfoInstance.ApplicationName;
					WSSendAppInfoInstance.request.ApplicationVersion = ApplicationInfoInstance.ApplicationVersion;
					WSSendAppInfoInstance.request.OperatingSystem = ApplicationInfoInstance.OperatingSystem;
					WSSendAppInfoInstance.request.OperatingSystemVersion = ApplicationInfoInstance.OperatingSystemVersion;
					WSSendAppInfoInstance.request.PlatformType = ApplicationInfoInstance.PlatformType;
					WSSendAppInfoInstance.request.Brand = ApplicationInfoInstance.Brand;
					WSSendAppInfoInstance.request.Model = ApplicationInfoInstance.Model;
					WSSendAppInfoInstance.request.Manufacturer = ApplicationInfoInstance.Manufacturer;
					WSSendAppInfoInstance.request.CommunicationType = ApplicationInfoInstance.CommunicationType;
					this.status = await WSSendAppInfoInstance.PostRequest();
					if (this.status == WebServiceRequestStatus.SUCCESS)
					{
						Debug.WriteLine("WS Validate App Info Successful");

						this.UserInformationInstance.ApplicationID = WSSendAppInfoInstance.response.ApplicationID;
						this.UserInformationInstance.PlatformID = WSSendAppInfoInstance.response.PlatformID;
						if (this.isValidateAppInfo)
						{
							this.ApplicationInfoInstance.ApplicationID = WSSendAppInfoInstance.response.ApplicationID;
							this.ApplicationInfoInstance.PlatformID = WSSendAppInfoInstance.response.PlatformID;
							if ((AppUpdateSettingsInstance.UpdateFlag && AppUpdateSettingsInstance.UpdateType != 2) || !AppUpdateSettingsInstance.UpdateFlag)
							{
								if (!this.clearTracker)
									this.ProcessCommands();
								else
								{
									this.ProcessQeueue.Enqueue(Constants.SyncHandlerSequence.WriteDeviceSettings);
									this.ProcessCommands();
								}
							}

						}
						else
						{ 
							this.AppUpdateSettingsInstance.UpdateType = WSSendAppInfoInstance.response.appUpdateInfo.UpdateType;
						}

					}
					else
					{
						Debug.WriteLine("WS Validate App Info Response is " + WSUploadCommandResponseInstance.response.ResponseMessage);
						this.Adapter.DisconnectDevice(this.Device);
					}
					break;	
				default:
					Debug.WriteLine("SyncDeviceHandler961: Unable to identify command.");
					break;
			}

		}
Esempio n. 3
0
		public async Task<BLEParsingStatus> ParseData(byte[] rawData)
		{
			BLEParsingStatus parsingStatus = BLEParsingStatus.ERROR;
			await Task.Run(() =>
			{
				
				this._rawData = new byte[rawData.Length];
				Array.Copy(rawData, this._rawData, rawData.Length);
				this.IsReadCommand = true;
				if (rawData[1] == 0x25)
				{
					this.IsReadCommand = false;
					this.writeCommandResponseCodeRaw = new byte[WRITE_COMMAND_RESPONSE_CODE_BYTE_SIZE];

					Array.Copy(this._rawData, 2, this.writeCommandResponseCodeRaw, INDEX_ZERO, WRITE_COMMAND_RESPONSE_CODE_BYTE_SIZE);
					this.WriteCommandResponseCode = Convert.ToInt32(Utils.getDecimalValue(this.writeCommandResponseCodeRaw));

					if ((this.trioDevInfo.ModelNumber == 961 && this.trioDevInfo.FirmwareVersion >= 5.0f))
					{
						this.fraudTableRaw = new byte[FRAUD_TABLE_BYTE_SIZE];
						Array.Copy(this._rawData, 3, this.fraudTableRaw, INDEX_ZERO, FRAUD_TABLE_BYTE_SIZE);
						this.FraudTableCommandValue = Convert.ToInt32(Utils.getDecimalValue(this.fraudTableRaw));
					}

					parsingStatus = BLEParsingStatus.SUCCESS;

				}
				else //(rawData[1] == 0x22)
				{
					this.stepsDataTable = new List<StepsTableParameters>();
					int byteTotalPerResponse = 19;

					if ((this.trioDevInfo.ModelNumber == 961 && this.trioDevInfo.FirmwareVersion >= 5.0f))
						byteTotalPerResponse = 20;



					int len = (this._rawData.Length / byteTotalPerResponse) * 2;
					int currentIndex = 0;
					for (int i = 0; i < len; i++)
					{


						StepsTableParameters stepParams = new StepsTableParameters();


						if (i % 2 == 0)
						{
							currentIndex = currentIndex + 3;

						}

						this.yrDataRaw = new byte[YEAR_DATA_BYTE_SIZE];
						this.monthDataRaw = new byte[MONTH_DATA_BYTE_SIZE];
						this.dayDataRaw = new byte[DAY_DATA_BYTE_SIZE];
						this.hrNumberRaw = new byte[HOUR_NUM_BYTE_SIZE];
						this.sentHourFlagRaw = new byte[SENT_HOUR_BYTE_SIZE];
						this.profileGeneratedRaw = new byte[PROFILE_GENERATED_BYTE_SIZE];


						Array.Copy(this._rawData, currentIndex, this.yrDataRaw, INDEX_ZERO, YEAR_DATA_BYTE_SIZE);
						currentIndex = currentIndex + YEAR_DATA_BYTE_SIZE;
						Array.Copy(this._rawData, currentIndex, this.monthDataRaw, INDEX_ZERO, MONTH_DATA_BYTE_SIZE);
						currentIndex = currentIndex + MONTH_DATA_BYTE_SIZE;
						Array.Copy(this._rawData, currentIndex, this.dayDataRaw, INDEX_ZERO, DAY_DATA_BYTE_SIZE);
						currentIndex += DAY_DATA_BYTE_SIZE;
						Array.Copy(this._rawData, currentIndex, this.hrNumberRaw, INDEX_ZERO, HOUR_NUM_BYTE_SIZE);
						currentIndex += HOUR_NUM_BYTE_SIZE;
						Array.Copy(this._rawData, currentIndex, this.sentHourFlagRaw, INDEX_ZERO, SENT_HOUR_BYTE_SIZE);
						currentIndex += SENT_HOUR_BYTE_SIZE;
						Array.Copy(this._rawData, currentIndex, this.profileGeneratedRaw, INDEX_ZERO, PROFILE_GENERATED_BYTE_SIZE);
						currentIndex += PROFILE_GENERATED_BYTE_SIZE;

						// use 3F since bit 6 and 7 us turned on, need to turn it back off
						stepParams.dbYear = Convert.ToInt32(Utils.getDecimalValue(this.yrDataRaw)) & 0x3F; 
						stepParams.dbMonth = Convert.ToInt32(Utils.getDecimalValue(this.monthDataRaw)) & 0x3F;  
						stepParams.dbDay = Convert.ToInt32(Utils.getDecimalValue(this.dayDataRaw)) & 0x3F; 
						stepParams.dbHourNumber = Convert.ToInt32(Utils.getDecimalValue(this.hrNumberRaw)) & 0x3F; 
						stepParams.sentHourFlag = Convert.ToInt32(Utils.getDecimalValue(this.sentHourFlagRaw)); 
						int flagValue = Convert.ToInt32(Utils.getDecimalValue(this.profileGeneratedRaw));  
						stepParams.signatureGenerated = Convert.ToInt32(flagValue & 0xFF);
						stepParams.signatureSent = Convert.ToInt32(flagValue & 0xF0);

						if (this.trioDevInfo.ModelNumber == 961 && this.trioDevInfo.FirmwareVersion >= 5.0f)
						//stepsDataTable
						{
							this.fraudTableRaw = new byte[FRAUD_TABLE_BYTE_SIZE];
							Array.Copy(this._rawData, currentIndex, this.fraudTableRaw, INDEX_ZERO, FRAUD_TABLE_BYTE_SIZE);
							currentIndex += FRAUD_TABLE_BYTE_SIZE;
							stepParams.fraudTable = Convert.ToInt32(Utils.getDecimalValue(this.fraudTableRaw)); 
						}

						stepParams.allFlagged = false;
						if (stepParams.sentHourFlag == 16777215) // or 'FFFFFF'
							stepParams.allFlagged = true;

						if (stepParams.dbYear != 0)
						{
							stepParams.tableDate = new DateTime(stepParams.dbYear+ 2000, stepParams.dbMonth, stepParams.dbDay);
							stepsDataTable.Add(stepParams);
						}


					}

					stepsDataTable.Sort((a, b) => a.tableDate.CompareTo(b.tableDate));

					parsingStatus = BLEParsingStatus.SUCCESS;
				}



			});

			return parsingStatus;
		}
		private void ProcessWriteTableHeaderResponse()
		{
			if (StepsDataInstance.dailyData.Count > 0)
			{
				StepsDataInstance.dailyData.RemoveAt(0);

				StepTableParamInstance = this.UpdateStepDataTable();
				this.ProcessQeueue.Enqueue(Constants.SyncHandlerSequence.WriteStepsHeader);
				this.ProcessCommands();
			}

			else
			{ 
				bool hasDataToSync = false;
				bool shouldExitLoop = false;
				foreach (StepsTableParameters tableData in StepsTableDataInstance.stepsDataTable)
				{
					bool willContinueOuterLoop = true;

					if (!tableData.allFlagged)
					{
						hasDataToSync = true;
						if (tableData.dbYear != 0 && tableData.dbMonth != 0 && tableData.dbDay != 0)
						{
							int flagHourCount = 0;
							bool shouldStopCounter = false; 
							int currentHourValue = 0;
							for (int j = 0; j < tableData.dbHourNumber; j++)
							{
								currentHourValue |= (int)Math.Pow(2, j);
								//Debug.WriteLine("CurrentFlag Value " + currentHourValue + " sentHourFlag " + stp.sentHourFlag);
								if ((tableData.sentHourFlag == currentHourValue) || shouldStopCounter)
								{
									shouldStopCounter = true;
								}
								else
									flagHourCount++;
							}

							if (tableData.dbHourNumber == 0 && tableData.sentHourFlag == 0)
							{
								hasDataToSync = false;
							}
							else if (tableData.sentHourFlag > 0 && tableData.sentHourFlag == currentHourValue)
							{
								hasDataToSync = false;
							}
							else if (flagHourCount > 0 && tableData.dbHourNumber == 0)
							{
								hasDataToSync = false;
							}
							else if (flagHourCount > tableData.dbHourNumber)
							{
								hasDataToSync = false;
							}

							shouldExitLoop = true;
						}

					}

					if (shouldExitLoop)
						break;
				}

				if (!hasDataToSync)
				{
					this.isReadingCurrentHour = true;
					this.ProcessQeueue.Enqueue(Constants.SyncHandlerSequence.ReadCurrentHour);
					this.ProcessCommands();

					//self.stepsDataReadTimer TO DO

				}

				else
				{
					this.ReadStepsData();
				}
			}

		}