command: Don't pass max_size to command_encodef()
The command_encodef() can read the max_size parameter directly from the 'struct command_encoder' passed into it. Also, there is no need to check that a message will fit in a buffer if the buffer is declared to be MESSAGE_MAX in size. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
parent
f3da473285
commit
f8bd8b97be
|
@ -1,6 +1,6 @@
|
||||||
// AVR serial port code.
|
// AVR serial port code.
|
||||||
//
|
//
|
||||||
// Copyright (C) 2016 Kevin O'Connor <kevin@koconnor.net>
|
// Copyright (C) 2016,2017 Kevin O'Connor <kevin@koconnor.net>
|
||||||
//
|
//
|
||||||
// This file may be distributed under the terms of the GNU GPLv3 license.
|
// This file may be distributed under the terms of the GNU GPLv3 license.
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@
|
||||||
#include <string.h> // memmove
|
#include <string.h> // memmove
|
||||||
#include "autoconf.h" // CONFIG_SERIAL_BAUD
|
#include "autoconf.h" // CONFIG_SERIAL_BAUD
|
||||||
#include "board/io.h" // readb
|
#include "board/io.h" // readb
|
||||||
#include "board/misc.h" // console_get_input
|
#include "board/misc.h" // console_sendf
|
||||||
#include "command.h" // DECL_CONSTANT
|
#include "command.h" // DECL_CONSTANT
|
||||||
#include "irq.h" // irq_save
|
#include "irq.h" // irq_save
|
||||||
#include "pgm.h" // READP
|
#include "pgm.h" // READP
|
||||||
|
@ -161,7 +161,7 @@ console_sendf(const struct command_encoder *ce, va_list args)
|
||||||
|
|
||||||
// Generate message
|
// Generate message
|
||||||
char *buf = &transmit_buf[tmax];
|
char *buf = &transmit_buf[tmax];
|
||||||
uint8_t msglen = command_encodef(buf, max_size, ce, args);
|
uint8_t msglen = command_encodef(buf, ce, args);
|
||||||
command_add_frame(buf, msglen);
|
command_add_frame(buf, msglen);
|
||||||
|
|
||||||
// Start message transmit
|
// Start message transmit
|
||||||
|
|
|
@ -1,20 +1,17 @@
|
||||||
// Wrappers for AVR usb serial.
|
// Wrappers for AVR usb serial.
|
||||||
//
|
//
|
||||||
// Copyright (C) 2016 Kevin O'Connor <kevin@koconnor.net>
|
// Copyright (C) 2016,2017 Kevin O'Connor <kevin@koconnor.net>
|
||||||
//
|
//
|
||||||
// This file may be distributed under the terms of the GNU GPLv3 license.
|
// This file may be distributed under the terms of the GNU GPLv3 license.
|
||||||
|
|
||||||
#include <avr/interrupt.h> // USART0_RX_vect
|
|
||||||
#include <string.h> // memmove
|
#include <string.h> // memmove
|
||||||
#include "../lib/pjrc_usb_serial/usb_serial.h"
|
#include "../lib/pjrc_usb_serial/usb_serial.h"
|
||||||
|
#include "board/misc.h" // console_sendf
|
||||||
#include "command.h" // command_dispatch
|
#include "command.h" // command_dispatch
|
||||||
#include "pgm.h" // READP
|
|
||||||
#include "sched.h" // DECL_INIT
|
#include "sched.h" // DECL_INIT
|
||||||
|
|
||||||
#define USBSERIAL_BUFFER_SIZE 64
|
static char receive_buf[MESSAGE_MAX];
|
||||||
static char receive_buf[USBSERIAL_BUFFER_SIZE];
|
|
||||||
static uint8_t receive_pos;
|
static uint8_t receive_pos;
|
||||||
static char transmit_buf[USBSERIAL_BUFFER_SIZE];
|
|
||||||
|
|
||||||
void
|
void
|
||||||
usbserial_init(void)
|
usbserial_init(void)
|
||||||
|
@ -68,13 +65,11 @@ void
|
||||||
console_sendf(const struct command_encoder *ce, va_list args)
|
console_sendf(const struct command_encoder *ce, va_list args)
|
||||||
{
|
{
|
||||||
// Generate message
|
// Generate message
|
||||||
uint8_t max_size = READP(ce->max_size);
|
static char buf[MESSAGE_MAX];
|
||||||
if (max_size > sizeof(transmit_buf))
|
uint8_t msglen = command_encodef(buf, ce, args);
|
||||||
return;
|
command_add_frame(buf, msglen);
|
||||||
uint8_t msglen = command_encodef(transmit_buf, max_size, ce, args);
|
|
||||||
command_add_frame(transmit_buf, msglen);
|
|
||||||
|
|
||||||
// Transmit message
|
// Transmit message
|
||||||
usb_serial_write((void*)transmit_buf, msglen);
|
usb_serial_write((void*)buf, msglen);
|
||||||
usb_serial_flush_output();
|
usb_serial_flush_output();
|
||||||
}
|
}
|
||||||
|
|
|
@ -94,14 +94,14 @@ error:
|
||||||
|
|
||||||
// Encode a message
|
// Encode a message
|
||||||
uint8_t
|
uint8_t
|
||||||
command_encodef(char *buf, uint8_t buf_len
|
command_encodef(char *buf, const struct command_encoder *ce, va_list args)
|
||||||
, const struct command_encoder *ce, va_list args)
|
|
||||||
{
|
{
|
||||||
if (buf_len <= MESSAGE_MIN)
|
uint8_t max_size = READP(ce->max_size);
|
||||||
|
if (max_size <= MESSAGE_MIN)
|
||||||
// Ack/Nak message
|
// Ack/Nak message
|
||||||
return buf_len;
|
return max_size;
|
||||||
char *p = &buf[MESSAGE_HEADER_SIZE];
|
char *p = &buf[MESSAGE_HEADER_SIZE];
|
||||||
char *maxend = &p[buf_len - MESSAGE_MIN];
|
char *maxend = &p[max_size - MESSAGE_MIN];
|
||||||
uint8_t num_params = READP(ce->num_params);
|
uint8_t num_params = READP(ce->num_params);
|
||||||
const uint8_t *param_types = READP(ce->param_types);
|
const uint8_t *param_types = READP(ce->param_types);
|
||||||
*p++ = READP(ce->msg_id);
|
*p++ = READP(ce->msg_id);
|
||||||
|
|
|
@ -63,8 +63,8 @@ enum {
|
||||||
// command.c
|
// command.c
|
||||||
char *command_parsef(char *p, char *maxend
|
char *command_parsef(char *p, char *maxend
|
||||||
, const struct command_parser *cp, uint32_t *args);
|
, const struct command_parser *cp, uint32_t *args);
|
||||||
uint8_t command_encodef(char *buf, uint8_t buf_len
|
uint8_t command_encodef(char *buf, const struct command_encoder *ce
|
||||||
, const struct command_encoder *ce, va_list args);
|
, va_list args);
|
||||||
void command_sendf(const struct command_encoder *ce, ...);
|
void command_sendf(const struct command_encoder *ce, ...);
|
||||||
void command_add_frame(char *buf, uint8_t msglen);
|
void command_add_frame(char *buf, uint8_t msglen);
|
||||||
int8_t command_find_block(char *buf, uint8_t buf_len, uint8_t *pop_count);
|
int8_t command_find_block(char *buf, uint8_t buf_len, uint8_t *pop_count);
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
// Local definitions for PRU code
|
// Local definitions for PRU code
|
||||||
|
|
||||||
#include <stdint.h> // uint32_t
|
#include <stdint.h> // uint32_t
|
||||||
|
#include "command.h" // MESSAGE_MAX
|
||||||
|
|
||||||
#define IEP_EVENT 7
|
#define IEP_EVENT 7
|
||||||
#define KICK_ARM_EVENT 16
|
#define KICK_ARM_EVENT 16
|
||||||
|
@ -24,7 +25,7 @@
|
||||||
// Layout of shared memory
|
// Layout of shared memory
|
||||||
struct shared_response_buffer {
|
struct shared_response_buffer {
|
||||||
uint32_t count;
|
uint32_t count;
|
||||||
char data[64];
|
char data[MESSAGE_MAX];
|
||||||
};
|
};
|
||||||
struct shared_mem {
|
struct shared_mem {
|
||||||
uint32_t signal;
|
uint32_t signal;
|
||||||
|
|
|
@ -135,14 +135,13 @@ void
|
||||||
console_sendf(const struct command_encoder *ce, va_list args)
|
console_sendf(const struct command_encoder *ce, va_list args)
|
||||||
{
|
{
|
||||||
// Verify space for message
|
// Verify space for message
|
||||||
uint32_t max_size = ce->max_size;
|
|
||||||
uint32_t send_push_pos = SHARED_MEM->send_push_pos;
|
uint32_t send_push_pos = SHARED_MEM->send_push_pos;
|
||||||
struct shared_response_buffer *s = &SHARED_MEM->send_data[send_push_pos];
|
struct shared_response_buffer *s = &SHARED_MEM->send_data[send_push_pos];
|
||||||
if (max_size > sizeof(s->data) || readl(&s->count))
|
if (readl(&s->count))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Generate message
|
// Generate message
|
||||||
uint32_t msglen = command_encodef(s->data, max_size, ce, args);
|
uint32_t msglen = command_encodef(s->data, ce, args);
|
||||||
|
|
||||||
// Signal PRU0 to transmit message
|
// Signal PRU0 to transmit message
|
||||||
writel(&s->count, msglen);
|
writel(&s->count, msglen);
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// sam3x8e serial port
|
// sam3x8e serial port
|
||||||
//
|
//
|
||||||
// Copyright (C) 2016 Kevin O'Connor <kevin@koconnor.net>
|
// Copyright (C) 2016,2017 Kevin O'Connor <kevin@koconnor.net>
|
||||||
//
|
//
|
||||||
// This file may be distributed under the terms of the GNU GPLv3 license.
|
// This file may be distributed under the terms of the GNU GPLv3 license.
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@
|
||||||
#include "board/gpio.h" // gpio_peripheral
|
#include "board/gpio.h" // gpio_peripheral
|
||||||
#include "board/io.h" // readl
|
#include "board/io.h" // readl
|
||||||
#include "board/irq.h" // irq_save
|
#include "board/irq.h" // irq_save
|
||||||
#include "board/misc.h" // console_get_input
|
#include "board/misc.h" // console_sendf
|
||||||
#include "command.h" // DECL_CONSTANT
|
#include "command.h" // DECL_CONSTANT
|
||||||
#include "sam3x8e.h" // UART
|
#include "sam3x8e.h" // UART
|
||||||
#include "sched.h" // DECL_INIT
|
#include "sched.h" // DECL_INIT
|
||||||
|
@ -152,7 +152,7 @@ console_sendf(const struct command_encoder *ce, va_list args)
|
||||||
|
|
||||||
// Generate message
|
// Generate message
|
||||||
char *buf = &transmit_buf[tmax];
|
char *buf = &transmit_buf[tmax];
|
||||||
uint32_t msglen = command_encodef(buf, max_size, ce, args);
|
uint32_t msglen = command_encodef(buf, ce, args);
|
||||||
command_add_frame(buf, msglen);
|
command_add_frame(buf, msglen);
|
||||||
|
|
||||||
// Start message transmit
|
// Start message transmit
|
||||||
|
|
Loading…
Reference in New Issue