// Copyright 2022 The Pigweed Authors
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
#include "rpc_demo/service/demo_service.h"

namespace rpc_demo {

// Method definitions for pw_demo.DemoHostService.
::pw::Status DemoService::GetVersion(const rpc_demo_Empty& request,
                                     rpc_demo_GetVersionResponse& response) {
  static_cast<void>(request);
  response.version_number = VERSION;
  return ::pw::OkStatus();
}

::pw::Status DemoService::GetSensorList(
    const rpc_demo_Empty& request, rpc_demo_GetSensorListResponse& response) {
  // TODO: Read the request as appropriate for your application
  static_cast<void>(request);
  // TODO: Fill in the response as appropriate for your application
  static_cast<void>(response);
  return ::pw::Status::Unimplemented();
}

::pw::Status DemoService::UpdateSensorFrequency(
    const rpc_demo_UpdateSensorFrequencyRequest& request,
    rpc_demo_UpdateSensorFrequencyResponse& response) {
  // TODO: Read the request as appropriate for your application
  static_cast<void>(request);
  // TODO: Fill in the response as appropriate for your application
  static_cast<void>(response);
  return ::pw::Status::Unimplemented();
}

::pw::Status DemoService::GetSensorSamples(
    const rpc_demo_GetSensorSamplesRequest& request,
    rpc_demo_GetSensorSamplesResponse& response) {
  // TODO: Read the request as appropriate for your application
  static_cast<void>(request);
  // TODO: Fill in the response as appropriate for your application
  static_cast<void>(response);
  return ::pw::Status::Unimplemented();
}

}  // namespace rpc_demo
