Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 8 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ Features:
- [x] Stream Deck Original (untested)
- [x] Stream Deck Original V2
- [x] Stream Deck XL
- [x] Stream Deck Module 6Keys
- [x] Stream Deck Module 15Keys
- [x] Stream Deck Module 32Keys (untested)


## Getting started
Expand All @@ -50,8 +53,8 @@ Building requires `libusb` and `hidapi` packages.
`streamdeck-cli --help` displays available subcommands and options, passing `--help` to subcommands (ie. `streamdeck set-image --help`) displays options for that subcommand

```
streamdeck-cli 0.4.1
A CLI for the Elgato StreamDeck
streamdeck-cli 0.9.0
Helper object for filtering device connections

USAGE:
streamdeck-cli [OPTIONS] <SUBCOMMAND>
Expand All @@ -69,10 +72,11 @@ OPTIONS:
SUBCOMMANDS:
get-buttons Fetch button states
help Prints this message or the help of the given subcommand(s)
probe Search for connected streamdecks
reset Reset the attached device
set-brightness Set device display brightness
set-colour Set button colours
set-image Set button images
set-colour Simple Colour object for re-writing backgrounds etc
set-image Options for image loading and editing
version Fetch the device firmware version

```
Expand Down
4 changes: 2 additions & 2 deletions src/images.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use std::str::FromStr;

use image::codecs::jpeg::JpegEncoder;
use image::io::Reader;
use image::ImageReader;
use image::{imageops::FilterType, Pixel, Rgba};
use image::{DynamicImage, ExtendedColorType};

Expand Down Expand Up @@ -102,7 +102,7 @@ pub(crate) fn load_image(
colour_order: ColourOrder,
) -> Result<Vec<u8>, Error> {
// Open image reader
let reader = match Reader::open(path) {
let reader = match ImageReader::open(path) {
Ok(v) => v,
Err(e) => {
error!("error loading file '{}': {:?}", path, e);
Expand Down
49 changes: 33 additions & 16 deletions src/info.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ pub enum Kind {
Xl,
Mk2,
Plus,
Module6Keys,
Module15Keys,
Module32Keys,
}

/// Stream Deck key layout direction
Expand Down Expand Up @@ -56,6 +59,9 @@ impl Kind {
Kind::Mini | Kind::RevisedMini => 6,
Kind::Xl => 32,
Kind::Plus => 8,
Kind::Module6Keys => 6,
Kind::Module15Keys => 15,
Kind::Module32Keys => 32,
}
}

Expand All @@ -67,6 +73,9 @@ impl Kind {
Kind::Mini | Kind::RevisedMini => 0,
Kind::Xl => 3,
Kind::Plus => 3,
Kind::Module6Keys => 1,
Kind::Module15Keys => 3,
Kind::Module32Keys => 3,
}
}

Expand All @@ -86,40 +95,41 @@ impl Kind {

pub(crate) fn key_columns(&self) -> u8 {
match self {
Kind::Mini | Kind::RevisedMini => 3,
Kind::Original | Kind::OriginalV2 | Kind::Mk2 => 5,
Kind::Xl => 8,
Kind::Mini | Kind::RevisedMini | Kind::Module6Keys => 3,
Kind::Original | Kind::OriginalV2 | Kind::Mk2 | Kind::Module15Keys => 5,
Kind::Xl | Kind::Module32Keys => 8,
Kind::Plus => 4,
}
}

pub fn image_mode(&self) -> ImageMode {
match self {
Kind::Original | Kind::Mini | Kind::RevisedMini => ImageMode::Bmp,
Kind::OriginalV2 | Kind::Xl | Kind::Mk2 | Kind::Plus => ImageMode::Jpeg,
Kind::Original | Kind::Mini | Kind::RevisedMini | Kind::Module6Keys => ImageMode::Bmp,
Kind::OriginalV2 | Kind::Xl | Kind::Mk2 | Kind::Plus | Kind::Module15Keys | Kind::Module32Keys => ImageMode::Jpeg,
}
}

pub fn image_size(&self) -> (usize, usize) {
match self {
Kind::Original | Kind::OriginalV2 | Kind::Mk2 => (72, 72),
Kind::Mini | Kind::RevisedMini => (80, 80),
Kind::Xl => (96, 96),
Kind::Original | Kind::OriginalV2 | Kind::Mk2 | Kind::Module15Keys => (72, 72),
Kind::Mini | Kind::RevisedMini | Kind::Module6Keys => (80, 80),
Kind::Xl | Kind::Module32Keys => (96, 96),
Kind::Plus => (120, 120),
}
}

pub fn image_rotation(&self) -> Rotation {
match self {
Kind::Mini | Kind::RevisedMini => Rotation::Rot270,
Kind::Mini | Kind::RevisedMini | Kind::Module6Keys => Rotation::Rot270,
Kind::Module15Keys | Kind::Module32Keys => Rotation::Rot180,
_ => Rotation::Rot0,
}
}

pub fn image_mirror(&self) -> Mirroring {
match self {
// Mini has rotation, not mirror
Kind::Mini | Kind::RevisedMini | Kind::Plus => Mirroring::None,
Kind::Mini | Kind::RevisedMini | Kind::Plus | Kind::Module6Keys | Kind::Module15Keys | Kind::Module32Keys => Mirroring::None,
// On the original the image is flipped across the Y axis
Kind::Original => Mirroring::Y,
// On the V2 devices, both X and Y need to flip
Expand All @@ -141,25 +151,25 @@ impl Kind {

pub(crate) fn image_report_header_len(&self) -> usize {
match self {
Kind::Original | Kind::Mini | Kind::RevisedMini => 16,
Kind::OriginalV2 | Kind::Xl | Kind::Mk2 | Kind::Plus => 8,
Kind::Original | Kind::Mini | Kind::RevisedMini | Kind::Module6Keys => 16,
Kind::OriginalV2 | Kind::Xl | Kind::Mk2 | Kind::Plus | Kind::Module15Keys | Kind::Module32Keys => 8
}
}

pub fn image_base(&self) -> &[u8] {
match self {
// BMP headers for the original and mini
Kind::Original => &ORIGINAL_IMAGE_BASE,
Kind::Mini | Kind::RevisedMini => &MINI_IMAGE_BASE,
Kind::Mini | Kind::RevisedMini | Kind::Module6Keys => &MINI_IMAGE_BASE,

Kind::OriginalV2 | Kind::Xl | Kind::Mk2 | Kind::Plus => &[],
Kind::OriginalV2 | Kind::Xl | Kind::Mk2 | Kind::Plus | Kind::Module15Keys | Kind::Module32Keys => &[],
}
}

pub(crate) fn image_colour_order(&self) -> ColourOrder {
match self {
Kind::Original | Kind::Mini | Kind::RevisedMini => ColourOrder::BGR,
Kind::OriginalV2 | Kind::Xl | Kind::Mk2 | Kind::Plus => ColourOrder::RGB,
Kind::Original | Kind::Mini | Kind::RevisedMini | Kind::Module6Keys => ColourOrder::BGR,
Kind::OriginalV2 | Kind::Xl | Kind::Mk2 | Kind::Plus | Kind::Module15Keys | Kind::Module32Keys => ColourOrder::RGB,
}
}

Expand All @@ -169,6 +179,13 @@ impl Kind {
_ => false,
}
}

pub(crate) fn is_module(&self) -> bool {
match self {
Kind::Module6Keys | Kind::Module15Keys | Kind::Module32Keys => true,
_ => false,
}
}
}

pub const ORIGINAL_IMAGE_BASE: [u8; 54] = [
Expand Down
Loading