Skip to content

Commit

Permalink
add packet parser for BLE
Browse files Browse the repository at this point in the history
  • Loading branch information
konachan700 committed Dec 13, 2018
1 parent c763874 commit 1498f2f
Show file tree
Hide file tree
Showing 7 changed files with 184 additions and 13 deletions.
124 changes: 124 additions & 0 deletions firmware/hw_version_0.2.1/comm/comm.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
#include "comm.h"

static void __mew_comm_reset(void);
static void __mew_comm_timeout_reset(void);

static uint8_t _mew_comm_buffer[MEW_COMM_BUF_MAX_SIZE];
static volatile uint32_t _mew_comm_buffer_counter = 0;
static volatile uint32_t _mew_comm_payload_length = 0;
static volatile uint32_t _mew_comm_payload_crc32 = 0;

static volatile uint32_t _mew_comm_driver_id = 0;
static volatile uint32_t _mew_comm_last_time = 0;

static uint8_t _mew_comm_payload[MEW_COMM_PAYLOAD_MAX_SIZE];
static volatile uint32_t _mew_comm_payload_present = 0;
static volatile uint32_t _mew_comm_last_error = 0;

static void __mew_comm_reset(void) {
_mew_comm_buffer_counter = 0;
_mew_comm_payload_crc32 = 0;
}

static void __mew_comm_timeout_reset(void) {
if ((_mew_comm_last_time > 0) && (_mew_comm_last_time < mew_get_millis()) && (_mew_comm_buffer_counter > 0)) {
_mew_comm_last_error = MEW_COMM_ERR_TIMEOUT;
__mew_comm_reset();
}
_mew_comm_last_time = mew_get_millis() + MEW_COMM_TIMEOUT_MS;
}

uint32_t mew_comm_is_payload_present(void) {
return _mew_comm_payload_present;
}

void mew_comm_get_payload(uint8_t* payload, uint32_t* length) {
*length = _mew_comm_payload_length;
memcpy(payload, _mew_comm_payload, _mew_comm_payload_length);
_mew_comm_payload_present = 0;
_mew_comm_payload_length = 0;
}

void mew_comm_add_byte(uint32_t driver_id, uint8_t b) {
uint32_t current_crc32;

// если в буфере данных что-то есть - больше ничего с порта не принимаем, пока данные не заберут
if (_mew_comm_payload_present == 1) {
_mew_comm_last_error = MEW_COMM_ERR_BISY;
__mew_comm_reset();
return;
}

// очистка буфера по таймауту, чтобы данные не залеживались =)
__mew_comm_timeout_reset();

// защита от перемешивания байт с разных источников, на всякий случай
if (driver_id != _mew_comm_driver_id) {
_mew_comm_last_error = MEW_COMM_ERR_DRIVER_COLLISION;
__mew_comm_reset();
_mew_comm_driver_id = driver_id;
return;
}

_mew_comm_buffer[_mew_comm_buffer_counter] = b;

// если буфер пустой - ничего не делаем
if (_mew_comm_buffer_counter < 2) {
return;
}

// если в буфере нет магического числа - очищаем буфер
if ((_mew_comm_buffer_counter == 2) &&
((_mew_comm_buffer[0] != MEW_COMM_MAGIC_1) || (_mew_comm_buffer[1] != MEW_COMM_MAGIC_2))) {
_mew_comm_last_error = MEW_COMM_ERR_BAD_PACKAGE_MAGIC;
__mew_comm_reset();
return;
}

// проверяем длину полезной части - если она больше максимально разрешенной - очищаем буфер
if (_mew_comm_buffer_counter == 4) {
_mew_comm_payload_length = MEW_COMM_BYTES_TO_UINT16(_mew_comm_buffer[2], _mew_comm_buffer[3]);
if (_mew_comm_payload_length > MEW_COMM_PAYLOAD_MAX_SIZE) {
_mew_comm_last_error = MEW_COMM_ERR_BAD_PAYLOAD_SIZE;
__mew_comm_reset();
return;
}
}

// запоминаем контрольную сумму пакета
if (_mew_comm_buffer_counter == 8) {
_mew_comm_payload_crc32 = MEW_COMM_BYTES_TO_UINT32(_mew_comm_buffer[4], _mew_comm_buffer[5], _mew_comm_buffer[6], _mew_comm_buffer[7]);
}

// если длина буфера равна заголовку плюс полезным данным, проверяем контрольную сумму
if (_mew_comm_buffer_counter >= (_mew_comm_payload_length + 8)) {
current_crc32 = crc_calculate_block(_mew_comm_buffer + 8, _mew_comm_payload_length);
if (current_crc32 != _mew_comm_payload_crc32) {
_mew_comm_last_error = MEW_COMM_ERR_BAD_PAYLOAD_CRC32;
__mew_comm_reset();
return;
}

memcpy(_mew_comm_payload, _mew_comm_buffer + 8, _mew_comm_payload_length);
_mew_comm_payload_present = 1;
_mew_comm_last_error = 0;
__mew_comm_reset();
}

_mew_comm_buffer_counter++;
if (_mew_comm_buffer_counter >= MEW_COMM_BUF_MAX_SIZE) {
_mew_comm_last_error = MEW_COMM_ERR_BUFFER_OVERFLOW;
__mew_comm_reset();
return;
}
}

void mew_comm_handler(void) {
if (_mew_comm_last_error > 0) {

_mew_comm_last_error = 0;
}



}
33 changes: 33 additions & 0 deletions firmware/hw_version_0.2.1/comm/comm.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#ifndef COMM_H
#define COMM_H

#include "../config.h"
#include "../crypto/crypto.h"

#define MEW_COMM_MAGIC_1 0x43
#define MEW_COMM_MAGIC_2 0x77

#define MEW_COMM_TIMEOUT_MS 30
#define MEW_COMM_HEADER_MAX_SIZE 16 // 2 byte magic + 2 byte length + 4 byte crc32 + 8 bytes reserved
#define MEW_COMM_PAYLOAD_MAX_SIZE 1024
#define MEW_COMM_BUF_MAX_SIZE (MEW_COMM_PAYLOAD_MAX_SIZE + MEW_COMM_HEADER_MAX_SIZE)

#define MEW_COMM_BYTES_TO_UINT32(b1,b2,b3,b4) ((b1 << 24) + (b2 << 16) + (b3 << 8) + b4)
#define MEW_COMM_BYTES_TO_UINT16(b1,b2) ((b1 << 8) + b2)

#define MEW_COMM_ERR_DRIVER_COLLISION 0xE0
#define MEW_COMM_ERR_BAD_PACKAGE_MAGIC 0xE1
#define MEW_COMM_ERR_BAD_PAYLOAD_SIZE 0xE2
#define MEW_COMM_ERR_BAD_PAYLOAD_CRC32 0xE3
#define MEW_COMM_ERR_BUFFER_OVERFLOW 0xE4
#define MEW_COMM_ERR_BISY 0xE5
#define MEW_COMM_ERR_TIMEOUT 0xE6

uint32_t mew_comm_is_payload_present(void);

void mew_comm_handler(void);
void mew_comm_add_byte(uint32_t driver_id, uint8_t b);
void mew_comm_get_payload(uint8_t** payload, uint32_t* length);

#endif /* COMM_H */

2 changes: 2 additions & 0 deletions firmware/hw_version_0.2.1/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@

#define MEW_12BIT_SWAP(n) (((n & 0xFF) << 4) | (n >> 12))

#define MEW_SYSTICK_RELOAD_VALUE 168000

//#define ZRAM __attribute__((section (".zram")))

extern void mew_start_all_clock(void);
Expand Down
8 changes: 8 additions & 0 deletions firmware/hw_version_0.2.1/nbproject/configurations.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@
<in>bluetooth.h</in>
<in>bt_usart.c</in>
</df>
<df name="comm">
<in>comm.c</in>
<in>comm.h</in>
</df>
<df name="crypto">
<in>security_storage.c</in>
</df>
Expand Down Expand Up @@ -103,6 +107,10 @@
</item>
<item path="bluetooth/bt_usart.c" ex="false" tool="0" flavor2="0">
</item>
<item path="comm/comm.c" ex="false" tool="0" flavor2="0">
</item>
<item path="comm/comm.h" ex="false" tool="3" flavor2="0">
</item>
<item path="crypto/security_storage.c" ex="false" tool="0" flavor2="0">
</item>
<item path="debug/integration_tests.c" ex="false" tool="0" flavor2="0">
Expand Down
12 changes: 9 additions & 3 deletions firmware/hw_version_0.2.1/nbproject/private/configurations.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@
<in>bluetooth.h</in>
<in>bt_usart.c</in>
</df>
<df name="comm">
<in>comm.c</in>
<in>comm.h</in>
</df>
<df name="crypto">
<in>aes256.c</in>
<in>crypto.h</in>
Expand Down Expand Up @@ -44,9 +48,11 @@
<df name="lvgl">
</df>
<df name="ui">
<in>img_mew_logo.c</in>
<in>main_window.c</in>
<in>mew_logo.c</in>
<in>pinpad.c</in>
<in>password_window.c</in>
<in>passwords_window.c</in>
<in>pinpad_window.c</in>
<in>ui.c</in>
<in>ui.h</in>
</df>
Expand All @@ -65,7 +71,7 @@
<conf name="Default" type="0">
<toolsSet>
<developmentServer>localhost</developmentServer>
<platform>2</platform>
<platform>3</platform>
</toolsSet>
<compile>
<compiledirpicklist>
Expand Down
12 changes: 3 additions & 9 deletions firmware/hw_version_0.2.1/nbproject/private/private.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,9 @@
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="0"/>
<open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2">
<group>
<file>file:/C:/Users/Ilia_Baldin/Documents/devel/C/firmware/system.c</file>
<file>file:/C:/Users/Ilia_Baldin/Documents/devel/C/firmware/mew.c</file>
<file>file:/C:/Users/Ilia_Baldin/Documents/devel/C/firmware/display/ts_tsc2007.c</file>
<file>file:/C:/Users/Ilia_Baldin/Documents/devel/C/firmware/crypto/mew_passgen.c</file>
<file>file:/C:/Users/Ilia_Baldin/Documents/devel/C/firmware/config.h</file>
<file>file:/C:/Users/Ilia_Baldin/Documents/devel/C/firmware/flash/flash.c</file>
<file>file:/C:/Users/Ilia_Baldin/Documents/devel/C/firmware/crypto/crypto.h</file>
<file>file:/C:/Users/Ilia_Baldin/Documents/devel/C/firmware/display/display.c</file>
<file>file:/C:/Users/Ilia_Baldin/Documents/devel/C/firmware/display/ts_adc.c</file>
<file>file:/C:/Users/Ilia_Baldin/Documents/GitHub/Mew/firmware/hw_version_0.2.1/comm/comm.h</file>
<file>file:/C:/Users/Ilia_Baldin/Documents/GitHub/Mew/firmware/hw_version_0.2.1/comm/comm.c</file>
<file>file:/C:/Users/Ilia_Baldin/Documents/GitHub/Mew/firmware/hw_version_0.2.1/ui/main_window.c</file>
</group>
</open-files>
</project-private>
6 changes: 5 additions & 1 deletion firmware/hw_version_0.2.1/system.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@ void mew_delay_ms(uint32_t ms) {
while (expected_time > systick_millis) __asm__("NOP");
}

uint32_t mew_get_cpu_clock(void) {
return rcc_hse_8mhz_3v3[RCC_CLOCK_3V3_168MHZ].ahb_frequency;
}

void mew_start_all_clock(void) {
rcc_clock_setup_hse_3v3(&rcc_hse_8mhz_3v3[RCC_CLOCK_3V3_168MHZ]);

Expand Down Expand Up @@ -46,7 +50,7 @@ void mew_start_all_clock(void) {
}

void mew_systick_setup(void) {
systick_set_reload(168000);
systick_set_reload(MEW_SYSTICK_RELOAD_VALUE);
systick_set_clocksource(STK_CSR_CLKSOURCE_AHB);
systick_counter_enable();
systick_interrupt_enable();
Expand Down

0 comments on commit 1498f2f

Please sign in to comment.