mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-25 06:13:34 +08:00
Merge pull request #151 from NosDE/master
BlinkM Driver with Systemstate
This commit is contained in:
+422
-27
@@ -35,9 +35,61 @@
|
|||||||
* @file blinkm.cpp
|
* @file blinkm.cpp
|
||||||
*
|
*
|
||||||
* Driver for the BlinkM LED controller connected via I2C.
|
* Driver for the BlinkM LED controller connected via I2C.
|
||||||
|
*
|
||||||
|
* Connect the BlinkM to I2C3 and put the following line to the rc startup-script:
|
||||||
|
* blinkm start
|
||||||
|
*
|
||||||
|
* To start the system monitor put in the next line after the blinkm start:
|
||||||
|
* blinkm systemmonitor
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* After startup, the Application checked how many lipo cells are connected to the System.
|
||||||
|
* The recognized number off cells, will be blinked 5 times in purple color.
|
||||||
|
* 2 Cells = 2 blinks
|
||||||
|
* ...
|
||||||
|
* 5 Cells = 5 blinks
|
||||||
|
* Now the Application will show the actual selected Flightmode, GPS-Fix and Battery Warnings and Alerts.
|
||||||
|
*
|
||||||
|
* System disarmed:
|
||||||
|
* The BlinkM should lit solid red.
|
||||||
|
*
|
||||||
|
* System armed:
|
||||||
|
* One message is made of 4 Blinks and a pause in the same length as the 4 blinks.
|
||||||
|
*
|
||||||
|
* X-X-X-X-_-_-_-_-
|
||||||
|
* -------------------------
|
||||||
|
* G G G M
|
||||||
|
* P P P O
|
||||||
|
* S S S D
|
||||||
|
* E
|
||||||
|
*
|
||||||
|
* (X = on, _=off)
|
||||||
|
*
|
||||||
|
* The first 3 blinks indicates the status of the GPS-Signal (red):
|
||||||
|
* 0-4 satellites = X-X-X-X-_-_-_-_-
|
||||||
|
* 5 satellites = X-X-_-X-_-_-_-_-
|
||||||
|
* 6 satellites = X-_-_-X-_-_-_-_-
|
||||||
|
* >=7 satellites = _-_-_-X-_-_-_-_-
|
||||||
|
* If no GPS is found the first 3 blinks are white
|
||||||
|
*
|
||||||
|
* The fourth Blink indicates the Flightmode:
|
||||||
|
* MANUAL : off
|
||||||
|
* STABILIZED : yellow
|
||||||
|
* HOLD : blue
|
||||||
|
* AUTO : green
|
||||||
|
*
|
||||||
|
* Battery Warning (low Battery Level):
|
||||||
|
* Continuously blinking in yellow X-X-X-X-X-X-X-X
|
||||||
|
*
|
||||||
|
* Battery Alert (critical Battery Level)
|
||||||
|
* Continuously blinking in red X-X-X-X-X-X-X-X
|
||||||
|
*
|
||||||
|
* General Error (no uOrb Data)
|
||||||
|
* Continuously blinking in white X-X-X-X-X-X-X-X
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include <nuttx/config.h>
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
#include <drivers/device/i2c.h>
|
#include <drivers/device/i2c.h>
|
||||||
@@ -59,15 +111,28 @@
|
|||||||
#include <systemlib/perf_counter.h>
|
#include <systemlib/perf_counter.h>
|
||||||
#include <systemlib/err.h>
|
#include <systemlib/err.h>
|
||||||
|
|
||||||
|
#include <systemlib/systemlib.h>
|
||||||
|
#include <poll.h>
|
||||||
|
#include <uORB/uORB.h>
|
||||||
|
#include <uORB/topics/vehicle_status.h>
|
||||||
|
#include <uORB/topics/vehicle_gps_position.h>
|
||||||
|
|
||||||
|
static const float MAX_CELL_VOLTAGE = 4.3f;
|
||||||
|
static const int LED_ONTIME = 100;
|
||||||
|
static const int LED_OFFTIME = 100;
|
||||||
|
static const int LED_BLINK = 1;
|
||||||
|
static const int LED_NOBLINK = 0;
|
||||||
|
|
||||||
class BlinkM : public device::I2C
|
class BlinkM : public device::I2C
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
BlinkM(int bus);
|
BlinkM(int bus);
|
||||||
~BlinkM();
|
~BlinkM();
|
||||||
|
|
||||||
|
|
||||||
virtual int init();
|
virtual int init();
|
||||||
virtual int probe();
|
virtual int probe();
|
||||||
|
virtual int setMode(int mode);
|
||||||
virtual int ioctl(struct file *filp, int cmd, unsigned long arg);
|
virtual int ioctl(struct file *filp, int cmd, unsigned long arg);
|
||||||
|
|
||||||
static const char *script_names[];
|
static const char *script_names[];
|
||||||
@@ -95,11 +160,31 @@ private:
|
|||||||
MORSE_CODE
|
MORSE_CODE
|
||||||
};
|
};
|
||||||
|
|
||||||
work_s _work;
|
enum ledColors {
|
||||||
static const unsigned _monitor_interval = 250;
|
LED_OFF,
|
||||||
|
LED_RED,
|
||||||
|
LED_YELLOW,
|
||||||
|
LED_PURPLE,
|
||||||
|
LED_GREEN,
|
||||||
|
LED_BLUE,
|
||||||
|
LED_WHITE
|
||||||
|
};
|
||||||
|
|
||||||
static void monitor_trampoline(void *arg);
|
work_s _work;
|
||||||
void monitor();
|
|
||||||
|
int led_color_1;
|
||||||
|
int led_color_2;
|
||||||
|
int led_color_3;
|
||||||
|
int led_color_4;
|
||||||
|
int led_color_5;
|
||||||
|
int led_color_6;
|
||||||
|
int led_blink;
|
||||||
|
|
||||||
|
bool systemstate_run;
|
||||||
|
|
||||||
|
void setLEDColor(int ledcolor);
|
||||||
|
static void led_trampoline(void *arg);
|
||||||
|
void led();
|
||||||
|
|
||||||
int set_rgb(uint8_t r, uint8_t g, uint8_t b);
|
int set_rgb(uint8_t r, uint8_t g, uint8_t b);
|
||||||
|
|
||||||
@@ -127,8 +212,7 @@ private:
|
|||||||
/* for now, we only support one BlinkM */
|
/* for now, we only support one BlinkM */
|
||||||
namespace
|
namespace
|
||||||
{
|
{
|
||||||
BlinkM *g_blinkm;
|
BlinkM *g_blinkm;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* list of script names, must match script ID numbers */
|
/* list of script names, must match script ID numbers */
|
||||||
@@ -155,11 +239,21 @@ const char *BlinkM::script_names[] = {
|
|||||||
nullptr
|
nullptr
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
extern "C" __EXPORT int blinkm_main(int argc, char *argv[]);
|
extern "C" __EXPORT int blinkm_main(int argc, char *argv[]);
|
||||||
|
|
||||||
BlinkM::BlinkM(int bus) :
|
BlinkM::BlinkM(int bus) :
|
||||||
I2C("blinkm", BLINKM_DEVICE_PATH, bus, 0x09, 100000)
|
I2C("blinkm", BLINKM_DEVICE_PATH, bus, 0x09, 100000),
|
||||||
|
led_color_1(LED_OFF),
|
||||||
|
led_color_2(LED_OFF),
|
||||||
|
led_color_3(LED_OFF),
|
||||||
|
led_color_4(LED_OFF),
|
||||||
|
led_color_5(LED_OFF),
|
||||||
|
led_color_6(LED_OFF),
|
||||||
|
led_blink(LED_NOBLINK),
|
||||||
|
systemstate_run(false)
|
||||||
{
|
{
|
||||||
|
memset(&_work, 0, sizeof(_work));
|
||||||
}
|
}
|
||||||
|
|
||||||
BlinkM::~BlinkM()
|
BlinkM::~BlinkM()
|
||||||
@@ -170,7 +264,6 @@ int
|
|||||||
BlinkM::init()
|
BlinkM::init()
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = I2C::init();
|
ret = I2C::init();
|
||||||
|
|
||||||
if (ret != OK) {
|
if (ret != OK) {
|
||||||
@@ -178,14 +271,25 @@ BlinkM::init()
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set some sensible defaults */
|
stop_script();
|
||||||
set_fade_speed(25);
|
set_rgb(0,0,0);
|
||||||
|
|
||||||
/* turn off by default */
|
return OK;
|
||||||
play_script(BLACK);
|
}
|
||||||
|
|
||||||
/* start the system monitor as a low-priority workqueue entry */
|
int
|
||||||
work_queue(LPWORK, &_work, (worker_t)&BlinkM::monitor_trampoline, this, 1);
|
BlinkM::setMode(int mode)
|
||||||
|
{
|
||||||
|
if(mode == 1) {
|
||||||
|
if(systemstate_run == false) {
|
||||||
|
stop_script();
|
||||||
|
set_rgb(0,0,0);
|
||||||
|
systemstate_run = true;
|
||||||
|
work_queue(LPWORK, &_work, (worker_t)&BlinkM::led_trampoline, this, 1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
systemstate_run = false;
|
||||||
|
}
|
||||||
|
|
||||||
return OK;
|
return OK;
|
||||||
}
|
}
|
||||||
@@ -249,21 +353,300 @@ BlinkM::ioctl(struct file *filp, int cmd, unsigned long arg)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
BlinkM::monitor_trampoline(void *arg)
|
BlinkM::led_trampoline(void *arg)
|
||||||
{
|
{
|
||||||
BlinkM *bm = (BlinkM *)arg;
|
BlinkM *bm = (BlinkM *)arg;
|
||||||
|
|
||||||
bm->monitor();
|
bm->led();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
BlinkM::monitor()
|
|
||||||
{
|
|
||||||
/* check system state, possibly update LED to suit */
|
|
||||||
|
|
||||||
/* re-queue ourselves to run again later */
|
|
||||||
work_queue(LPWORK, &_work, (worker_t)&BlinkM::monitor_trampoline, this, _monitor_interval);
|
void
|
||||||
|
BlinkM::led()
|
||||||
|
{
|
||||||
|
|
||||||
|
static int vehicle_status_sub_fd;
|
||||||
|
static int vehicle_gps_position_sub_fd;
|
||||||
|
|
||||||
|
static int num_of_cells = 0;
|
||||||
|
static int detected_cells_runcount = 0;
|
||||||
|
|
||||||
|
static int t_led_color[6] = { 0, 0, 0, 0, 0, 0};
|
||||||
|
static int t_led_blink = 0;
|
||||||
|
static int led_thread_runcount=0;
|
||||||
|
static int led_interval = 1000;
|
||||||
|
|
||||||
|
static int no_data_vehicle_status = 0;
|
||||||
|
static int no_data_vehicle_gps_position = 0;
|
||||||
|
|
||||||
|
static bool topic_initialized = false;
|
||||||
|
static bool detected_cells_blinked = false;
|
||||||
|
static bool led_thread_ready = true;
|
||||||
|
|
||||||
|
int num_of_used_sats = 0;
|
||||||
|
|
||||||
|
if(!topic_initialized) {
|
||||||
|
vehicle_status_sub_fd = orb_subscribe(ORB_ID(vehicle_status));
|
||||||
|
orb_set_interval(vehicle_status_sub_fd, 1000);
|
||||||
|
|
||||||
|
vehicle_gps_position_sub_fd = orb_subscribe(ORB_ID(vehicle_gps_position));
|
||||||
|
orb_set_interval(vehicle_gps_position_sub_fd, 1000);
|
||||||
|
|
||||||
|
topic_initialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(led_thread_ready == true) {
|
||||||
|
if(!detected_cells_blinked) {
|
||||||
|
if(num_of_cells > 0) {
|
||||||
|
t_led_color[0] = LED_PURPLE;
|
||||||
|
}
|
||||||
|
if(num_of_cells > 1) {
|
||||||
|
t_led_color[1] = LED_PURPLE;
|
||||||
|
}
|
||||||
|
if(num_of_cells > 2) {
|
||||||
|
t_led_color[2] = LED_PURPLE;
|
||||||
|
}
|
||||||
|
if(num_of_cells > 3) {
|
||||||
|
t_led_color[3] = LED_PURPLE;
|
||||||
|
}
|
||||||
|
if(num_of_cells > 4) {
|
||||||
|
t_led_color[4] = LED_PURPLE;
|
||||||
|
}
|
||||||
|
t_led_color[5] = LED_OFF;
|
||||||
|
t_led_blink = LED_BLINK;
|
||||||
|
} else {
|
||||||
|
t_led_color[0] = led_color_1;
|
||||||
|
t_led_color[1] = led_color_2;
|
||||||
|
t_led_color[2] = led_color_3;
|
||||||
|
t_led_color[3] = led_color_4;
|
||||||
|
t_led_color[4] = led_color_5;
|
||||||
|
t_led_color[5] = led_color_6;
|
||||||
|
t_led_blink = led_blink;
|
||||||
|
}
|
||||||
|
led_thread_ready = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (led_thread_runcount & 1) {
|
||||||
|
if (t_led_blink)
|
||||||
|
setLEDColor(LED_OFF);
|
||||||
|
led_interval = LED_OFFTIME;
|
||||||
|
} else {
|
||||||
|
setLEDColor(t_led_color[(led_thread_runcount / 2) % 6]);
|
||||||
|
//led_interval = (led_thread_runcount & 1) : LED_ONTIME;
|
||||||
|
led_interval = LED_ONTIME;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (led_thread_runcount == 11) {
|
||||||
|
/* obtained data for the first file descriptor */
|
||||||
|
struct vehicle_status_s vehicle_status_raw;
|
||||||
|
struct vehicle_gps_position_s vehicle_gps_position_raw;
|
||||||
|
|
||||||
|
bool new_data_vehicle_status;
|
||||||
|
bool new_data_vehicle_gps_position;
|
||||||
|
|
||||||
|
orb_check(vehicle_status_sub_fd, &new_data_vehicle_status);
|
||||||
|
|
||||||
|
if (new_data_vehicle_status) {
|
||||||
|
orb_copy(ORB_ID(vehicle_status), vehicle_status_sub_fd, &vehicle_status_raw);
|
||||||
|
no_data_vehicle_status = 0;
|
||||||
|
} else {
|
||||||
|
no_data_vehicle_status++;
|
||||||
|
if(no_data_vehicle_status >= 3)
|
||||||
|
no_data_vehicle_status = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
orb_check(vehicle_gps_position_sub_fd, &new_data_vehicle_gps_position);
|
||||||
|
|
||||||
|
if (new_data_vehicle_gps_position) {
|
||||||
|
orb_copy(ORB_ID(vehicle_gps_position), vehicle_gps_position_sub_fd, &vehicle_gps_position_raw);
|
||||||
|
no_data_vehicle_gps_position = 0;
|
||||||
|
} else {
|
||||||
|
no_data_vehicle_gps_position++;
|
||||||
|
if(no_data_vehicle_gps_position >= 3)
|
||||||
|
no_data_vehicle_gps_position = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* get number of used satellites in navigation */
|
||||||
|
num_of_used_sats = 0;
|
||||||
|
for(int satloop=0; satloop<20; satloop++) {
|
||||||
|
if(vehicle_gps_position_raw.satellite_used[satloop] == 1) {
|
||||||
|
num_of_used_sats++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(new_data_vehicle_status || no_data_vehicle_status < 3){
|
||||||
|
if(num_of_cells == 0) {
|
||||||
|
/* looking for lipo cells that are connected */
|
||||||
|
printf("<blinkm> checking cells\n");
|
||||||
|
for(num_of_cells = 2; num_of_cells < 7; num_of_cells++) {
|
||||||
|
if(vehicle_status_raw.voltage_battery < num_of_cells * MAX_CELL_VOLTAGE) break;
|
||||||
|
}
|
||||||
|
printf("<blinkm> cells found:%u\n", num_of_cells);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
if(vehicle_status_raw.battery_warning == VEHICLE_BATTERY_WARNING_WARNING) {
|
||||||
|
/* LED Pattern for battery low warning */
|
||||||
|
led_color_1 = LED_YELLOW;
|
||||||
|
led_color_2 = LED_YELLOW;
|
||||||
|
led_color_3 = LED_YELLOW;
|
||||||
|
led_color_4 = LED_YELLOW;
|
||||||
|
led_color_5 = LED_YELLOW;
|
||||||
|
led_color_6 = LED_YELLOW;
|
||||||
|
led_blink = LED_BLINK;
|
||||||
|
|
||||||
|
} else if(vehicle_status_raw.battery_warning == VEHICLE_BATTERY_WARNING_ALERT) {
|
||||||
|
/* LED Pattern for battery critical alerting */
|
||||||
|
led_color_1 = LED_RED;
|
||||||
|
led_color_2 = LED_RED;
|
||||||
|
led_color_3 = LED_RED;
|
||||||
|
led_color_4 = LED_RED;
|
||||||
|
led_color_5 = LED_RED;
|
||||||
|
led_color_6 = LED_RED;
|
||||||
|
led_blink = LED_BLINK;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
/* no battery warnings here */
|
||||||
|
|
||||||
|
if(vehicle_status_raw.flag_system_armed == false) {
|
||||||
|
/* system not armed */
|
||||||
|
led_color_1 = LED_RED;
|
||||||
|
led_color_2 = LED_RED;
|
||||||
|
led_color_3 = LED_RED;
|
||||||
|
led_color_4 = LED_RED;
|
||||||
|
led_color_5 = LED_RED;
|
||||||
|
led_color_6 = LED_RED;
|
||||||
|
led_blink = LED_NOBLINK;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
/* armed system - initial led pattern */
|
||||||
|
led_color_1 = LED_RED;
|
||||||
|
led_color_2 = LED_RED;
|
||||||
|
led_color_3 = LED_RED;
|
||||||
|
led_color_4 = LED_OFF;
|
||||||
|
led_color_5 = LED_OFF;
|
||||||
|
led_color_6 = LED_OFF;
|
||||||
|
led_blink = LED_BLINK;
|
||||||
|
|
||||||
|
/* handle 4th led - flightmode indicator */
|
||||||
|
switch((int)vehicle_status_raw.flight_mode) {
|
||||||
|
case VEHICLE_FLIGHT_MODE_MANUAL:
|
||||||
|
led_color_4 = LED_OFF;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VEHICLE_FLIGHT_MODE_STAB:
|
||||||
|
led_color_4 = LED_YELLOW;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VEHICLE_FLIGHT_MODE_HOLD:
|
||||||
|
led_color_4 = LED_BLUE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VEHICLE_FLIGHT_MODE_AUTO:
|
||||||
|
led_color_4 = LED_GREEN;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(new_data_vehicle_gps_position || no_data_vehicle_gps_position < 3) {
|
||||||
|
/* handling used sat´s */
|
||||||
|
if(num_of_used_sats >= 7) {
|
||||||
|
led_color_1 = LED_OFF;
|
||||||
|
led_color_2 = LED_OFF;
|
||||||
|
led_color_3 = LED_OFF;
|
||||||
|
} else if(num_of_used_sats == 6) {
|
||||||
|
led_color_2 = LED_OFF;
|
||||||
|
led_color_3 = LED_OFF;
|
||||||
|
} else if(num_of_used_sats == 5) {
|
||||||
|
led_color_3 = LED_OFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
/* no vehicle_gps_position data */
|
||||||
|
led_color_1 = LED_WHITE;
|
||||||
|
led_color_2 = LED_WHITE;
|
||||||
|
led_color_3 = LED_WHITE;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* LED Pattern for general Error - no vehicle_status can retrieved */
|
||||||
|
led_color_1 = LED_WHITE;
|
||||||
|
led_color_2 = LED_WHITE;
|
||||||
|
led_color_3 = LED_WHITE;
|
||||||
|
led_color_4 = LED_WHITE;
|
||||||
|
led_color_5 = LED_WHITE;
|
||||||
|
led_color_6 = LED_WHITE;
|
||||||
|
led_blink = LED_BLINK;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
printf( "<blinkm> Volt:%8.4f\tArmed:%4u\tMode:%4u\tCells:%4u\tNDVS:%4u\tNDSAT:%4u\tSats:%4u\tFix:%4u\tVisible:%4u\n",
|
||||||
|
vehicle_status_raw.voltage_battery,
|
||||||
|
vehicle_status_raw.flag_system_armed,
|
||||||
|
vehicle_status_raw.flight_mode,
|
||||||
|
num_of_cells,
|
||||||
|
no_data_vehicle_status,
|
||||||
|
no_data_vehicle_gps_position,
|
||||||
|
num_of_used_sats,
|
||||||
|
vehicle_gps_position_raw.fix_type,
|
||||||
|
vehicle_gps_position_raw.satellites_visible);
|
||||||
|
*/
|
||||||
|
|
||||||
|
led_thread_runcount=0;
|
||||||
|
led_thread_ready = true;
|
||||||
|
led_interval = LED_OFFTIME;
|
||||||
|
|
||||||
|
if(detected_cells_runcount < 4){
|
||||||
|
detected_cells_runcount++;
|
||||||
|
} else {
|
||||||
|
detected_cells_blinked = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
led_thread_runcount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(systemstate_run == true) {
|
||||||
|
/* re-queue ourselves to run again later */
|
||||||
|
work_queue(LPWORK, &_work, (worker_t)&BlinkM::led_trampoline, this, led_interval);
|
||||||
|
} else {
|
||||||
|
stop_script();
|
||||||
|
set_rgb(0,0,0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void BlinkM::setLEDColor(int ledcolor) {
|
||||||
|
switch (ledcolor) {
|
||||||
|
case LED_OFF: // off
|
||||||
|
set_rgb(0,0,0);
|
||||||
|
break;
|
||||||
|
case LED_RED: // red
|
||||||
|
set_rgb(255,0,0);
|
||||||
|
break;
|
||||||
|
case LED_YELLOW: // yellow
|
||||||
|
set_rgb(255,70,0);
|
||||||
|
break;
|
||||||
|
case LED_PURPLE: // purple
|
||||||
|
set_rgb(255,0,255);
|
||||||
|
break;
|
||||||
|
case LED_GREEN: // green
|
||||||
|
set_rgb(0,255,0);
|
||||||
|
break;
|
||||||
|
case LED_BLUE: // blue
|
||||||
|
set_rgb(0,0,255);
|
||||||
|
break;
|
||||||
|
case LED_WHITE: // white
|
||||||
|
set_rgb(255,255,255);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
@@ -413,7 +796,6 @@ BlinkM::get_rgb(uint8_t &r, uint8_t &g, uint8_t &b)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
BlinkM::get_firmware_version(uint8_t version[2])
|
BlinkM::get_firmware_version(uint8_t version[2])
|
||||||
{
|
{
|
||||||
@@ -443,9 +825,21 @@ blinkm_main(int argc, char *argv[])
|
|||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (g_blinkm == nullptr)
|
if (g_blinkm == nullptr)
|
||||||
errx(1, "not started");
|
errx(1, "not started");
|
||||||
|
|
||||||
|
if (!strcmp(argv[1], "systemstate")) {
|
||||||
|
g_blinkm->setMode(1);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strcmp(argv[1], "ledoff")) {
|
||||||
|
g_blinkm->setMode(0);
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (!strcmp(argv[1], "list")) {
|
if (!strcmp(argv[1], "list")) {
|
||||||
for (unsigned i = 0; BlinkM::script_names[i] != nullptr; i++)
|
for (unsigned i = 0; BlinkM::script_names[i] != nullptr; i++)
|
||||||
fprintf(stderr, " %s\n", BlinkM::script_names[i]);
|
fprintf(stderr, " %s\n", BlinkM::script_names[i]);
|
||||||
@@ -458,8 +852,9 @@ blinkm_main(int argc, char *argv[])
|
|||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
err(1, "can't open BlinkM device");
|
err(1, "can't open BlinkM device");
|
||||||
|
|
||||||
|
g_blinkm->setMode(0);
|
||||||
if (ioctl(fd, BLINKM_PLAY_SCRIPT_NAMED, (unsigned long)argv[1]) == OK)
|
if (ioctl(fd, BLINKM_PLAY_SCRIPT_NAMED, (unsigned long)argv[1]) == OK)
|
||||||
exit(0);
|
exit(0);
|
||||||
|
|
||||||
errx(1, "missing command, try 'start', 'list' or a script name");
|
errx(1, "missing command, try 'start', 'systemstate', 'ledoff', 'list' or a script name.");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user