static bool alarms_timeout_subscribe_cb(LSHandle *sh, LSMessage *message, void *ctx) { bool retVal; bool fired = false; struct context *alrm_ctx = (struct context *)ctx; const char *payload = LSMessageGetPayload(message); struct json_object *object = json_tokener_parse(payload); if (is_error(object)) { POWERDLOG(LOG_CRIT,"%s: invalid json from sleep daemon",__func__); } else { fired = json_object_get_boolean(json_object_object_get(object, "fired")); } POWERDLOG(LOG_INFO,"%s: response with payload %s, count : %d", __FUNCTION__, payload, alrm_ctx->count); if(alrm_ctx->replyMessage) { if(fired) { retVal = LSMessageReply(GetLunaServiceHandle(), alrm_ctx->replyMessage, payload, NULL); if (!retVal) { POWERDLOG(LOG_WARNING, "%s could not send reply.", __FUNCTION__); } } else if(LSMessageGetConnection(alrm_ctx->replyMessage)) { retVal = LSMessageReply(LSMessageGetConnection(alrm_ctx->replyMessage), alrm_ctx->replyMessage, payload, NULL); if (!retVal) { POWERDLOG(LOG_WARNING, "%s could not send reply.", __FUNCTION__); } } alrm_ctx->count++; } else POWERDLOG(LOG_CRIT,"%s: replyMessage is NULL",__func__); if(alrm_ctx->count == 2) { if(!LSCallCancel(sh, alrm_ctx->call_token, NULL)) { POWERDLOG(LOG_WARNING, "%s could not cancel luna-service alarm call.", __FUNCTION__); } LSMessageUnref(alrm_ctx->replyMessage); free(alrm_ctx); } if (!is_error(object)) json_object_put(object); return true; }
static bool clientCancel(LSHandle *sh, LSMessage *message, void *ctx) { LSCall(GetLunaServiceHandle(), SLEEPD_SUSPEND_SERVICE"clientCancelByName", LSMessageGetPayload(message), NULL,(void *)message, NULL, NULL); return true; }
static int _power_timeout_init(void) { /* Set up luna service */ psh = GetPalmService(); LSError lserror; LSErrorInit(&lserror); if (!LSPalmServiceRegisterCategory(psh, "/timeout", timeout_methods /*public*/, NULL /*private*/, NULL, NULL, &lserror)) { POWERDLOG(LOG_ERR, "%s could not register category: %s", __FUNCTION__, lserror.message); LSErrorFree(&lserror); goto error; } if (!LSRegisterCategory(GetLunaServiceHandle(), "/time", time_methods, NULL, NULL, &lserror)) { goto error; } UEventListen("/com/palm/powerd/timechange/uevent", _timechange_callback); return 0; error: return -1; }
static int shutdown_init(void) { sClientList = g_new0(ShutdownClientList, 1); sClientList->applications = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, (GDestroyNotify)client_free); sClientList->services = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, (GDestroyNotify)client_free); sClientList->num_ack = 0; sClientList->num_nack = 0; shutdown_timer = g_timer_new(); gCurrentState = &kStateMachine[kPowerShutdownNone]; LSError lserror; LSErrorInit(&lserror); if (!LSRegisterCategory(GetLunaServiceHandle(), "/shutdown", shutdown_methods, shutdown_signals, NULL, &lserror)) { goto error; } return 0; error: LSErrorPrint(&lserror, stderr); LSErrorFree(&lserror); return -1; }
/** * @brief Start an activity. */ bool activityStartCallback(LSHandle *sh, LSMessage *message, void *user_data) { LSMessageRef(message); LSCall(GetLunaServiceHandle(), SLEEPD_SUSPEND_SERVICE"activityStart", LSMessageGetPayload(message), suspend_ipc_method_cb,(void *)message, NULL, NULL); return true; }
bool prepareSuspendRegister(LSHandle *sh, LSMessage *message, void *data) { LSMessageRef(message); LSCall(GetLunaServiceHandle(), SLEEPD_SUSPEND_SERVICE"prepareSuspendRegister", LSMessageGetPayload(message), suspend_ipc_method_cb,(void *)message, NULL, NULL); return true; }
/** * @brief Called by test code to reset state machine to square 1. * * @retval */ static bool TESTresetShutdownState(LSHandle *sh, LSMessage *message, void *user_data) { LSMessageRef(message); LSCallOneReply(GetLunaServiceHandle(), SLEEPD_SHUTDOWN_SERVICE"TESTresetShutdownState", LSMessageGetPayload(message), shutdown_method_cb,(void *)message, NULL, NULL); return true; }
/** * @brief Turn on/off visual leds suspend via luna-service. * * @retval */ bool visualLedSuspendCallback(LSHandle *sh, LSMessage *message, void *data) { LSMessageRef(message); LSCall(GetLunaServiceHandle(), SLEEPD_SUSPEND_SERVICE"visualLedSuspend", LSMessageGetPayload(message), suspend_ipc_method_cb,(void *)message, NULL, NULL); return true; }
/** * @brief Ack the "shutdownApplications" signal. */ static bool shutdownApplicationsAck(LSHandle *sh, LSMessage *message, void *user_data) { LSMessageRef(message); LSCallOneReply(GetLunaServiceHandle(), SLEEPD_SHUTDOWN_SERVICE"shutdownApplicationsAck", LSMessageGetPayload(message), shutdown_method_cb,(void *)message, NULL, NULL); return true; }
static bool alarmRemove(LSHandle *sh, LSMessage *message, void *ctx) { LSMessageRef(message); LSCallOneReply(GetLunaServiceHandle(), "palm://com.palm.sleep/time/alarmRemove", LSMessageGetPayload(message), alarms_timeout_cb, (void *)message, NULL, NULL); return true; }
/** * @brief Add a new alarm based on calender time. Sets the callback function based on the "subscribe" option value. */ static bool alarmAddCalendar(LSHandle *sh, LSMessage *message, void *ctx) { struct json_object *object=NULL; object = json_tokener_parse(LSMessageGetPayload(message)); if ( is_error(object) ) { goto malformed_json; } struct json_object *subscribe_json = json_object_object_get(object, "subscribe"); bool subscribe = json_object_get_boolean(subscribe_json); LSMessageRef(message); if(subscribe) { struct context *alrm_ctx=NULL; alrm_ctx = malloc(sizeof(struct context)); if(!alrm_ctx) goto error; memset(alrm_ctx,0,sizeof(struct context)); alrm_ctx->replyMessage = message; LSCall(GetLunaServiceHandle(), "palm://com.palm.sleep/time/alarmAddCalender", LSMessageGetPayload(message), alarms_timeout_subscribe_cb, (void *)alrm_ctx, &alrm_ctx->call_token, NULL); } else LSCallOneReply(GetLunaServiceHandle(), "palm://com.palm.sleep/time/alarmAddCalender", LSMessageGetPayload(message), alarms_timeout_cb, (void *)message, NULL, NULL); goto cleanup; malformed_json: LSMessageReplyErrorBadJSON(sh, message); goto cleanup; error: POWERDLOG(LOG_ERR,"Failed to allocate memory"); LSMessageReplyErrorUnknown(sh, message); cleanup: if (!is_error(object)) json_object_put(object); return true; }
void sendBatteryStatus(void) { nyx_battery_status_t status; if(!battDev) return; nyx_error_t err = nyx_battery_query_battery_status(battDev,&status); if(err != NYX_ERROR_NONE) { POWERDLOG(LOG_ERR,"%s: nyx_charger_query_battery_status returned with error : %d",__func__,err); } int percent_ui = getUiPercent(status.percentage); POWERDLOG(LOG_INFO, "(%fmAh, %d%%, %d%%_ui, %dC, %dmA, %dmV)\n", status.capacity, status.percentage, percent_ui, status.temperature, status.current, status.voltage); GString *buffer = g_string_sized_new(500); g_string_append_printf(buffer,"{\"percent\":%d,\"percent_ui\":%d," "\"temperature_C\":%d,\"current_mA\":%d,\"voltage_mV\":%d," "\"capacity_mAh\":%f}", status.percentage, percent_ui, status.temperature, status.current, status.voltage, status.capacity); char *payload = g_string_free(buffer, FALSE); POWERDLOG(LOG_DEBUG,"%s: Sending payload : %s",__func__,payload); LSError lserror; LSErrorInit(&lserror); bool retVal = LSSignalSend(GetLunaServiceHandle(), "luna://com.palm.powerd/com/palm/power/batteryStatus", payload, &lserror); if (!retVal) { LSErrorPrint(&lserror, stderr); LSErrorFree(&lserror); } g_free(payload); return; }
/** * @brief Add a new alarm to the queue. * * @param id * @param calendar_time * @param expiry * @param serviceName * @param applicationName * * @retval */ static bool alarm_queue_add(uint32_t id, const char *key, bool calendar_time, time_t expiry, const char *serviceName, const char *applicationName, bool subscribe, LSMessage *message) { _Alarm *alarm = g_new0(_Alarm, 1); alarm->key = g_strdup(key); alarm->id = id; alarm->calendar = calendar_time; alarm->expiry = expiry; alarm->serviceName = g_strdup(serviceName); alarm->applicationName = g_strdup(applicationName); if (subscribe) { LSError lserror; LSErrorInit(&lserror); bool retVal = LSSubscriptionAdd( GetLunaServiceHandle(), "alarm", message, &lserror); if (!retVal) { LSErrorPrint(&lserror, stderr); LSErrorFree(&lserror); goto error; } LSMessageRef(message); alarm->message = message; } alarm_print(alarm); if (alarm->id >= gAlarmQueue->seq_id) { gAlarmQueue->seq_id = alarm->id + 1; } g_sequence_insert_sorted(gAlarmQueue->alarms, alarm, (GCompareDataFunc)alarm_cmp_func, NULL); update_alarms(); return true; error: return false; }
static int SuspendIPCInit(void) { bool retVal; LSError lserror; LSErrorInit(&lserror); retVal = LSSubscriptionSetCancelFunction(GetLunaServiceHandle(), clientCancel, NULL, &lserror); if (!retVal) { LSErrorPrint(&lserror, stderr); LSErrorFree(&lserror); } return 0; }
static void send_shutdown_services() { bool retVal; LSError lserror; LSErrorInit(&lserror); retVal = LSSignalSend(GetLunaServiceHandle(), "luna://com.palm.sleep/shutdown/shutdownServices", "{}", &lserror); if (!retVal) { g_critical("%s Could not send shutdown applications", __FUNCTION__); LSErrorPrint(&lserror, stderr); LSErrorFree(&lserror); } }
/** * @brief Init registers with bus and udev. * */ int alarm_init(void) { LSError lserror; LSErrorInit(&lserror); if (!LSRegisterCategory(GetLunaServiceHandle(), "/time", time_methods, NULL, NULL, &lserror)) { goto error; } alarm_queue_create(); alarm_read_db(); update_alarms(); return 0; error: return -1; }
static int shutdown_init(void) { LSError lserror; LSErrorInit(&lserror); if (!LSRegisterCategory(GetLunaServiceHandle(), "/shutdown", shutdown_methods, NULL, NULL, &lserror)) { goto error; } return 0; error: LSErrorPrint(&lserror, stderr); LSErrorFree(&lserror); return -1; }
void machineShutdown(void) { char *payload = g_strdup_printf("{\"reason\":\"Battery level is critical\"}"); LSError lserror; LSErrorInit(&lserror); POWERDLOG(LOG_DEBUG,"%s: Sending payload : %s",__func__,payload); bool retVal = LSSignalSend(GetLunaServiceHandle(), "luna://com.palm.power/shutdown/machineOff", payload, &lserror); g_free(payload); if (!retVal) { LSErrorPrint(&lserror, stderr); LSErrorFree(&lserror); } }
static bool shutdownServicesRegister(LSHandle *sh, LSMessage *message, void *user_data) { LSMessageRef(message); LSCallOneReply(GetLunaServiceHandle(), SLEEPD_SHUTDOWN_SERVICE"shutdownServicesRegister", LSMessageGetPayload(message), shutdown_method_cb,(void *)message, NULL, NULL); bool retVal; LSError lserror; LSErrorInit(&lserror); retVal = LSSubscriptionAdd(sh, "shutdownClient", message, &lserror); if (!retVal) { g_critical("LSSubscriptionAdd failed."); LSErrorPrint(&lserror, stderr); LSErrorFree(&lserror); } return true; }
/** * @brief Register a new client. */ bool identifyCallback(LSHandle *sh, LSMessage *message, void *data) { LSMessageRef(message); LSCall(GetLunaServiceHandle(), SLEEPD_SUSPEND_SERVICE"identify", LSMessageGetPayload(message), suspend_ipc_method_cb,(void *)message, NULL, NULL); struct json_object *object = json_tokener_parse(LSMessageGetPayload(message)); if ( is_error(object) ) { goto out; } bool subscribe = json_object_get_boolean(json_object_object_get(object, "subscribe")); if (subscribe) { LSSubscriptionAdd(sh, "PowerdClients", message, NULL); } out: return true; }
static bool state_shutdown_action(ShutdownEvent *event, ShutdownState *next) { bool retVal = LSMessageReply(GetLunaServiceHandle(), shutdown_message, "{\"success\":true}", NULL); if (!retVal) { g_critical("%s: Could not send shutdown success message", __FUNCTION__); } if (shutdown_message) { LSMessageUnref(shutdown_message); shutdown_message = NULL; } nyx_system_set_alarm(GetNyxSystemDevice(),0,NULL,NULL); return false; }
/** * @brief Sends a "/alarm" message to the service associated with this alarm. * * {"alarmId":1,"fired":true,"key":"appkey"} * * @param alarm */ static void fire_alarm(_Alarm *alarm) { bool retVal; char buf_alarm[STD_ASCTIME_BUF_SIZE]; struct tm tm_alarm; time_t rtctime = 0; gmtime_r(&alarm->expiry, &tm_alarm); asctime_r(&tm_alarm, buf_alarm); nyx_system_query_rtc_time(GetNyxSystemDevice(), &rtctime); SLEEPDLOG_DEBUG("fire_alarm() : Alarm (%s %s %s) fired at %s (rtc %ld)", alarm->serviceName, alarm->applicationName, alarm->key, buf_alarm, rtctime); GString *payload = g_string_sized_new(255); g_string_append_printf(payload, "{\"alarmId\":%d,\"fired\":true", alarm->id); if (alarm->key) { g_string_append_printf(payload, ",\"key\":\"%s\"", alarm->key); } if (alarm->applicationName && strcmp(alarm->applicationName, "") != 0) { g_string_append_printf(payload, ",\"applicationName\":\"%s\"", alarm->applicationName); } g_string_append_printf(payload, "}"); LSError lserror; LSErrorInit(&lserror); if (alarm->serviceName && strcmp(alarm->serviceName, "") != 0) { char *uri = g_strdup_printf("luna://%s/alarm", alarm->serviceName); retVal = LSCall(GetLunaServiceHandle(), uri, payload->str, NULL, NULL, NULL, &lserror); if (!retVal) { LSErrorPrint(&lserror, stderr); LSErrorFree(&lserror); } g_free(uri); } if (alarm->message) { retVal = LSMessageReply(GetLunaServiceHandle(), alarm->message, payload->str, &lserror); if (!retVal) { LSErrorPrint(&lserror, stderr); LSErrorFree(&lserror); } } g_string_free(payload, TRUE); }
void sendChargerStatus(void) { nyx_charger_status_t status; if(!nyxDev) return; nyx_error_t err = nyx_charger_query_charger_status(nyxDev,&status); if(err != NYX_ERROR_NONE) { POWERDLOG(LOG_ERR,"%s: nyx_charger_query_charger_status returned with error : %d",__func__,err); } POWERDLOG(LOG_DEBUG,"In %s connected : %d:%d, powered : %d:%d",__func__,currStatus.connected,status.connected,currStatus.powered,status.powered); if(currStatus.connected != status.connected || currStatus.powered != status.powered) { LSError lserror; LSErrorInit(&lserror); char *payload = g_strdup_printf("{\"DockConnected\":%s,\"DockPower\":%s,\"DockSerialNo\":\"%s\"," "\"USBConnected\":%s,\"USBName\":\"%s\",\"Charging\":%s}",(status.connected & NYX_CHARGER_INDUCTIVE_CONNECTED) ? "true" : "false", (status.powered & NYX_CHARGER_INDUCTIVE_POWERED) ? "true" :"false",(strlen(status.dock_serial_number)) ? status.dock_serial_number : "NULL", (status.powered & NYX_CHARGER_USB_POWERED) ? "true" : "false",ChargerNameToString(status.connected), (status.is_charging) ? "true":"false"); POWERDLOG(LOG_DEBUG,"%s: Sending payload : %s",__func__,payload); bool retVal = LSSignalSend(GetLunaServiceHandle(), "luna://com.palm.powerd/com/palm/power/USBDockStatus", payload, &lserror); if (!retVal) { LSErrorPrint(&lserror, stderr); LSErrorFree(&lserror); g_free(payload); return; } g_free(payload); payload = g_strdup_printf("{\"type\":\"%s\",\"name\":\"%s\",\"connected\":%s,\"current_mA\":%d,\"message_source\":\"powerd\"}", ChargerTypeToString(status.powered), ChargerNameToString(status.connected), status.connected ? "true" : "false", status.charger_max_current); POWERDLOG(LOG_DEBUG,"%s: Sending payload : %s",__func__,payload); retVal = LSSignalSend(GetLunaServiceHandle(), "luna://com.palm.powerd/com/palm/power/chargerStatus", payload, &lserror); if (!retVal) { LSErrorPrint(&lserror, stderr); LSErrorFree(&lserror); } g_free(payload); } if(currStatus.connected != status.connected) { char *payload = g_strdup_printf("{\"connected\":%s}", status.connected ? "true" : "false"); LSError lserror; LSErrorInit(&lserror); POWERDLOG(LOG_DEBUG,"%s: Sending payload : %s",__func__,payload); bool retVal = LSSignalSend(GetLunaServiceHandle(), "luna://com.palm.power/com/palm/power/chargerConnected", payload, &lserror); g_free(payload); if (!retVal) { LSErrorPrint(&lserror, stderr); LSErrorFree(&lserror); } } memcpy(&currStatus,&status,sizeof(nyx_charger_status_t)); // Iterate through both charging as well as battery state machines. Is this required ?? // ChargingLogicUpdate(NYX_NO_NEW_EVENT); return; }
int BatteryInit(void) { int ret = 0; nyx_error_t error = NYX_ERROR_NONE; nyx_device_iterator_handle_t iteraror = NULL; error = nyx_device_get_iterator(NYX_DEVICE_BATTERY, NYX_FILTER_DEFAULT, &iteraror); if(error != NYX_ERROR_NONE || iteraror == NULL) { goto error; } else if (error == NYX_ERROR_NONE) { nyx_device_id_t id = NULL; while ((error = nyx_device_iterator_get_next_id(iteraror, &id)) == NYX_ERROR_NONE && NULL != id) { g_debug("Powerd: Battery device id \"%s\" found",id); error = nyx_device_open(NYX_DEVICE_BATTERY, id, &battDev); if(error != NYX_ERROR_NONE) { goto error; } break; } } LSError lserror; LSErrorInit(&lserror); bool retVal; retVal = LSCall(GetLunaServiceHandle(), "luna://com.palm.lunabus/signal/addmatch", "{\"category\":\"/com/palm/power\"," "\"method\":\"batteryStatusQuery\"}", batteryStatusQuerySignal, NULL, NULL, &lserror); if (!retVal) goto lserror; if (gChargeConfig.fake_battery) { retVal = LSCall(GetLunaServiceHandle(), "luna://com.palm.lunabus/signal/addmatch", "{\"category\":\"/com/palm/power\"," "\"method\":\"fakeBatteryStatus\"}", fakeBatteryStatus, NULL, NULL, &lserror); if (!retVal) goto lserror; } nyx_battery_register_battery_status_callback(battDev,notifyBatteryStatus,NULL); out: if(iteraror) free(iteraror); return ret; lserror: LSErrorPrint (&lserror, stderr); LSErrorFree (&lserror); ret = -1; goto out; error: g_critical("Powerd: No battery device found\n"); battDev = NULL; // abort(); return 0; }
int ChargerInit(void) { int ret = 0; nyx_init(); nyx_error_t error = NYX_ERROR_NONE; nyx_device_iterator_handle_t iteraror = NULL; error = nyx_device_get_iterator(NYX_DEVICE_CHARGER, NYX_FILTER_DEFAULT, &iteraror); if(error != NYX_ERROR_NONE || iteraror == NULL) { goto error; } else if (error == NYX_ERROR_NONE) { nyx_device_id_t id = NULL; while ((error = nyx_device_iterator_get_next_id(iteraror, &id)) == NYX_ERROR_NONE && NULL != id) { g_debug("Powerd: Charger device id \"%s\" found",id); error = nyx_device_open(NYX_DEVICE_CHARGER, id, &nyxDev); if(error != NYX_ERROR_NONE) { goto error; } break; } } memset(&currStatus,0,sizeof(nyx_charger_status_t)); LSError lserror; LSErrorInit(&lserror); bool retVal; retVal = LSCall(GetLunaServiceHandle(), "luna://com.palm.lunabus/signal/addmatch", "{\"category\":\"/com/palm/power\"," "\"method\":\"chargerStatusQuery\"}", chargerStatusQuerySignal, NULL, NULL, &lserror); if (!retVal) goto lserror; nyx_charger_register_charger_status_callback(nyxDev,notifyChargerStatus,NULL); if (!gChargeConfig.skip_battery_check && !gChargeConfig.disable_charging) nyx_charger_register_state_change_callback(nyxDev,notifyStateChange,NULL); out: if(iteraror) free(iteraror); return ret; lserror: LSErrorPrint (&lserror, stderr); LSErrorFree (&lserror); ret = -1; goto out; error: g_critical("Powerd: No charger device found\n"); gChargeConfig.skip_battery_check = 1; // abort(); return 0; }