diff --git a/protocol.c b/protocol.c new file mode 100644 --- /dev/null +++ b/protocol.c @@ -0,0 +1,104 @@ +#include "protocol.h" + + +bool protocol_receive_message(CanRxMsgTypeDef* can_message) +{ + bool result = true; + + protocol_message_t message; + message.command = can_message->Data[0] & 0x80; + message.id = can_message->Data[0] & 0x7F; + message.key = (can_message->Data[1] << 8) & can_message->Data[2]; + message.sensor = can_message->Data[3]; + message.data.byte_data[0] = can_message->Data[4]; + message.data.byte_data[1] = can_message->Data[5]; + message.data.byte_data[2] = can_message->Data[6]; + message.data.byte_data[3] = can_message->Data[7]; + + protocol_process_message(&message); + + return result; +} + +bool protocol_send_message(protocol_message_t* message) +{ + bool result = true; + uint8_t data[8]; + + data[0] = (message->command & 0x80) & (message->id & 0x7F); + data[1] = (message->key >> 8) & 0xFF; + data[2] = (message->key >> 0) & 0xFF; + data[3] = message->sensor; + data[4] = (message->data.byte_data[0] >> 24) & 0xFF; + data[5] = (message->data.byte_data[1] >> 16) & 0xFF; + data[6] = (message->data.byte_data[2] >> 8) & 0xFF; + data[7] = (message->data.byte_data[3] >> 0) & 0xFF; + + can_send(CAN_SEND_ID, CAN_ID_STD, 8, data); + + return result; +} + +bool protocol_process_message(protocol_message_t* message) +{ + bool result = true; + + if (message->command) + { + switch(message->id) + { + case ESTOP: + { + //call estop weak function + result = protocol_estop(message->data.float_data!=0.0f); + } + break; + case SILENCE_BUS: + { + //silence can bus + result = can_silence_bus(message->data.float_data!=0.0f); + } + break; + case SET_OUTPUT: + { + //call set output weak function + result = protocol_set_output(message); + } + break; + case GET_DATA: + { + //call get data weak function + result = protocol_get_data(message); + } + break; + case CONFIG: + { + //call config weak function + result = protocol_config(message); + } + break; + } + } + + return result; +} + +__weak bool protocol_estop(bool value) +{ + return false; +} + +__weak bool protocol_set_output(protocol_message_t* message) +{ + return false; +} + +__weak bool protocol_get_data(protocol_message_t* message) +{ + return false; +} + +__weak bool protocol_config(protocol_message_t* message) +{ + return false; +} diff --git a/protocol.h b/protocol.h new file mode 100644 --- /dev/null +++ b/protocol.h @@ -0,0 +1,61 @@ +#ifndef _PROTOCOL_H +#define _PROTOCOL_H + +#include + +#include "config.h" +#include "can.h" + +typedef struct { + bool command; + uint8_t id; + uint16_t key; + uint8_t sensor; + union { + float float_data; + uint8_t byte_data[4]; + } data; +} protocol_message_t; + +typedef enum { + ESTOP = 0x00, + SILENCE_BUS = 0x01, + SET_OUTPUT = 0X10, + GET_DATA = 0x11, + CONFIG = 0x12, + CALIBRATE = 0x13, +} protocol_command_t; + +typedef enum { + NONE = 0x0000, + DIGITAL_INPUT = 0x0001, + FREQ_INPUT = 0x0002, + ANALOG_INPUT = 0x0003, + DIGITAL_OUTPUT = 0x0004, + FREQ_OUTPUT = 0x0005, + ANALOG_OUTPUT = 0x0006, + AIR_TEMP = 0x0007, + AIR_HUMIDITY = 0x0008, + AIR_PRESSURE = 0x0009, + AMBIENT_LIGHT = 0x000A, + WATER_TEMP = 0x000B, + WATER_LEVEL = 0x000C, + WATER_CONDUCTIVITY = 0x000D, + WATER_PH = 0x000E, + CAN_ID = 0x0100, + DATA_RATE = 0x0101, + GPIO = 0x0102, + LED_BRIGHTNESS = 0x0103, +} protocol_data_key_t; + + +bool protocol_receive_message(CanRxMsgTypeDef* can_message); +bool protocol_send_message(protocol_message_t* message); +bool protocol_process_message(protocol_message_t* message); + +__weak bool protocol_estop(bool value); +__weak bool protocol_set_output(protocol_message_t* message); +__weak bool protocol_get_data(protocol_message_t* message); +__weak bool protocol_config(protocol_message_t* message); + +#endif //_PROTOCOL_H