zwischenstand
This commit is contained in:
@@ -35,6 +35,7 @@ enum buzz_data_type
|
||||
BUZZ_DATA_PROTO_INFO = 0x01,
|
||||
BUZZ_DATA_DEVICE_INFO = 0x02,
|
||||
BUZZ_DATA_FS_INFO = 0x03,
|
||||
BUZZ_DATA_FW_INFO = 0x04,
|
||||
|
||||
BUZZ_DATA_FILE_GET = 0x20,
|
||||
BUZZ_DATA_FILE_PUT = 0x21,
|
||||
@@ -42,7 +43,7 @@ enum buzz_data_type
|
||||
BUZZ_DATA_TAGS_PUT = 0x23,
|
||||
BUZZ_DATA_RM_FILE = 0x24,
|
||||
BUZZ_DATA_RENAME_FILE = 0x25,
|
||||
|
||||
|
||||
BUZZ_DATA_FW_UPDATE = 0x30,
|
||||
|
||||
BUZZ_DATA_LS = 0x40,
|
||||
@@ -88,6 +89,17 @@ struct __attribute__((packed)) buzz_resp_proto_version
|
||||
uint16_t max_chunk_size; /* Little Endian */
|
||||
};
|
||||
|
||||
/* Payload für die Geräteinformationen */
|
||||
struct __attribute__((packed)) buzz_resp_device_info
|
||||
{
|
||||
uint8_t data_type; /* BUZZ_DATA_DEVICE_INFO */
|
||||
uint8_t device_id[8]; /* EUI64 oder ähnliche eindeutige ID */
|
||||
uint8_t board_name_length; /* Länge des Board-Namens */
|
||||
uint8_t board_revision_length; /* Länge der Board-Revision */
|
||||
uint8_t soc_name_length; /* Länge des SOC-Namens */
|
||||
char data[]; /* Variabler String ohne Null-Terminierung: [board_name][board_revision][soc_name] */
|
||||
};
|
||||
|
||||
/* Payload für die Dateisystem-Informationen */
|
||||
struct __attribute__((packed)) buzz_resp_fs_info
|
||||
{
|
||||
@@ -100,6 +112,16 @@ struct __attribute__((packed)) buzz_resp_fs_info
|
||||
uint8_t data[]; /* Pfadnamen */
|
||||
};
|
||||
|
||||
/* Payload für die Firmware-Infos */
|
||||
struct __attribute__((packed)) buzz_resp_fw_info
|
||||
{
|
||||
uint8_t data_type; /* BUZZ_DATA_FW_INFO */
|
||||
uint8_t fw_status; /* fw_state_t */
|
||||
uint32_t slot1_size; /* Größe des Slot1-Partitionsbereichs (Little Endian) */
|
||||
uint8_t fw_version_length; /* Länge der Firmware-Versionszeichenkette */
|
||||
uint8_t kernel_version_length; /* Länge der Kernel-Versionszeichenkette */
|
||||
char data[]; /* Variabler String ohne Null-Terminierung: [fw_version][kernel_version] */
|
||||
};
|
||||
/* Payload für das Entfernen einer Datei */
|
||||
struct __attribute__((packed)) buzz_rm_file_payload
|
||||
{
|
||||
@@ -171,7 +193,6 @@ void buzz_proto_buf_free(uint8_t **buf);
|
||||
/* Übergabe eines empfangenen Frames an den Protokoll-Thread */
|
||||
int buzz_proto_submit_frame(struct buzz_frame_msg *msg);
|
||||
|
||||
|
||||
/* Gibt die Anzahl der freien Slabs zurück (abzüglich Reserve) */
|
||||
uint16_t buzz_proto_get_free_rx_slabs(void);
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
|
||||
#include "buzz_proto.h"
|
||||
#include "fs_mgmt.h"
|
||||
#include "fw_mgmt.h"
|
||||
|
||||
LOG_MODULE_REGISTER(buzz_proto, CONFIG_BUZZ_PROTO_LOG_LEVEL);
|
||||
K_MEM_SLAB_DEFINE(buzz_proto_slabs, CONFIG_BUZZ_PROTO_SLAB_SIZE, CONFIG_BUZZ_PROTO_SLAB_COUNT, 4);
|
||||
@@ -172,7 +173,7 @@ static void handle_proto_version_request(struct buzz_frame_msg *msg)
|
||||
resp_data->data_type = BUZZ_DATA_PROTO_INFO;
|
||||
resp_data->version = sys_cpu_to_le16(BUZZ_PROTO_VERSION);
|
||||
|
||||
/* Dynamische Chunk-Größe basierend auf der aktuellen Transport-MTU berechnen */
|
||||
/* Dynamische Chunk-Grösse basierend auf der aktuellen Transport-MTU berechnen */
|
||||
uint16_t slab_payload = CONFIG_BUZZ_PROTO_SLAB_SIZE - sizeof(struct buzz_proto_header);
|
||||
uint16_t transport_payload = 0;
|
||||
|
||||
@@ -192,6 +193,34 @@ static void handle_proto_version_request(struct buzz_frame_msg *msg)
|
||||
}
|
||||
}
|
||||
|
||||
void handle_device_info_request(struct buzz_frame_msg *msg) {
|
||||
struct buzz_proto_header *hdr = (struct buzz_proto_header *)msg->data_ptr;
|
||||
hdr->frame_type = BUZZ_FRAME_RESPONSE;
|
||||
struct buzz_resp_device_info *resp_data = (struct buzz_resp_device_info *)(msg->data_ptr + sizeof(*hdr));
|
||||
resp_data->data_type = BUZZ_DATA_DEVICE_INFO;
|
||||
if (fw_mgmt_get_id(resp_data->device_id, sizeof(resp_data->device_id)) < 0) {
|
||||
LOG_ERR("Failed to get device ID");
|
||||
send_error_frame(msg, EIO);
|
||||
return;
|
||||
}
|
||||
const char *board_name = fw_mgmt_get_board_name();
|
||||
const char *board_rev = fw_mgmt_get_board_revision();
|
||||
const char *soc_name = fw_mgmt_get_soc_name();
|
||||
resp_data->board_name_length = MIN(strlen(board_name), 32); // Sicherheitsmassnahme gegen zu lange Namen
|
||||
resp_data->board_revision_length = MIN(strlen(board_rev), 32); // Sicherheitsmassnahme gegen zu lange Namen
|
||||
resp_data->soc_name_length = MIN(strlen(soc_name), 32); // Sicherheitsmassnahme gegen zu lange Namen
|
||||
memcpy(resp_data->data, board_name, resp_data->board_name_length);
|
||||
memcpy(resp_data->data + resp_data->board_name_length, board_rev, resp_data->board_revision_length);
|
||||
memcpy(resp_data->data + resp_data->board_name_length + resp_data->board_revision_length, soc_name, resp_data->soc_name_length);
|
||||
uint16_t payload_length = sizeof(struct buzz_resp_device_info) + resp_data->board_name_length + resp_data->board_revision_length + resp_data->soc_name_length;
|
||||
hdr->payload_length = sys_cpu_to_le16(payload_length);
|
||||
uint16_t total_len = sizeof(struct buzz_proto_header) + payload_length;
|
||||
if (msg->reply_cb)
|
||||
{
|
||||
msg->reply_cb(msg->data_ptr, total_len);
|
||||
}
|
||||
}
|
||||
|
||||
void handle_fs_info_request(struct buzz_frame_msg *msg)
|
||||
{
|
||||
struct buzz_proto_header *hdr = (struct buzz_proto_header *)msg->data_ptr;
|
||||
@@ -234,6 +263,36 @@ void handle_fs_info_request(struct buzz_frame_msg *msg)
|
||||
}
|
||||
}
|
||||
|
||||
static void handle_fw_info_request(struct buzz_frame_msg *msg)
|
||||
{
|
||||
struct buzz_proto_header *hdr = (struct buzz_proto_header *)msg->data_ptr;
|
||||
|
||||
hdr->frame_type = BUZZ_FRAME_RESPONSE;
|
||||
|
||||
struct buzz_resp_fw_info *resp_data = (struct buzz_resp_fw_info *)(msg->data_ptr + sizeof(*hdr));
|
||||
|
||||
resp_data->data_type = BUZZ_DATA_FW_INFO;
|
||||
resp_data->fw_status = fw_mgmt_get_fw_state();
|
||||
resp_data->slot1_size = sys_cpu_to_le32(fw_mgmt_get_slot1_size());
|
||||
|
||||
const char *fw_version = fw_mgmt_get_fw_version_string();
|
||||
const char *kernel_version = fw_mgmt_get_kernel_version_string();
|
||||
resp_data->fw_version_length = MIN(strlen(fw_version), 32); // Sicherheitsmassnahme gegen zu lange Strings
|
||||
resp_data->kernel_version_length = MIN(strlen(kernel_version), 32); // Sicherheitsmassnahme gegen zu lange Strings
|
||||
memcpy(resp_data->data, fw_version, resp_data->fw_version_length);
|
||||
memcpy(resp_data->data + resp_data->fw_version_length, kernel_version, resp_data->kernel_version_length);
|
||||
|
||||
uint16_t payload_length = sizeof(struct buzz_resp_fw_info) + resp_data->fw_version_length + resp_data->kernel_version_length;
|
||||
hdr->payload_length = sys_cpu_to_le16(payload_length);
|
||||
|
||||
uint16_t total_len = sizeof(struct buzz_proto_header) + payload_length;
|
||||
|
||||
if (msg->reply_cb)
|
||||
{
|
||||
msg->reply_cb(msg->data_ptr, total_len);
|
||||
}
|
||||
}
|
||||
|
||||
static void handle_ls_request(struct buzz_frame_msg *msg)
|
||||
{
|
||||
struct buzz_proto_header *hdr = (struct buzz_proto_header *)msg->data_ptr;
|
||||
@@ -619,6 +678,11 @@ static void handle_request(struct buzz_frame_msg *msg)
|
||||
handle_proto_version_request(msg);
|
||||
break;
|
||||
|
||||
case BUZZ_DATA_DEVICE_INFO:
|
||||
LOG_DBG("Received Device Info Request");
|
||||
handle_device_info_request(msg);
|
||||
break;
|
||||
|
||||
case BUZZ_DATA_FS_INFO:
|
||||
LOG_DBG("Received FS Info Request");
|
||||
handle_fs_info_request(msg);
|
||||
@@ -629,6 +693,11 @@ static void handle_request(struct buzz_frame_msg *msg)
|
||||
handle_ls_request(msg);
|
||||
break;
|
||||
|
||||
case BUZZ_DATA_FW_INFO:
|
||||
LOG_DBG("Received FW Info Request");
|
||||
handle_fw_info_request(msg);
|
||||
break;
|
||||
|
||||
case BUZZ_DATA_FILE_GET:
|
||||
LOG_DBG("Received FILE_GET Request");
|
||||
handle_file_get_request(msg, false);
|
||||
|
||||
Reference in New Issue
Block a user