Compare commits

..

No commits in common. "master" and "v0.1.1" have entirely different histories.

13 changed files with 347 additions and 194 deletions

18
.drone.yml Normal file

@ -0,0 +1,18 @@
kind: pipeline
name: default
steps:
- name: build
image: gcc
commands:
- apt-get -y update
- apt-get -y install libusb-1.0
- make
- name: release
image: plugins/gitea-release
settings:
api_key: a7f3afc9f77e721951e48b4af66d7565700b7a2e
base_url: https://code.jcktrue.dk
files:
- ledcontroller
when:
event: tag

1
.gitignore vendored

@ -1,4 +1,3 @@
*~
*.swp
ledcontroller
docs/

@ -1,17 +0,0 @@
{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"/usr/include/libusb-1.0"
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "gnu17",
"cppStandard": "gnu++14",
"intelliSenseMode": "linux-gcc-x64"
}
],
"version": 4
}

@ -1,17 +0,0 @@
pipeline:
build:
image: gcc
commands:
- apt-get -y update
- apt-get -y install libusb-1.0
- make
check:
image: neszt/cppcheck-docker
commands:
- cppcheck *.c
docs:
image: corentinaltepe/doxygen
commands:
- doxygen

@ -1,7 +0,0 @@
PROJECT_NAME = "ledcontroller-3bit"
OUTPUT_DIRECTORY = "docs/"
INPUT = "README.md" "main.c"
RECURSIVE = YES
WARNINGS = YES
GENERATE_LATEX = NO
USE_MDFILE_AS_MAINPAGE = README.md

@ -1,11 +1,9 @@
all: ledcontroller
ledcontroller: main.c
gcc -o $@ $^ `pkg-config libusb-1.0 --cflags --libs`
docs:
doxygen
clean:
rm -f ledcontroller
rm -rf docs
rm ledcontroller

@ -1,4 +1,3 @@
[![Build Status](https://build.jcktrue.dk/api/badges/jct/ledcontroller-3bit/status.svg)](https://build.jcktrue.dk/jct/ledcontroller-3bit)
# ledcontroller-3bit #
A Linux command line utility to control usb mail notifiers identified as:
@ -7,10 +6,12 @@ A Linux command line utility to control usb mail notifiers identified as:
Bus 001 Device 010: ID 1294:1320 RISO KAGAKU CORP.
Inside the scripts folder you will find some simple bash scripts you can use to control the notifier.
For example the script `mled-cputemp` will make it respond to your CPU's temperature.
### Get and compile: ###
$ git clone https://github.com/andmarios/ledcontroller-3bit.git
$ sudo apt-get install libusb-1.0-0-dev build-essential pkg-config
$ cd ledcontroller-3bit/
$ make
@ -26,12 +27,13 @@ A Linux command line utility to control usb mail notifiers identified as:
$ sudo rm /usr/bin/ledcontroller
### Have fun ###
### Have fun: ###
Take a look inside the _scripts_ directory.
## Requisites: ##
+ libusb:1, libusb-1.0-dev or libusb-1.0-0-dev, depending on your distribution
+ libusb:1 or libusb-1.0-dev, depending on your distribution
+ a system which can compile binaries (package build-essentials for Debian based distributions)
## Hardware ##
@ -40,6 +42,7 @@ I think [this is my notifier](http://www.andmarios.com/links/mail-usb-notifier)
---
## Copyright ##
This code (files `main.c` and `Makefile`) is a fork of the ledcontroller code by jmrobles (<http://robleshermoso.wordpress.com>).

210
main.c

@ -1,158 +1,152 @@
/**
* @file main.c
* ledcontroller-3bit
*
* This file is a fork of the LedController code. You will find
* the original copyright notices below.
*
* @copyright Copyright (C) 2013 andmarios - http://www.andmarios.com \n
*
* 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, either version 3 of the License, or
* (at your option) any later version. \n
*
* 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. \n
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*
* @copyright Original Copyright Notice: \n
*
* LedController \n
* Copyright (C) 2011 jmrobles - http://robleshermoso.wordpress.com \n
*
* 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, either version 3 of the License, or
* (at your option) any later version. \n
*
* 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. \n
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. \n
/*
ledcontroller-3bit
This file is a fork of the LedController code. You will find
the original copyright notice below.
Copyright (C) 2013 andmarios - http://www.andmarios.com
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, either version 3 of the License, or
(at your option) any later version.
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 <http://www.gnu.org/licenses/>.
Original Copyright Notice:
LedController
Copyright (C) 2011 jmrobles - http://robleshermoso.wordpress.com
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, either version 3 of the License, or
(at your option) any later version.
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 <http://www.gnu.org/licenses/>.
*/
#include <stdio.h>
#include <libusb.h>
#include <errno.h>
#include <string.h>
#define USB_VID 0x1294 /**< USB Vendor ID */
#define USB_PID 0x1320 /**< USB Product ID */
#define USB_EP 0x2 /**< USB EndPoint */
#define VID 0x1294
#define PID 0x1320
static struct libusb_device_handle *devh = NULL;
/**
* The device has a RGB LED, which has two states for each "sub-LED",
* on and off.
* The "sub-LEDs" are red, green and blue.
*
* Obviously there are 8 possible combinations for their state.
* It seems there aren't bits mapped to each sub-LED, but instead
* 3-bit values mapped to the 8 combinations.
*
* | R | G | B | Color | Value | Comment |
* | - | - | - | ------ | ----- | ------------------------------- |
* | 0 | 0 | 0 | off | 0x0 | |
* | 0 | 0 | 1 | blue | 0x1 | |
* | 1 | 0 | 0 | red | 0x2 | |
* | 0 | 1 | 0 | green | 0x3 | |
* | 0 | 1 | 1 | aqua | 0x4 | |
* | 1 | 0 | 1 | purple | 0x5 | |
* | 1 | 1 | 0 | yellow | 0x6 | more of a mustard - green color |
* | 1 | 1 | 1 | white | 0x7 | a very blue-ish white |
*
* @param argc POSIX number of parameters
* @param argv Array of parameters
* @return Error code (0 on success)
*/
int main(int argc, char **argv) {
if (argc != 2)
int main(int argc,char** argv)
{
int ret;
unsigned char code = 0;
if (argc != 2 )
{
printf("Syntax: %s blue | red | green | aqua | purple | yellow | white | off\n", argv[0]);
printf("syntax: %s blue | red | green | aqua | purple | yellow | white | off\n",argv[0]);
return -1;
}
unsigned char color_code = 0;
if (strcmp(argv[1], "off") == 0)
/*
The device has a RGB LED, which has two states for each "sub-LED",
on and off.
The "sub-LEDs" are red, green and blue.
Obviously there are 8 possible combinations for their state.
It seems there aren't bits mapped to each sub-LED, but instead
3-bit values mapped to the 8 combinations.
R G B Color Value
0 0 0 off 0x0
0 0 1 blue 0x1
1 0 0 red 0x2
0 1 0 green 0x3
0 1 1 aqua 0x4
1 0 1 purple 0x5
1 1 0 yellow 0x6 (more of a mustard - green color)
1 1 1 white 0x7 (a very blue-ish white)
*/
if ( strcmp(argv[1],"blue") == 0 )
{
color_code = 0;
code = 1;
}
else if (strcmp(argv[1], "blue") == 0)
else if ( strcmp(argv[1],"red") == 0 )
{
color_code = 1;
code = 2;
}
else if (strcmp(argv[1], "red") == 0)
else if ( strcmp(argv[1],"green") == 0 )
{
color_code = 2;
code = 3;
}
else if (strcmp(argv[1], "green") == 0)
else if ( strcmp(argv[1],"aqua") == 0 )
{
color_code = 3;
code = 4;
}
else if (strcmp(argv[1], "aqua") == 0)
else if ( strcmp(argv[1],"purple") == 0 )
{
color_code = 4;
code = 5;
}
else if (strcmp(argv[1], "purple") == 0)
else if ( strcmp(argv[1],"yellow") == 0 )
{
color_code = 5;
code = 6;
}
else if (strcmp(argv[1], "yellow") == 0)
else if ( strcmp(argv[1],"white") == 0 )
{
color_code = 6;
}
else if (strcmp(argv[1], "white") == 0)
{
color_code = 7;
}
else
{
puts("Invalid color");
code = 7;
} else {
printf("invalid color\n");
return -1;
}
libusb_init(NULL);
devh = libusb_open_device_with_vid_pid(NULL, USB_VID, USB_PID);
if (devh == NULL)
devh = libusb_open_device_with_vid_pid(NULL, VID, PID);
if (devh == NULL )
{
puts("Device not found");
printf("not found\n");
return -1;
}
if (libusb_kernel_driver_active(devh, 0))
if ( libusb_kernel_driver_active(devh,0) )
{
puts("Detach driver from kernel");
int ret = libusb_detach_kernel_driver(devh, 0);
if (ret < 0)
printf("detach from kernel\n");
ret = libusb_detach_kernel_driver(devh,0);
if (ret < 0 )
{
puts("Could not detach driver");
printf("can't detach\n");
return -1;
}
}
char data[5];
data[0] = color_code;
data[0] = code;
data[1] = 0x4;
data[2] = 0x4;
data[3] = 0x4;
data[4] = 0x4;
libusb_claim_interface(devh, 0);
int ret = libusb_interrupt_transfer(devh, USB_EP, data, 5, NULL, 0);
if (ret < 0)
int dummy;
libusb_claim_interface(devh,0);
ret = libusb_interrupt_transfer(devh,0x2,data,5,&dummy,0);
if ( ret < 0 )
{
perror("libusb error");
return -1;
perror("error");
}
return 0;
return 0;
}

40
scripts/README.md Normal file

@ -0,0 +1,40 @@
# Bash Scripts #
I teared the notifier apart and placed the notifier's board inside my home server.
Due to its size, the RGB LED creates some interesting optical effects if you place it 2-4cm
behind the venting holes.
Here are some simple scripts that use various data to set the LED's color.
## mled-discomode ##
This script simply cycles through all available colors. I called it disco mode due to the optical
phenomena that take place as the light crosses the air vents.
## mled-cputemp ##
This script works really well for my machine. It uses the `sensors` program to get the CPU
temperature.
If the CPU is at or under the low threshold, the LED turns blue. If it is at or above the
high threshold, the LED turns red. If it is in the middle, it gets green.
It is actually very informative for the machine's state. You can easily detect CPU load.
## mled-iowait, mled-iowaitdetailed ##
My home server doesn't have any LEDs for HDD activity, though it has plenty of HDDs.
These two scripts attempt to make up for this shortcoming when I need some quick profiling of the machine.
They actually work better than common HDD activity LEDs because they are based on iowait percentage in one
second periods (adjustable).
`mled-iowait` has 3 levels, so you get only to set a low and a high threshold.
`mled-iowaitdetailed` has 6 levels of activity, so you can set 5 thresholds. Also below the lowest threshold,
it sets the notifier to off, which turns to be a good approach.

28
scripts/mled-cputemp Executable file

@ -0,0 +1,28 @@
#!/bin/bash
LOWTEMP=46
HIGHTEMP=53
REFRESHRATE=1
LEDCONTROLLER="/usr/bin/ledcontroller"
while (true); do
temperature="$(sensors|grep 'id 0'|sed -e 's/\.0.*//' -e 's/.*+//')"
if (( "$temperature" <= "$LOWTEMP" )); then
$LEDCONTROLLER blue;
elif (( "$temperature" < "$HIGHTEMP" )); then
$LEDCONTROLLER green;
else $LEDCONTROLLER red;
fi;
sleep "$REFRESHRATE";
done

@ -1,12 +1,12 @@
#!/bin/bash
REFRESHRATE=1
LEDCONTROLLER="./ledcontroller"
LEDCONTROLLER="/usr/bin/ledcontroller"
while (true); do
for discoColor in blue red green aqua purple yellow white; do
echo Set color $discoColor
$LEDCONTROLLER $discoColor
sleep "$REFRESHRATE"

70
scripts/mled-iowait Executable file

@ -0,0 +1,70 @@
#!/bin/bash
LOWTHRESHOLD="1.01"
HIGHTHRESHOLD="30.2"
REFRESHRATE=1
LEDCONTROLLER="/usr/bin/ledcontroller"
iostat -c "$REFRESHRATE" | while read iostatOutput; do
iowaitPercent="$(echo "$iostatOutput" | grep -vE "Linux|avg|^$" | awk '{print $4}')"
[ -z "$iowaitPercent" ] || \
if (( $(bc <<< "$iowaitPercent > $LOWTHRESHOLD") == 0 )); then
$LEDCONTROLLER blue
elif (( $(bc <<< "$iowaitPercent > $HIGHTHRESHOLD") == 0 )); then
$LEDCONTROLLER green
else
$LEDCONTROLLER red
fi
done
# This is an older version of the code, which used /proc/stats to do a similar job.
#iowaitCounter="$(grep 'cpu ' /proc/stat | cut -f 9 -d ' ')"
#$LEDCONTROLLER blue
#ledcolor="blue"
#
#while (true); do
#
# iowaitTemp="$(grep 'cpu ' /proc/stat | cut -f 9 -d ' ')"
#
## echo "iowaitCounter=$iowaitCounter, iowaitTemp=$iowaitTemp"
#
# if (( "$iowaitCounter" == "$iowaitTemp" )); then
#
# if [ "$ledcolor" != "blue" ]; then
#
# $LEDCONTROLLER blue
# ledcolor="blue"
#
# fi
#
# else
#
# iowaitCounter="$iowaitTemp"
#
# if [ "$ledcolor" != "red" ]; then
#
# $LEDCONTROLLER red;
# ledcolor="red"
#
# fi
#
# fi
#
# sleep "$REFRESHRATE";
#
#done

44
scripts/mled-iowaitdetailed Executable file

@ -0,0 +1,44 @@
#!/bin/bash
THRESH1="1.00"
THRESH2="5.00"
THRESH3="20.00"
THRESH4="40.00"
THRESH5="80.00"
REFRESHRATE=1
LEDCONTROLLER="/usr/bin/ledcontroller"
iostat -c "$REFRESHRATE" | while read iostatOutput; do
iowaitPercent="$(echo "$iostatOutput" | grep -vE "Linux|avg|^$" | awk '{print $4}')"
[ -z "$iowaitPercent" ] || \
if (( $(bc <<< "$iowaitPercent > $THRESH1") == 0 )); then
$LEDCONTROLLER off
elif (( $(bc <<< "$iowaitPercent > $THRESH2") == 0 )); then
$LEDCONTROLLER green
elif (( $(bc <<< "$iowaitPercent > $THRESH3") == 0 )); then
$LEDCONTROLLER aqua # blue and green
elif (( $(bc <<< "$iowaitPercent > $THRESH4") == 0 )); then
$LEDCONTROLLER blue
elif (( $(bc <<< "$iowaitPercent > $THRESH5") == 0 )); then
$LEDCONTROLLER purple # red and blue
else
$LEDCONTROLLER red
fi
done