Отладка WORK_parsePackage
This commit is contained in:
parent
14e71a3ccc
commit
bfe0df9256
30
.vscode/launch.json
vendored
Normal file
30
.vscode/launch.json
vendored
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "(gdb) Launch",
|
||||||
|
"type": "cppdbg",
|
||||||
|
"request": "launch",
|
||||||
|
"program": "${workspaceFolder}/build/bin/test-kod-bez",
|
||||||
|
"args": [],
|
||||||
|
"stopAtEntry": false,
|
||||||
|
"cwd": "${fileDirname}",
|
||||||
|
"environment": [],
|
||||||
|
"externalConsole": false,
|
||||||
|
"MIMode": "gdb",
|
||||||
|
"setupCommands": [
|
||||||
|
{
|
||||||
|
"description": "Enable pretty-printing for gdb",
|
||||||
|
"text": "-enable-pretty-printing",
|
||||||
|
"ignoreFailures": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "Set Disassembly Flavor to Intel",
|
||||||
|
"text": "-gdb-set disassembly-flavor intel",
|
||||||
|
"ignoreFailures": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"preLaunchTask": "CMake: build"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
18
.vscode/settings.json
vendored
Normal file
18
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"files.associations": {
|
||||||
|
"worker_type.h": "c",
|
||||||
|
"main.h": "c",
|
||||||
|
"stdio.h": "c",
|
||||||
|
"stdint.h": "c",
|
||||||
|
"stdbool.h": "c",
|
||||||
|
"unistd.h": "c",
|
||||||
|
"stdlib.h": "c",
|
||||||
|
"time.h": "c",
|
||||||
|
"hdlc_type.h": "c",
|
||||||
|
"hdlc.h": "c",
|
||||||
|
"fifo_type.h": "c",
|
||||||
|
"chrono": "c",
|
||||||
|
"span": "c",
|
||||||
|
"worker.h": "c"
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,12 +1,12 @@
|
|||||||
cmake_minimum_required(VERSION 4.1 FATAL_ERROR)
|
cmake_minimum_required(VERSION 4.1 FATAL_ERROR)
|
||||||
|
|
||||||
set(PROJECT_NAME testKodBez)
|
set(PROJECT_NAME test-kod-bez)
|
||||||
set(SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)
|
set(SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)
|
||||||
|
|
||||||
project(${PROJECT_NAME} LANGUAGES C)
|
project(${PROJECT_NAME} LANGUAGES C)
|
||||||
set(CMAKE_C_STANDARD 99)
|
set(CMAKE_C_STANDARD 11)
|
||||||
set(CMAKE_C_EXTENSIONS OFF)
|
|
||||||
set(CMAKE_C_STANDARD_REQUIRED ON)
|
set(CMAKE_C_STANDARD_REQUIRED ON)
|
||||||
|
set(CMAKE_C_EXTENSIONS OFF)
|
||||||
|
|
||||||
add_executable(${PROJECT_NAME} ${SOURCE_DIR}/main.c)
|
add_executable(${PROJECT_NAME} ${SOURCE_DIR}/main.c)
|
||||||
|
|
||||||
@ -29,6 +29,9 @@ set(SOURCES
|
|||||||
)
|
)
|
||||||
|
|
||||||
target_include_directories(${PROJECT_NAME} PRIVATE ${HEADERS})
|
target_include_directories(${PROJECT_NAME} PRIVATE ${HEADERS})
|
||||||
|
# target_compile_definitions(${PROJECT_NAME} PRIVATE __USE_POSIX199309 __USE_ISOC11)
|
||||||
|
target_compile_definitions(${PROJECT_NAME} PRIVATE _POSIX_C_SOURCE=199309L _ISOC11_SOURCE)
|
||||||
|
|
||||||
target_sources(${PROJECT_NAME} PRIVATE ${SOURCES})
|
target_sources(${PROJECT_NAME} PRIVATE ${SOURCES})
|
||||||
|
|
||||||
set_target_properties(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "bin")
|
set_target_properties(${PROJECT_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "bin")
|
||||||
|
|||||||
@ -1 +1,2 @@
|
|||||||
#include "fifo.h"
|
#include "fifo.h"
|
||||||
|
|
||||||
|
|||||||
@ -4,4 +4,5 @@
|
|||||||
|
|
||||||
#include "fifo_type.h"
|
#include "fifo_type.h"
|
||||||
|
|
||||||
|
|
||||||
#endif // FIFO_H
|
#endif // FIFO_H
|
||||||
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
// Структура FIFO
|
// Структура состояний FIFO
|
||||||
typedef enum {
|
typedef enum {
|
||||||
FIFOS_empty = 0,
|
FIFOS_empty = 0,
|
||||||
FIFOS_ready,
|
FIFOS_ready,
|
||||||
@ -12,6 +12,7 @@ typedef enum {
|
|||||||
FIFOS_error
|
FIFOS_error
|
||||||
} fifoState;
|
} fifoState;
|
||||||
|
|
||||||
|
// Структура FIFO
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t data[8];
|
uint8_t data[8];
|
||||||
uint8_t pointer;
|
uint8_t pointer;
|
||||||
|
|||||||
@ -2,40 +2,11 @@
|
|||||||
#include "hdlc.h"
|
#include "hdlc.h"
|
||||||
#include "hdlc_type.h"
|
#include "hdlc_type.h"
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
HDLCCFT_info = 0,
|
int HDLC_printControlField (hdlcControlField16b_u field);
|
||||||
HDLCCFT_control,
|
|
||||||
HDLCCFT_unnumbered,
|
|
||||||
HDLCCFT_undefined
|
|
||||||
} controlFieldType_e;
|
|
||||||
|
|
||||||
|
|
||||||
controlFieldType_e HDLC_checkControlField (uint16_t value);
|
int HDLC_printControlField (hdlcControlField16b_u field) {
|
||||||
int HDLC_printControlField (hdlcControlField16b_s field);
|
|
||||||
|
|
||||||
|
|
||||||
controlFieldType_e HDLC_checkControlField (uint16_t value) {
|
|
||||||
controlFieldType_e controlFieldType;
|
|
||||||
// Определяем тип информационного кадра:
|
|
||||||
// 0b0... - информационный,
|
|
||||||
// 0b10... - управляющий,
|
|
||||||
// 0b11... - ненумерованный
|
|
||||||
|
|
||||||
if (((value >> 7) & 1) == 0) {
|
|
||||||
controlFieldType = HDLCCFT_info;
|
|
||||||
} else {
|
|
||||||
if (((value >> 6) & 1) == 0) {
|
|
||||||
controlFieldType = HDLCCFT_control;
|
|
||||||
} else {
|
|
||||||
controlFieldType = HDLCCFT_unnumbered;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return controlFieldType;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int HDLC_printControlField (hdlcControlField16b_s field) {
|
|
||||||
printf ("HDLC: Printing fields:\n");
|
printf ("HDLC: Printing fields:\n");
|
||||||
printf ("HDLC: .. Type:\n");
|
printf ("HDLC: .. Type:\n");
|
||||||
printf ("HDLC: .. Send sequence: %d\n", field.bits.sendSequence);
|
printf ("HDLC: .. Send sequence: %d\n", field.bits.sendSequence);
|
||||||
@ -46,8 +17,8 @@ int HDLC_printControlField (hdlcControlField16b_s field) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
hdlcControlField16b_s HDLC_parseControlField (uint16_t value) {
|
hdlcControlField16b_u HDLC_parseControlField (uint16_t value) {
|
||||||
hdlcControlField16b_s fieldUnion;
|
hdlcControlField16b_u fieldUnion;
|
||||||
// fieldUnion.value = TOOL_reverseBits16(value);
|
// fieldUnion.value = TOOL_reverseBits16(value);
|
||||||
fieldUnion.value = value;
|
fieldUnion.value = value;
|
||||||
|
|
||||||
@ -58,8 +29,8 @@ hdlcControlField16b_s HDLC_parseControlField (uint16_t value) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int HDLC_isControlFieldValid (uint16_t value) {
|
int HDLC_isControlFieldValid (uint16_t value) {
|
||||||
if ((HDLC_checkControlField != HDLCCFT_info) || (value == 0)) {
|
if ((value == 0xffff) || (value == 0)) {
|
||||||
printf ("HDLC: Wrong control field:\n");
|
printf ("HDLC: Wrong control field:\n");
|
||||||
// Так как обрабатывается только вариант с информационным пакетом
|
// Так как обрабатывается только вариант с информационным пакетом
|
||||||
return -1;
|
return -1;
|
||||||
|
|||||||
@ -5,6 +5,7 @@
|
|||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include "hdlc_type.h"
|
#include "hdlc_type.h"
|
||||||
|
|
||||||
|
// Cтруктура поля управления
|
||||||
typedef union {
|
typedef union {
|
||||||
struct __attribute__((packed)) {
|
struct __attribute__((packed)) {
|
||||||
uint8_t receiveSequence : 7;
|
uint8_t receiveSequence : 7;
|
||||||
@ -13,10 +14,10 @@ typedef union {
|
|||||||
uint8_t type : 1;
|
uint8_t type : 1;
|
||||||
} bits;
|
} bits;
|
||||||
uint16_t value;
|
uint16_t value;
|
||||||
} hdlcControlField16b_s;
|
} hdlcControlField16b_u;
|
||||||
|
|
||||||
int HDLC_isControlFieldValid (uint16_t value);
|
int HDLC_isControlFieldValid (uint16_t value);
|
||||||
hdlcControlField16b_s HDLC_parseControlField (uint16_t value);
|
hdlcControlField16b_u HDLC_parseControlField (uint16_t value);
|
||||||
|
|
||||||
|
|
||||||
#endif // HDLC_H
|
#endif // HDLC_H
|
||||||
@ -4,16 +4,22 @@
|
|||||||
|
|
||||||
#include "fifo_type.h"
|
#include "fifo_type.h"
|
||||||
|
|
||||||
#define hdlcInfoLength 16
|
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
// Фрейм HDLC
|
||||||
|
// Флаг FD | Адрес | Управляющее поле | Информационное поле | FCS | Флаг FD
|
||||||
|
// 8 бит | кратно 8 | 8 или 16 бит | 0 или более байт | 16 бит | 8 бит
|
||||||
|
// ----------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
#define HDLC_INFO_LENGTH 16
|
||||||
|
#define HDLC_PACKET_LENGTH 2+2+HDLC_INFO_LENGTH+2
|
||||||
|
|
||||||
// Структура пакета (фрейма) HDLC
|
// Структура пакета (фрейма) HDLC
|
||||||
// Флаг FD | Адрес | Управляющее поле | Информационное поле | FCS | Флаг FD
|
|
||||||
// 8 бит | кратно 8 | 8 или 16 бит | 0 или более бит, кратно 8 | 16 бит | 8 бит
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
const uint8_t flag;
|
const uint8_t flag;
|
||||||
const uint16_t address;
|
uint16_t address;
|
||||||
uint16_t control;
|
uint16_t control;
|
||||||
uint8_t info[hdlcInfoLength];
|
uint8_t info[HDLC_INFO_LENGTH];
|
||||||
uint16_t fcs;
|
uint16_t fcs;
|
||||||
// const uint8_t closeFlag;
|
// const uint8_t closeFlag;
|
||||||
} hdlcPacket_s;
|
} hdlcPacket_s;
|
||||||
|
|||||||
@ -47,13 +47,13 @@ int main(void) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case OS_wait:
|
case OS_wait:
|
||||||
sleep (1);
|
TOOL_msleep(1000);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
printf("OS: Wrong state, going to first state");
|
printf("OS: Wrong state, going to first state");
|
||||||
bigLoopOsState = OS_first;
|
bigLoopOsState = OS_first;
|
||||||
sleep (3);
|
TOOL_msleep(3000);
|
||||||
printf("\033[2J\033[H");
|
printf("\033[2J\033[H");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -61,7 +61,7 @@ int main(void) {
|
|||||||
bigLoopOsState++;
|
bigLoopOsState++;
|
||||||
|
|
||||||
// Для контроля
|
// Для контроля
|
||||||
sleep (1);
|
TOOL_msleep(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@ -6,7 +6,6 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
// Конфигурация
|
// Конфигурация
|
||||||
static const uint16_t hdlcMasterAddress = 0b10000000;
|
static const uint16_t hdlcMasterAddress = 0b10000000;
|
||||||
@ -15,6 +14,7 @@ static const uint16_t hdlcSlaveAddress = 0b11000000;
|
|||||||
// Вспомогательные функции
|
// Вспомогательные функции
|
||||||
uint16_t CRC16_compute(uint8_t *data, size_t length);
|
uint16_t CRC16_compute(uint8_t *data, size_t length);
|
||||||
uint16_t TOOL_reverseBits16(uint16_t value);
|
uint16_t TOOL_reverseBits16(uint16_t value);
|
||||||
|
void TOOL_msleep(long milliseconds);
|
||||||
|
|
||||||
// Потоки ОС
|
// Потоки ОС
|
||||||
int WORK_master(void);
|
int WORK_master(void);
|
||||||
|
|||||||
15
src/tools.c
15
src/tools.c
@ -1,6 +1,7 @@
|
|||||||
// Файл с общими функциями и конфигурацией
|
// Файл с общими функциями и конфигурацией
|
||||||
|
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
|
||||||
// Вычисление контрольной суммы CRC16
|
// Вычисление контрольной суммы CRC16
|
||||||
@ -50,3 +51,17 @@ uint16_t TOOL_reverseBitsN(uint16_t value, uint8_t n) {
|
|||||||
return reversed;
|
return reversed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void TOOL_msleep(long milliseconds) {
|
||||||
|
struct timespec ts;
|
||||||
|
ts.tv_sec = milliseconds / 1000; // Seconds part
|
||||||
|
ts.tv_nsec = (milliseconds % 1000) * 1000000; // Nanoseconds part
|
||||||
|
|
||||||
|
// nanosleep can be interrupted by signals, so we loop if interrupted
|
||||||
|
while (nanosleep(&ts, &ts) == -1) {
|
||||||
|
// If interrupted, remaining time is in ts, so we continue sleeping
|
||||||
|
// unless an actual error occurred (other than EINTR)
|
||||||
|
// For simplicity, this example assumes EINTR is the only -1 cause.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@ -5,37 +5,22 @@
|
|||||||
#include "hdlc.h"
|
#include "hdlc.h"
|
||||||
#include "fifo.h"
|
#include "fifo.h"
|
||||||
|
|
||||||
int WORK_prepareTestPackage(uint8_t *buffer, size_t size) {
|
|
||||||
memset(buffer, 0, size);
|
|
||||||
for (size_t i = 0; i < size; i++) {
|
|
||||||
buffer[i] = i;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Подготовка пакета для отправки
|
// Подготовка пакета для отправки
|
||||||
int WORK_preparePackage(workerHost_s *worker) {
|
int WORK_preparePackage(workerHost_s *worker) {
|
||||||
|
printf("WORKX: .. Preparing package\n");
|
||||||
worker->packet->control = 0b0100110011110000;
|
worker->packet->control = 0b0100110011110000;
|
||||||
WORK_prepareTestPackage(worker->packet->info, hdlcInfoLength);
|
WORK_fillBuffer8b(worker->packet->info, HDLC_INFO_LENGTH);
|
||||||
// memcpy(packet->info, testInfo, hdlcInfoLength);
|
// memcpy(packet->info, testInfo, HDLC_INFO_LENGTH);
|
||||||
worker->packet->fcs = CRC16_compute(worker->packet->info, hdlcInfoLength);
|
worker->packet->fcs = CRC16_compute(worker->packet->info, HDLC_INFO_LENGTH);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int WORK_execute(int (*callback)(workerHost_s*), workerHost_s *worker) {
|
|
||||||
if (callback == NULL) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
int res = callback(worker);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Отправка пакета
|
// Отправка пакета
|
||||||
int WORK_sendPackage(workerHost_s *worker) {
|
int WORK_sendPackage(workerHost_s *worker) {
|
||||||
|
printf("WORKX: .. Sending package\n");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -43,32 +28,117 @@ int WORK_sendPackage(workerHost_s *worker) {
|
|||||||
|
|
||||||
// Ожидание пакета
|
// Ожидание пакета
|
||||||
int WORK_waitPackage(workerHost_s *worker) {
|
int WORK_waitPackage(workerHost_s *worker) {
|
||||||
|
printf("WORKX: .. Waiting for a package\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int WORK_receivePackage(workerHost_s *worker) {
|
int WORK_receivePackage(workerHost_s *worker) {
|
||||||
|
printf("WORKX: .. Receiving package\n");
|
||||||
|
// Receiving in buffer
|
||||||
|
|
||||||
|
WORK_testFill(worker->byteBuffer, WORK_BYTE_BUFFER_SIZE);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int WORK_parsePackage(workerHost_s *worker) {
|
int WORK_parsePackage(workerHost_s *worker) {
|
||||||
|
printf("WORKX: .. Parsing package\n");
|
||||||
|
|
||||||
|
uint8_t *first = NULL, *last = NULL;
|
||||||
|
// Поиск пакета в массиве
|
||||||
|
for (size_t i = 0; i < WORK_BYTE_BUFFER_SIZE; i++) {
|
||||||
|
if (worker->byteBuffer[i] == worker->packet->flag) {
|
||||||
|
if (!first) {
|
||||||
|
first = &worker->byteBuffer[i];
|
||||||
|
first++; // Скипаем байт флага
|
||||||
|
} else if (!last) {
|
||||||
|
last = &worker->byteBuffer[i];
|
||||||
|
last--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Разбор пакета в структуру
|
||||||
|
if (first && last) {
|
||||||
|
if (last > first) {
|
||||||
|
size_t len = last - first;
|
||||||
|
// Так как может быть меньше в теории
|
||||||
|
if (len <= HDLC_PACKET_LENGTH) {
|
||||||
|
if (len > 2) { // Считываем адрес
|
||||||
|
worker->packet->address = ((uint16_t)*first << 8) | *(first+1);
|
||||||
|
first += 2;
|
||||||
|
}
|
||||||
|
if (len > 4) { // Считываем управляющее поле
|
||||||
|
worker->packet->control = ((uint16_t)*first << 8) | *(first+1);
|
||||||
|
first += 2;
|
||||||
|
}
|
||||||
|
if (len > 6) { // Считываем контрольную сумму
|
||||||
|
worker->packet->fcs = ((uint16_t)*(last-1) << 8) | *last;
|
||||||
|
last -= 2;
|
||||||
|
}
|
||||||
|
if ((len > 8) && (last > first)) { // Считываем информационный пакет
|
||||||
|
int j = 0;
|
||||||
|
// От переполнения
|
||||||
|
if (last-first >= HDLC_INFO_LENGTH) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Заполнение данными
|
||||||
|
for (uint8_t* i = first; i <= last; ++i) {
|
||||||
|
worker->packet->info[j] = *i;
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Чистка хвоста
|
||||||
|
for (; j < HDLC_INFO_LENGTH; ++j) {
|
||||||
|
worker->packet->info[j] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// HDLC_parseControlField (worker->packet->control);
|
||||||
|
// printf("WORKX: .. Info value: %d\n", field.value);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int WORK_checkPackage(workerHost_s *worker) {
|
int WORK_checkPackage(workerHost_s *worker) {
|
||||||
// Проверка поля управления
|
printf("WORKX: .. Checking package\n");
|
||||||
if (HDLC_isControlFieldValid(worker->packet->control)){
|
int res = 0;
|
||||||
printf("WORKX: Package is info. Parsing...\n");
|
|
||||||
hdlcControlField16b_s field = HDLC_parseControlField (worker->packet->control);
|
|
||||||
printf("WORKX: Package has been parsed...\n");
|
|
||||||
|
|
||||||
|
res = HDLC_isControlFieldValid(worker->packet->control);
|
||||||
|
// Проверка поля управления
|
||||||
|
if (res != 0) {
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
printf("WORKX: .. Package is info ...\n");
|
||||||
|
|
||||||
// Проверка контрольной суммы
|
// Проверка контрольной суммы
|
||||||
|
|
||||||
printf("WORKX: Package checked\n");
|
printf("WORKX: .. Package checked\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Вызов функций обработчика хоста
|
||||||
|
int WORK_execute(int (*callback)(workerHost_s*), workerHost_s *worker) {
|
||||||
|
if (callback == NULL) {
|
||||||
|
printf("WORKX: .. Wrong object\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int res = callback(worker);
|
||||||
|
|
||||||
|
if (res != 0) {
|
||||||
|
printf("WORKX: .. Error\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@ -6,6 +6,7 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include "hdlc_type.h"
|
#include "hdlc_type.h"
|
||||||
|
|
||||||
@ -19,9 +20,8 @@ typedef struct {
|
|||||||
bool isInitialized;
|
bool isInitialized;
|
||||||
} workerHost_s;
|
} workerHost_s;
|
||||||
|
|
||||||
#define workByteBufferSize 128
|
#define WORK_BYTE_BUFFER_SIZE 128
|
||||||
|
|
||||||
int WORK_printBlocks(workerHost_s *worker, uint8_t mode);
|
|
||||||
int WORK_execute(int (*callback)(workerHost_s*), workerHost_s *worker);
|
int WORK_execute(int (*callback)(workerHost_s*), workerHost_s *worker);
|
||||||
|
|
||||||
int WORK_preparePackage(workerHost_s *worker);
|
int WORK_preparePackage(workerHost_s *worker);
|
||||||
@ -31,8 +31,11 @@ int WORK_receivePackage(workerHost_s *worker);
|
|||||||
int WORK_checkPackage(workerHost_s *worker);
|
int WORK_checkPackage(workerHost_s *worker);
|
||||||
int WORK_parsePackage(workerHost_s *worker);
|
int WORK_parsePackage(workerHost_s *worker);
|
||||||
|
|
||||||
int WORK_prepareTestPackage(uint8_t *buffer, size_t size);
|
int WORK_fillBuffer8b(uint8_t *buffer, size_t size);
|
||||||
|
|
||||||
|
// tools
|
||||||
|
int WORK_printBlocks(workerHost_s *worker, uint8_t mode);
|
||||||
|
int WORK_testFill(uint8_t* buffer, size_t bufferSize);
|
||||||
|
|
||||||
#endif //WORKER_H
|
#endif //WORKER_H
|
||||||
|
|
||||||
|
|||||||
@ -7,103 +7,101 @@
|
|||||||
static hdlcPacket_s hdlcMasterPacket = {hdlcFlag, hdlcMasterAddress};
|
static hdlcPacket_s hdlcMasterPacket = {hdlcFlag, hdlcMasterAddress};
|
||||||
static fifo_s hdlcMasterFifo;
|
static fifo_s hdlcMasterFifo;
|
||||||
static workerHost_s hdlcMaster = {0};
|
static workerHost_s hdlcMaster = {0};
|
||||||
|
static uint8_t masterBuffer[WORK_BYTE_BUFFER_SIZE];
|
||||||
|
|
||||||
workerHost_s* WORK_masterInit () {
|
workerHost_s* WORK_masterInit () {
|
||||||
if (!hdlcMaster.isInitialized) {
|
if (!hdlcMaster.isInitialized) {
|
||||||
printf("WORKM: Starting master worker initialization\n");
|
printf("WMAST: Starting master worker initialization\n");
|
||||||
hdlcMaster.packet = &hdlcMasterPacket;
|
hdlcMaster.packet = &hdlcMasterPacket;
|
||||||
hdlcMaster.fifo = &hdlcMasterFifo;
|
hdlcMaster.fifo = &hdlcMasterFifo;
|
||||||
hdlcMaster.isInitialized = true;
|
hdlcMaster.isInitialized = true;
|
||||||
printf("WORKM: Master initialization done\n");
|
hdlcMaster.byteBuffer = masterBuffer;
|
||||||
|
printf("WMAST: Master initialization done\n");
|
||||||
WORK_printBlocks(&hdlcMaster, 3);
|
WORK_printBlocks(&hdlcMaster, 3);
|
||||||
|
|
||||||
return &hdlcMaster;
|
return &hdlcMaster;
|
||||||
}
|
}
|
||||||
|
// Ошибка в пакете, повторная инициализация
|
||||||
|
hdlcMaster.isInitialized = false;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static uint8_t masterBuffer[workByteBufferSize];
|
|
||||||
|
|
||||||
|
|
||||||
int WORK_master (void) {
|
int WORK_master (void) {
|
||||||
static workerState_e masterState = WORKSTATE_first;;
|
static workerHostState_e masterState = WORKSTATE_first;
|
||||||
|
if (masterState >= WORKSTATE_last) {
|
||||||
|
masterState = WORKSTATE_first;
|
||||||
|
}
|
||||||
|
|
||||||
printf("WORKM: In master worker\n");
|
printf("WMAST: In master worker\n");
|
||||||
|
|
||||||
int res = 0;
|
int res = 0;
|
||||||
|
|
||||||
switch (masterState) {
|
switch (masterState) {
|
||||||
case WORKSTATE_first:
|
case WORKSTATE_first:
|
||||||
masterState=WORKSTATE_initializing;
|
masterState = WORKSTATE_initializing;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Инициализация хоста
|
// Инициализация хоста
|
||||||
case WORKSTATE_initializing:
|
case WORKSTATE_initializing:
|
||||||
printf("WORKM: Initializing\n");
|
|
||||||
if (WORK_masterInit() != NULL) {
|
if (WORK_masterInit() != NULL) {
|
||||||
masterState=WORKSTATE_preparingPackage;
|
masterState = WORKSTATE_preparingPackage;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Подготовка пакета
|
// Подготовка пакета
|
||||||
case WORKSTATE_preparingPackage:
|
case WORKSTATE_preparingPackage:
|
||||||
printf("WORKM: Preparing package\n");
|
|
||||||
res = WORK_execute(WORK_preparePackage, &hdlcMaster);
|
res = WORK_execute(WORK_preparePackage, &hdlcMaster);
|
||||||
if (res == 0) {
|
if (res == 0) {
|
||||||
masterState=WORKSTATE_sendingPackage;
|
masterState = WORKSTATE_sendingPackage;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Отправка пакета
|
// Отправка пакета
|
||||||
case WORKSTATE_sendingPackage:
|
case WORKSTATE_sendingPackage:
|
||||||
printf("WORKM: Sending package\n");
|
|
||||||
res = WORK_execute(WORK_sendPackage, &hdlcMaster);
|
res = WORK_execute(WORK_sendPackage, &hdlcMaster);
|
||||||
if (res == 0) {
|
if (res == 0) {
|
||||||
masterState=WORKSTATE_waitingPackage;
|
masterState = WORKSTATE_waitingPackage;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Ожидание ответа
|
// Ожидание ответа
|
||||||
case WORKSTATE_waitingPackage:
|
case WORKSTATE_waitingPackage:
|
||||||
printf("WORKM: Waiting package\n");
|
|
||||||
res = WORK_execute(WORK_waitPackage, &hdlcMaster);
|
res = WORK_execute(WORK_waitPackage, &hdlcMaster);
|
||||||
if (res == 0) {
|
if (res == 0) {
|
||||||
masterState=WORKSTATE_receivingPackage;
|
masterState = WORKSTATE_receivingPackage;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Получение пакета
|
// Получение пакета
|
||||||
case WORKSTATE_receivingPackage:
|
case WORKSTATE_receivingPackage:
|
||||||
printf("WORKM: Receiving package\n");
|
|
||||||
res = WORK_execute(WORK_receivePackage, &hdlcMaster);
|
res = WORK_execute(WORK_receivePackage, &hdlcMaster);
|
||||||
if (res == 0) {
|
if (res == 0) {
|
||||||
masterState=WORKSTATE_parsingPackage;
|
masterState = WORKSTATE_parsingPackage;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Парсинг пакета
|
// Парсинг пакета
|
||||||
case WORKSTATE_parsingPackage:
|
case WORKSTATE_parsingPackage:
|
||||||
printf("WORKM: Parsing package\n");
|
|
||||||
res = WORK_execute(WORK_parsePackage, &hdlcMaster);
|
res = WORK_execute(WORK_parsePackage, &hdlcMaster);
|
||||||
if (res == 0) {
|
if (res == 0) {
|
||||||
masterState=WORKSTATE_checkingPackage;
|
masterState = WORKSTATE_checkingPackage;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Проверка пакета
|
// Проверка пакета
|
||||||
case WORKSTATE_checkingPackage:
|
case WORKSTATE_checkingPackage:
|
||||||
printf("WORKM: Checking package\n");
|
|
||||||
res = WORK_execute(WORK_checkPackage, &hdlcMaster);
|
res = WORK_execute(WORK_checkPackage, &hdlcMaster);
|
||||||
if (res == 0) {
|
if (res == 0) {
|
||||||
masterState=WORKSTATE_last;
|
masterState = WORKSTATE_last;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Цикл завершён, повторяем
|
// Цикл завершён, повторяем
|
||||||
case WORKSTATE_last:
|
case WORKSTATE_last:
|
||||||
printf("WORKM: Job done. Starting from the beginning\n");
|
printf("WMAST: Job done. Starting from the beginning\n");
|
||||||
masterState = WORKSTATE_preparingPackage;
|
masterState = WORKSTATE_first;
|
||||||
|
// Либо переходить сразу на подготовку пакета
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -7,11 +7,11 @@ static workerHost_s hdlcSlave = {0};
|
|||||||
|
|
||||||
workerHost_s* WORK_slaveInit () {
|
workerHost_s* WORK_slaveInit () {
|
||||||
if (!hdlcSlave.isInitialized) {
|
if (!hdlcSlave.isInitialized) {
|
||||||
printf("WORKM: Starting slave worker initialization\n");
|
printf("WSLAV: Starting slave worker initialization\n");
|
||||||
hdlcSlave.packet = &hdlcSlavePacket;
|
hdlcSlave.packet = &hdlcSlavePacket;
|
||||||
hdlcSlave.fifo = &hdlcSlaveFifo;
|
hdlcSlave.fifo = &hdlcSlaveFifo;
|
||||||
hdlcSlave.isInitialized = true;
|
hdlcSlave.isInitialized = true;
|
||||||
printf("WORKS: Slave initialization done\n");
|
printf("WSLAV Slave initialization done\n");
|
||||||
WORK_printBlocks(&hdlcSlave, 3);
|
WORK_printBlocks(&hdlcSlave, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -21,7 +21,7 @@ workerHost_s* WORK_slaveInit () {
|
|||||||
|
|
||||||
int WORK_slave(void) {
|
int WORK_slave(void) {
|
||||||
WORK_slaveInit();
|
WORK_slaveInit();
|
||||||
printf("WORKS: In slave worker\n");
|
printf("WSLAV: In slave worker\n");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -38,3 +38,30 @@ int WORK_printBlocks(workerHost_s *worker, uint8_t mode) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Тестовое заполнение буфера
|
||||||
|
int WORK_testFill(uint8_t* buffer, size_t bufferSize) {
|
||||||
|
static uint8_t testbuffer[50] = {
|
||||||
|
0xaa,0xbb,
|
||||||
|
0x7e,
|
||||||
|
0xa1, 0xa2,
|
||||||
|
0xc1, 0xc2,
|
||||||
|
0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xde,
|
||||||
|
0xcc, 0xcd,
|
||||||
|
0x7e
|
||||||
|
};
|
||||||
|
for (int i = 0; i < 50; i++) {
|
||||||
|
buffer[i] = testbuffer[i];
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Заполнение массива
|
||||||
|
int WORK_fillBuffer8b(uint8_t *buffer, size_t size) {
|
||||||
|
memset(buffer, 0, size);
|
||||||
|
for (size_t i = 0; i < size; i++) {
|
||||||
|
buffer[i] = i;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
@ -2,16 +2,16 @@
|
|||||||
#ifndef WORKER_TYPE_H
|
#ifndef WORKER_TYPE_H
|
||||||
#define WORKER_TYPE_H
|
#define WORKER_TYPE_H
|
||||||
|
|
||||||
// Перечисление статусов машины состояния
|
// Перечисление статусов машины состояния общего обработчика
|
||||||
typedef enum {
|
// typedef enum {
|
||||||
WORKE_first = 0,
|
// WORKE_first = 0,
|
||||||
WORKE_masterWorker,
|
// WORKE_masterWorker,
|
||||||
WORKE_slaveWorker,
|
// WORKE_slaveWorker,
|
||||||
WORKE_wait,
|
// WORKE_wait,
|
||||||
WORKE_last
|
// WORKE_last
|
||||||
} workerState_e;
|
// } workerState_e;
|
||||||
|
|
||||||
// Перечисление статусов хоста
|
// Перечисление статусов конкретного хоста
|
||||||
typedef enum {
|
typedef enum {
|
||||||
WORKSTATE_first = 0,
|
WORKSTATE_first = 0,
|
||||||
WORKSTATE_initializing,
|
WORKSTATE_initializing,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user