/* * Copyright (C) 2014 Canonical, Ltd. * * This program 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; version 3. * * This program 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 this program. If not, see . * * Author: Renato Araujo Oliveira Filho */ #include "Lights.h" #include extern "C" { #include "android-hardware.h" #include } Lights::Lights(QObject* parent) : QObject(parent), m_lightDevice(0), m_color("blue"), m_state(Lights::Off), m_onMs(1000), m_offMs(3000) { } Lights::~Lights() { if (m_lightDevice) { hw_device_t* device = (hw_device_t*) m_lightDevice; device->close(device); } } void Lights::setState(Lights::State newState) { if (!init()) { qWarning() << "No lights device"; return; } if (m_state != newState) { if (newState == Lights::On) { turnOn(); } else { turnOff(); } m_state = newState; Q_EMIT stateChanged(m_state); } } Lights::State Lights::state() const { return m_state; } void Lights::setColor(const QColor &color) { if (m_color != color) { m_color = color; Q_EMIT colorChanged(m_color); // FIXME: update the color if the light is already on } } QColor Lights::color() const { return m_color; } int Lights::onMillisec() const { return m_onMs; } void Lights::setOnMillisec(int onMs) { if (m_onMs != onMs) { m_onMs = onMs; Q_EMIT onMillisecChanged(m_onMs); // FIXME: update the property if the light is already on } } int Lights::offMillisec() const { return m_offMs; } void Lights::setOffMillisec(int offMs) { if (m_offMs != offMs) { m_offMs = offMs; Q_EMIT offMillisecChanged(m_offMs); // FIXME: update the property if the light is already on } } bool Lights::init() { if (m_lightDevice) { return true; } int err; hw_module_t* module; err = hw_get_module(LIGHTS_HARDWARE_MODULE_ID, (hw_module_t const**)&module); if (err == 0) { hw_device_t* device; err = module->methods->open(module, LIGHT_ID_NOTIFICATIONS, &device); if (err == 0) { m_lightDevice = (light_device_t*)device; turnOff(); return true; } else { qWarning() << "Failed to access notification lights"; } } else { qWarning() << "Failed to initialize lights hardware."; } return false; } void Lights::turnOn() { // pulse light_state_t state; memset(&state, 0, sizeof(light_state_t)); state.color = m_color.rgba(); state.flashMode = LIGHT_FLASH_TIMED; state.flashOnMS = m_onMs; state.flashOffMS = m_offMs; state.brightnessMode = BRIGHTNESS_MODE_USER; if (m_lightDevice->set_light(m_lightDevice, &state) != 0) { qWarning() << "Failed to turn the light off"; } } void Lights::turnOff() { light_state_t state; memset(&state, 0, sizeof(light_state_t)); state.color = 0x00000000; state.flashMode = LIGHT_FLASH_NONE; state.flashOnMS = 0; state.flashOffMS = 0; state.brightnessMode = 0; if (m_lightDevice->set_light(m_lightDevice, &state) != 0) { qWarning() << "Failed to turn the light off"; } }