diff options
Diffstat (limited to 'power.c')
-rw-r--r-- | power.c | 147 |
1 files changed, 147 insertions, 0 deletions
@@ -0,0 +1,147 @@ +/* + * This file is part of QMI-RIL. + * + * Copyright (C) 2017 Wolfgang Wiedmeyer <wolfgit@wiedmeyer.de> + * + * QMI-RIL is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * QMI-RIL is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with QMI-RIL. If not, see <http://www.gnu.org/licenses/>. + */ + +#include <stdlib.h> + +#define LOG_TAG "RIL" +#include <utils/Log.h> + +#include <qmi-ril.h> + +void dms_event_report_indication_cb(QmiClientDms *client, + QmiIndicationDmsEventReportOutput *output) +{ + QmiDmsOperatingMode mode; + + qmi_indication_dms_event_report_output_get_operating_mode( + output, &mode, NULL); + + RIL_LOGD("Got operating mode indication:\n" + "\tMode: '%s'", qmi_dms_operating_mode_get_string(mode)); + + switch (mode) { + case QMI_DMS_OPERATING_MODE_LOW_POWER: + RIL_LOGD("Power state is low power mode"); + ril_radio_state_update(RADIO_STATE_OFF); + break; + case QMI_DMS_OPERATING_MODE_SHUTTING_DOWN: + RIL_LOGD("Power: device is in the process of shutting down"); + ril_radio_state_update(RADIO_STATE_OFF); + break; + case QMI_DMS_OPERATING_MODE_ONLINE: + RIL_LOGD("Power state is normal"); + ril_radio_state_update(RADIO_STATE_SIM_NOT_READY); + break; + default: + RIL_LOGE("Unknown power state"); + } +} + +static void +set_operating_mode_ready(QmiClientDms *client, GAsyncResult *res, + RIL_Token token) +{ + QmiMessageDmsSetOperatingModeOutput *output; + GError *error = NULL; + + output = qmi_client_dms_set_operating_mode_finish(client, res, + &error); + if (!output) { + RIL_LOGE("%s: error: operation failed: %s", __func__, + error->message); + goto error; + } + + if (!qmi_message_dms_set_operating_mode_output_get_result( + output, &error)) { + RIL_LOGE("error: couldn't set operating mode: %s", + error->message); + goto error; + } + + RIL_LOGD("Operating mode set successfully"); + + ril_request_complete(token, RIL_E_SUCCESS, NULL, 0); + goto complete; + +error: + ril_request_complete(token, RIL_E_GENERIC_FAILURE, NULL, 0); + +complete: + if (error) + g_error_free(error); + if (output) + qmi_message_dms_set_operating_mode_output_unref(output); +} + +int ril_request_radio_power(void *data, size_t size, RIL_Token token) +{ + struct ril_request *request; + int power_state; + QmiMessageDmsSetOperatingModeInput *input = NULL; + QmiDmsOperatingMode mode; + GError *error = NULL; + int rc; + + if (data == NULL || size < sizeof(power_state)) + goto error; + + request = ril_request_find_request_status(RIL_REQUEST_RADIO_POWER, RIL_REQUEST_HANDLED); + if (request != NULL) + return RIL_REQUEST_UNHANDLED; + + power_state = *((int *)data); + + if (power_state > 0) { + RIL_LOGD("Requesting normal power state"); + mode = QMI_DMS_OPERATING_MODE_ONLINE; + } else { + RIL_LOGD("Requesting low power mode power state"); + mode = QMI_DMS_OPERATING_MODE_LOW_POWER; + } + + input = qmi_message_dms_set_operating_mode_input_new(); + if (!qmi_message_dms_set_operating_mode_input_set_mode( + input, mode, &error)) { + RIL_LOGE("error: couldn't create input data bundle: '%s'", + error->message); + goto error; + } + + qmi_client_dms_set_operating_mode(ctx->DmsClient, input, 10, + ctx->cancellable, + (GAsyncReadyCallback)set_operating_mode_ready, + token); + + rc = RIL_REQUEST_HANDLED; + goto complete; + +error: + ril_request_complete(token, RIL_E_GENERIC_FAILURE, NULL, 0); + + rc = RIL_REQUEST_COMPLETED; + +complete: + if (error) + g_error_free(error); + if (input) + qmi_message_dms_set_operating_mode_input_unref(input); + + return rc; +} |