예제 #1
0
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;
}
예제 #2
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);
    }
}
예제 #3
0
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);
	}
}
예제 #4
0
void Handle::sendSignal(const char *uri, const char *payload, bool typecheck) const
{
    Error error;

    if (typecheck)
    {
        if (!LSSignalSend(_handle, uri, payload, error.get()))
        {
            throw error;
        }
    }
    else
    {
        if (!LSSignalSendNoTypecheck(_handle, uri, payload, error.get()))
        {
            throw error;
        }
    }
}
예제 #5
0
static void
SendSignal(LSFilterFunc callback, const char *uri, const char *payload, ...)
{
    bool retVal;
    char *buffer;

    LSError lserror;
    LSErrorInit(&lserror);

    va_list args;
    va_start(args, payload);
    buffer  = g_strdup_vprintf(payload, args);
    va_end(args);

    retVal = LSSignalSend(gServiceHandle, uri, buffer, &lserror);
    if (!retVal)
    {
        LSErrorPrint(&lserror, stderr);
        LSErrorFree(&lserror);
    }

    g_free(buffer);
}
예제 #6
0
int
main(int argc, char **argv)
{
    bool interactive = false;
    bool timing = false;
    bool signal = false;
    bool use_public_bus = false;
    char *serviceName = NULL;
    int optionCount = 0;
    int opt;

    while ((opt = getopt(argc, argv, "hdisPrlfn:t:m:a:q:")) != -1)
    {
    switch (opt) {
    case 'i':
        interactive = true;
        optionCount++;
        break;
    case 's':
        signal = true;
        optionCount++;
        break;
    case 'P':
        use_public_bus = true;
        optionCount++;
        break;
    case 'd':
        sLogLevel = G_LOG_LEVEL_DEBUG;
        optionCount++;
        break;
    case 'n':
        interactive = true;
        count = atoi(optarg);
        optionCount+=2;
        break;
    case 't':
        timing = true;
        count = atoi(optarg);
        optionCount+=2;
        break;
    case 'm':
        serviceName = g_strdup(optarg);
        optionCount+=2;
        break;
    case 'a':
        appId = g_strdup(optarg);
        optionCount+=2;
        break;
    case 'l':
        line_number = true;
        optionCount++;
        break;
    case 'f':
        format_response = true;
        optionCount++;
        break;
    case 'q':
        query_list = g_list_append(query_list, g_strdup(optarg));
        optionCount+=2;
        break;
    case 'h':
    default:
        PrintUsage(argv[0]);
        return 0;
        }
    }

    if (argc < 3 + optionCount) {
        PrintUsage(argv[0]);
        return 0;
    }

    g_log_set_default_handler(g_log_filter, NULL);

    GMainLoop *mainLoop = g_main_loop_new(NULL, FALSE); 

    if (mainLoop == NULL)
    {
        g_critical("Unable to create mainloop");
        exit(EXIT_FAILURE);
    }

    LSError lserror;
    LSErrorInit(&lserror);

    LSHandle *sh = NULL;
    bool serviceInit = LSRegisterPubPriv(serviceName, &sh,
                use_public_bus, &lserror);

    if (!serviceInit) goto exit;

    bool gmainAttach = LSGmainAttach(sh, mainLoop, &lserror);
    if (!gmainAttach) goto exit;    

    url = g_strdup(argv[optionCount + 1]);
    message = g_strdup(argv[optionCount + 2]);

    LSMessageToken sessionToken;
    bool retVal;

    if (timing) {

      /* Timing loop */
      clock_gettime(CLOCK_MONOTONIC, &startTime);
      retVal = LSCallFromApplication(sh, url, message, appId,
            timingServiceResponse, mainLoop, &sessionToken, &lserror);
      
      if (!retVal) goto exit;

      g_main_loop_run(mainLoop);
      
      printf("Total time %.02f ms, %d iterations, %.02f ms per iteration\n",
        roundtripTime * 1000.0, roundtripCount, (roundtripTime / roundtripCount) * 1000.0);
      
      printf("%d bytes sent, %d bytes received\n",
        sentBytes, rcvdBytes);
    
    } else {

      if (signal)
      {
          retVal = LSSignalSend(sh, url, message, &lserror);
      }
      else
      {
          /* Basic sending */
          retVal = LSCallFromApplication(sh, url, message, appId,
                serviceResponse, mainLoop, &sessionToken, &lserror);
      }
      
      if (!retVal) goto exit;

      if (interactive && !signal) 
      {
          g_io_add_watch(g_io_channel_unix_new(0), G_IO_ERR|G_IO_HUP, input_closed, mainLoop);
          g_main_loop_run(mainLoop);
      }
      else if (!signal)
      {
          /* 
           * NOV-93580: In the non-interactive case, we can't guarantee that
           * an LSCall() will necessarily get the QueryNameReply before
           * shutting down if it does not wait for (or have) a reply from the
           * far side.
           */
          g_critical("WARNING: you must always call luna-send with \"-i\" or \"-n\". Exiting with failure return code.");
          exit(EXIT_FAILURE);
      }
    }

exit:

    if (LSErrorIsSet(&lserror))
    {
        LSErrorPrint(&lserror, stderr);
        LSErrorFree(&lserror);
    }

    if (sh != NULL)
    {
        if (!LSUnregister(sh, &lserror))
        {
            LSErrorPrint(&lserror, stderr);
            LSErrorFree(&lserror);
        }
    }

    g_main_loop_unref(mainLoop);

    if (url)
        g_free (url);

    if (message)
        g_free (message);

    return 0;
}
예제 #7
0
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;
}