blob: 32658f068217d842e29b6d0c7b7cd9c0eda95d47 [file] [log] [blame]
// Copyright 2022 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef LIBEC_RGB_KEYBOARD_COMMAND_H_
#define LIBEC_RGB_KEYBOARD_COMMAND_H_
#include <algorithm>
#include <memory>
#include <vector>
#include <base/memory/ptr_util.h>
#include <brillo/brillo_export.h>
#include "libec/ec_command.h"
#include "libec/rgb_keyboard_params.h"
namespace ec {
class BRILLO_EXPORT RgbkbdSetColorCommand
: public EcCommand<rgb_keyboard::Params, EmptyParam> {
public:
// <start_key> is the first ID of the keys whose colors will be changed to the
// colors specified by <color>.
explicit RgbkbdSetColorCommand(uint8_t start_key = 0,
const std::vector<struct rgb_s>& color = {})
: EcCommand(EC_CMD_RGBKBD_SET_COLOR, 0) {
Req()->req.start_key = start_key;
Req()->req.length = color.size();
std::copy(color.begin(), color.end(), Req()->color.begin());
SetReqSize(sizeof(rgb_keyboard::Header) +
Req()->color.size() * sizeof(Req()->color[0]));
}
~RgbkbdSetColorCommand() override = default;
};
static_assert(!std::is_copy_constructible<RgbkbdSetColorCommand>::value,
"EcCommands are not copyable by default");
static_assert(!std::is_copy_assignable<RgbkbdSetColorCommand>::value,
"EcCommands are not copy-assignable by default");
class BRILLO_EXPORT RgbkbdCommand
: public EcCommand<struct ec_params_rgbkbd, EmptyParam> {
public:
template <typename T = RgbkbdCommand>
static std::unique_ptr<T> Create(enum ec_rgbkbd_subcmd subcmd,
struct rgb_s color) {
static_assert(std::is_base_of<RgbkbdCommand, T>::value,
"Only classes derived from RgbkbdCommand can use Create");
if (subcmd < 0 || subcmd >= EC_RGBKBD_SUBCMD_COUNT) {
return nullptr;
}
return base::WrapUnique(new T(subcmd, color));
}
~RgbkbdCommand() override = default;
protected:
RgbkbdCommand(enum ec_rgbkbd_subcmd subcmd, struct rgb_s color)
: EcCommand(EC_CMD_RGBKBD, 0) {
Req()->subcmd = subcmd;
Req()->color = color;
}
};
static_assert(!std::is_copy_constructible<RgbkbdCommand>::value,
"EcCommands are not copyable by default");
static_assert(!std::is_copy_assignable<RgbkbdCommand>::value,
"EcCommands are not copy-assignable by default");
} // namespace ec
#endif // LIBEC_RGB_KEYBOARD_COMMAND_H_