| /* |
| * Copyright (C) 2016 The Android Open Source Project |
| * |
| * 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 |
| * |
| * http://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. |
| */ |
| |
| #define LOG_TAG "GnssHAL_GnssNavigationMessageInterface" |
| |
| #include <log/log.h> |
| |
| #include "GnssNavigationMessage.h" |
| |
| namespace android { |
| namespace hardware { |
| namespace gnss { |
| namespace V1_0 { |
| namespace implementation { |
| |
| sp<IGnssNavigationMessageCallback> GnssNavigationMessage::sGnssNavigationMsgCbIface = nullptr; |
| |
| GpsNavigationMessageCallbacks GnssNavigationMessage::sGnssNavigationMessageCb = { |
| .size = sizeof(GpsNavigationMessageCallbacks), |
| .navigation_message_callback = nullptr, |
| .gnss_navigation_message_callback = gnssNavigationMessageCb |
| }; |
| |
| GnssNavigationMessage::GnssNavigationMessage( |
| const GpsNavigationMessageInterface* gpsNavigationMessageIface) : |
| mGnssNavigationMessageIface(gpsNavigationMessageIface) {} |
| |
| void GnssNavigationMessage::gnssNavigationMessageCb(LegacyGnssNavigationMessage* message) { |
| if (sGnssNavigationMsgCbIface == nullptr) { |
| ALOGE("%s: GnssNavigation Message Callback Interface configured incorrectly", __func__); |
| return; |
| } |
| |
| if (message == nullptr) { |
| ALOGE("%s, received invalid GnssNavigationMessage from GNSS HAL", __func__); |
| return; |
| } |
| |
| IGnssNavigationMessageCallback::GnssNavigationMessage navigationMsg; |
| |
| navigationMsg.svid = message->svid; |
| navigationMsg.type = |
| static_cast<IGnssNavigationMessageCallback::GnssNavigationMessageType>(message->type); |
| navigationMsg.status = message->status; |
| navigationMsg.messageId = message->message_id; |
| navigationMsg.submessageId = message->submessage_id; |
| navigationMsg.data.setToExternal(message->data, message->data_length); |
| |
| auto ret = sGnssNavigationMsgCbIface->gnssNavigationMessageCb(navigationMsg); |
| if (!ret.isOk()) { |
| ALOGE("%s: Unable to invoke callback", __func__); |
| } |
| } |
| |
| // Methods from ::android::hardware::gnss::V1_0::IGnssNavigationMessage follow. |
| Return<GnssNavigationMessage::GnssNavigationMessageStatus> GnssNavigationMessage::setCallback( |
| const sp<IGnssNavigationMessageCallback>& callback) { |
| if (mGnssNavigationMessageIface == nullptr) { |
| ALOGE("%s: GnssNavigationMessage not available", __func__); |
| return GnssNavigationMessageStatus::ERROR_GENERIC; |
| } |
| |
| sGnssNavigationMsgCbIface = callback; |
| |
| return static_cast<GnssNavigationMessage::GnssNavigationMessageStatus>( |
| mGnssNavigationMessageIface->init(&sGnssNavigationMessageCb)); |
| } |
| |
| Return<void> GnssNavigationMessage::close() { |
| if (mGnssNavigationMessageIface == nullptr) { |
| ALOGE("%s: GnssNavigationMessage not available", __func__); |
| } else { |
| mGnssNavigationMessageIface->close(); |
| } |
| return Void(); |
| } |
| |
| } // namespace implementation |
| } // namespace V1_0 |
| } // namespace gnss |
| } // namespace hardware |
| } // namespace android |