You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

62 lines
2.1 KiB

/*
* LedCommand.cpp
*
* Created on: Jul 16, 2021
* Author: Andreas Berthoud
*/
#include "LedCommand.hpp"
#include "commands.h"
#include "stm32wbxx_hal.h"
#include "main.h"
LedResponse::LedResponse(com_channel_type_t com_channel_type, uint16_t response_identifier, bool was_successful)
: Response(com_channel_type, response_identifier) {
(this->payload_ptr + this->get_payload_size())[0] = (uint8_t)was_successful;
this->add_to_payload_size(1);
}
LedRequest::LedRequest(com_channel_type_t com_channel_type, uint8_t * payload_ptr, uint16_t size)
: Request(com_channel_type, payload_ptr, size) {
uint16_t expected_length = this->buffer_offset + 2;
if (expected_length != size) {
//log_error("LedCommand: received request with length %d, expected length %d", 2, size, expected_length);
this->has_error = true;
return;
}
uint8_t * data_ptr = payload_ptr + this->buffer_offset;
this->led_id = static_cast<LedID>(data_ptr[0]);
this->led_command = static_cast<LedCommand>(data_ptr[1]);
}
LedResponse * LedRequest::execute_request(com_channel_type_t com_channel_type, uint16_t response_identifier) {
bool was_successful = true;
int led_pin_mapping[3] = {LED_GREEN_Pin, LED_RED_Pin, LED_BLUE_Pin};
GPIO_TypeDef* led_prio_port_mapping[3] = {LED_GREEN_GPIO_Port, LED_RED_GPIO_Port, LED_BLUE_GPIO_Port};
if (led_id >= led_id_max) {
//log_error("LedCommand: invalid LED ID %d", 1, led_id);
was_successful = false;
} else {
switch (this->led_command)
{
case led_off:
HAL_GPIO_WritePin(led_prio_port_mapping[led_id], led_pin_mapping[led_id], GPIO_PIN_RESET);
break;
case led_on:
HAL_GPIO_WritePin(led_prio_port_mapping[led_id], led_pin_mapping[led_id], GPIO_PIN_SET);
break;
case led_toggle:
HAL_GPIO_TogglePin(led_prio_port_mapping[led_id], led_pin_mapping[led_id]);
break;
default:
//log_error("LedCommand: invalid LED command %d", 1, this->led_id);
was_successful = false;
break;
}
}
return new LedResponse(com_channel_type, response_identifier, was_successful);
}