/// <summary>
        /// Write the specified data to the characteristic
        /// </summary>
        /// <param name="data">Data.</param>
        public void Write(byte[] data, CharacteristicWriteType writeType)
        {
            if (!CanWrite)
            {
                throw new InvalidOperationException("Characteristic does not support WRITE");
            }

            var nsData = NSData.FromArray(data);
            CBCharacteristicWriteType nativeWriteType = CBCharacteristicWriteType.WithResponse;

            if (writeType == CharacteristicWriteType.WithResponse)
            {
                nativeWriteType = CBCharacteristicWriteType.WithResponse;
            }
            else if (writeType == CharacteristicWriteType.WithoutResponse)
            {
                nativeWriteType = CBCharacteristicWriteType.WithoutResponse;
            }

            _peripheral.WriteValue(nsData, _nativeCharacteristic, nativeWriteType);

            if (writeType == CharacteristicWriteType.WithoutResponse)
            {
                WriteComplete?.Invoke(this, new CharacteristicWriteEventArgs(true, this));
            }
        }
Esempio n. 2
0
 private void OnCharacteristicWriteComplete(object sender, CharacteristicWriteEventArgs characteristicUpdateEventArgs)
 {
     if (characteristicUpdateEventArgs.Characteristic.Id == this.Id)
     {
         WriteComplete?.Invoke(this, new CharacteristicWriteEventArgs(true, this));
     }
 }
Esempio n. 3
0
        /// <summary>
        /// Write the specified data to the characteristic
        /// </summary>
        /// <param name="data">Data.</param>
        public void Write(byte[] data, CharacteristicWriteType writeType)
        {
            if (!CanWrite)
            {
                throw new InvalidOperationException("Characteristic does not support WRITE");
            }

            _nativeCharacteristic.SetValue(data);

            if (writeType == CharacteristicWriteType.WithResponse)
            {
                _nativeCharacteristic.WriteType = GattWriteType.Default;
            }
            else if (writeType == CharacteristicWriteType.WithoutResponse)
            {
                _nativeCharacteristic.WriteType = GattWriteType.NoResponse;
            }

            var success = _gatt.WriteCharacteristic(_nativeCharacteristic);

            if (!success)
            {
                WriteComplete?.Invoke(this, new CharacteristicWriteEventArgs(false, this));
                //throw new CharacteristicException("Write failed", CharacteristicException.Code.WriteFailed);
            }
        }
        private void OnWroteCharacteristicValue(object sender, CBCharacteristicEventArgs cbCharacteristicEventArgs)
        {
            var c   = cbCharacteristicEventArgs.Characteristic;
            var cId = c.UUID;
            var tId = _nativeCharacteristic.UUID;

            if (cId == tId)
            {
                WriteComplete?.Invoke(this, new CharacteristicWriteEventArgs(cbCharacteristicEventArgs.Error == null, this));
            }
        }
Esempio n. 5
0
        internal IModbusMessage ApplyRequest(IModbusMessage request)
        {
            IModbusMessage response;

            try
            {
                Debug.WriteLine(request.ToString());
                var eventArgs = new ModbusSlaveRequestEventArgs(request);
                ModbusSlaveRequestReceived?.Invoke(this, eventArgs);

                switch (request.FunctionCode)
                {
                case Modbus.ReadCoils:
                    response = ReadDiscretes(
                        (ReadCoilsInputsRequest)request,
                        DataStore,
                        DataStore.CoilDiscretes);
                    break;

                case Modbus.ReadInputs:
                    response = ReadDiscretes(
                        (ReadCoilsInputsRequest)request,
                        DataStore,
                        DataStore.InputDiscretes);
                    break;

                case Modbus.ReadHoldingRegisters:
                    response = ReadRegisters(
                        (ReadHoldingInputRegistersRequest)request,
                        DataStore,
                        DataStore.HoldingRegisters);
                    break;

                case Modbus.ReadInputRegisters:
                    response = ReadRegisters(
                        (ReadHoldingInputRegistersRequest)request,
                        DataStore,
                        DataStore.InputRegisters);
                    break;

                case Modbus.Diagnostics:
                    response = request;
                    break;

                case Modbus.WriteSingleCoil:
                    response = WriteSingleCoil(
                        (WriteSingleCoilRequestResponse)request,
                        DataStore,
                        DataStore.CoilDiscretes);
                    WriteComplete?.Invoke(this, eventArgs);
                    break;

                case Modbus.WriteSingleRegister:
                    response = WriteSingleRegister(
                        (WriteSingleRegisterRequestResponse)request,
                        DataStore,
                        DataStore.HoldingRegisters);
                    WriteComplete?.Invoke(this, eventArgs);
                    break;

                case Modbus.WriteMultipleCoils:
                    response = WriteMultipleCoils(
                        (WriteMultipleCoilsRequest)request,
                        DataStore,
                        DataStore.CoilDiscretes);
                    WriteComplete?.Invoke(this, eventArgs);
                    break;

                case Modbus.WriteMultipleRegisters:
                    response = WriteMultipleRegisters(
                        (WriteMultipleRegistersRequest)request,
                        DataStore,
                        DataStore.HoldingRegisters);
                    WriteComplete?.Invoke(this, eventArgs);
                    break;

                case Modbus.ReadWriteMultipleRegisters:
                    ReadWriteMultipleRegistersRequest readWriteRequest = (ReadWriteMultipleRegistersRequest)request;
                    WriteMultipleRegisters(
                        readWriteRequest.WriteRequest,
                        DataStore,
                        DataStore.HoldingRegisters);
                    WriteComplete?.Invoke(this, eventArgs);
                    response = ReadRegisters(
                        readWriteRequest.ReadRequest,
                        DataStore,
                        DataStore.HoldingRegisters);
                    break;

                default:
                    string msg = $"Unsupported function code {request.FunctionCode}.";
                    Debug.WriteLine(msg);
                    throw new InvalidModbusRequestException(Modbus.IllegalFunction);
                }
            }
            catch (InvalidModbusRequestException ex)
            {
                // Catches the exception for an illegal function or a custom exception from the ModbusSlaveRequestReceived event.
                response = new SlaveExceptionResponse(
                    request.SlaveAddress,
                    (byte)(Modbus.ExceptionOffset + request.FunctionCode),
                    ex.ExceptionCode);
            }

            return(response);
        }
Esempio n. 6
0
 private void OnWriteComplete(WriteCompleteEventArgs e)
 {
     WriteComplete?.Invoke(this, e);
 }