kinda working demo

This commit is contained in:
2017-10-15 22:40:53 +02:00
parent e89ca3a6cb
commit 46883a9baa
17 changed files with 578 additions and 117 deletions
+197
View File
@@ -0,0 +1,197 @@
//
// Created by MightyPork on 2017/10/15.
//
// http://www.thegeekstuff.com/2011/12/c-socket-programming/?utm_source=feedburner
#include "demo.h"
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <arpa/inet.h>
#include <signal.h>
volatile int sockfd = -1;
volatile bool conn_disband = false;
void demo_disconn(void)
{
conn_disband = true;
if (sockfd >= 0) close(sockfd);
}
void TF_WriteImpl(const uint8_t *buff, size_t len)
{
printf("--------------------\n");
printf("\033[32mTF_WriteImpl - sending frame:\033[0m\n");
dumpFrame(buff, len);
if (sockfd != -1) {
write(sockfd, buff, len);
} else {
printf("\nNo peer!\n");
}
}
static bool demo_client(void)
{
pid_t childPID;
ssize_t n = 0;
uint8_t recvBuff[1024];
struct sockaddr_in serv_addr;
printf("\n--- STARTING CLIENT! ---\n");
memset(recvBuff, '0', sizeof(recvBuff));
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("\n Error : Could not create socket \n");
return false;
}
memset(&serv_addr, '0', sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0) {
printf("\n inet_pton error occured\n");
return false;
}
if (connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
printf("\n Error : Connect Failed \n");
perror("PERROR ");
return false;
}
childPID = fork();
if (childPID >= 0) { // fork was successful
if (childPID == 0) {// child process
printf("\n Child Process \n");
while ((n = read(sockfd, recvBuff, sizeof(recvBuff) - 1)) > 0 && !conn_disband) {
dumpFrame(recvBuff, (size_t) n);
TF_Accept(recvBuff, (size_t) n);
}
printf("\n End read \n");
if (n < 0) {
printf("\n Read error \n");
}
printf("\n Close sock \n");
close(sockfd);
sockfd = -1;
return true;
}
else { //Parent process
printf("\n Parent process \n");
return true;
}
}
else { // fork failed
printf("\n Fork failed!!!!!! \n");
return false;
}
}
static bool demo_server(void)
{
pid_t childPID;
ssize_t n;
int listenfd = 0;
uint8_t recvBuff[1024];
struct sockaddr_in serv_addr;
int option;
printf("\n--- STARTING SERVER! ---\n");
listenfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&serv_addr, '0', sizeof(serv_addr));
option = 1;
setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, (char*)&option, sizeof(option));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(PORT);
if (bind(listenfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) {
perror("Failed to bind ");
return false;
}
if (listen(listenfd, 10) < 0) {
perror("Failed to listen ");
return false;
}
childPID = fork();
if (childPID >= 0) { // fork was successful
if (childPID == 0) {// child process
printf("\n Child Process \n");
while (1) {
printf("\nWaiting for client...\n");
sockfd = accept(listenfd, (struct sockaddr *) NULL, NULL);
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char*)&option, sizeof(option));
printf("\nClient connected\n");
conn_disband = false;
while ((n = read(sockfd, recvBuff, sizeof(recvBuff) - 1)) > 0 && !conn_disband) {
printf("...read %ld\n", n);
dumpFrame(recvBuff, n);
TF_Accept(recvBuff, (size_t) n);
}
if (n < 0) {
printf("\n Read error \n");
}
printf("Closing socket\n");
close(sockfd);
sockfd = -1;
}
return true;
}
else { //Parent process
printf("\n Parent process \n");
return true;
}
}
else { // fork failed
printf("\n Fork failed!!!!!! \n");
return false;
}
}
void signal_handler(int sig)
{
(void)sig;
printf("Shutting down...");
demo_disconn();
exit(0);
}
void demo_init(TF_PEER peer)
{
signal(SIGTERM, signal_handler);
signal(SIGINT, signal_handler);
bool suc;
if (peer == TF_MASTER) {
suc = demo_client();
} else {
suc = demo_server();
}
if (!suc) {
signal_handler(9);
}
}
+20
View File
@@ -0,0 +1,20 @@
//
// Created by MightyPork on 2017/10/15.
//
#ifndef TF_DEMO_H
#define TF_DEMO_H
#include <stdbool.h>
#include "../TinyFrame.h"
#include "utils.h"
#define PORT 9798
/** Init server - DOES NOT init TinyFrame! */
void demo_init(TF_PEER peer);
/** Disconnect client from the server - claled by a server-side callback */
void demo_disconn(void);
#endif //TF_DEMO_H
+17
View File
@@ -0,0 +1,17 @@
CFILES=../demo.c ../utils.c ../../TinyFrame.c
INCLDIRS=-I. -I.. -I../..
CFLAGS=-O0 -ggdb --std=gnu99 -Wno-main -Wall -Wextra $(CFILES) $(INCLDIRS)
build: master.bin slave.bin
master: master.bin
./master.bin
slave: slave.bin
./slave.bin
master.bin: master.c $(CFILES)
gcc master.c $(CFLAGS) -o master.bin
slave.bin: slave.c $(CFILES)
gcc slave.c $(CFLAGS) -o slave.bin
+25
View File
@@ -0,0 +1,25 @@
//
// Created by MightyPork on 2017/10/15.
//
#ifndef TF_CONFIG_H
#define TF_CONFIG_H
#include <stdint.h>
#define TF_ID_BYTES 1
#define TF_LEN_BYTES 2
#define TF_TYPE_BYTES 1
#define TF_CKSUM_TYPE TF_CKSUM_CRC32
#define TF_USE_SOF_BYTE 1
#define TF_SOF_BYTE 0x01
typedef uint16_t TF_TICKS;
typedef uint8_t TF_COUNT;
#define TF_MAX_PAYLOAD_RX 1024
#define TF_MAX_PAYLOAD_TX 1024
#define TF_MAX_ID_LST 10
#define TF_MAX_TYPE_LST 10
#define TF_MAX_GEN_LST 5
#define TF_PARSER_TIMEOUT_TICKS 10
#endif //TF_CONFIG_H
+38
View File
@@ -0,0 +1,38 @@
//
// Created by MightyPork on 2017/10/15.
//
#include <stdio.h>
#include <stdlib.h>
#include <zconf.h>
#include "../../TinyFrame.h"
#include "../demo.h"
bool testIdListener(TF_MSG *msg)
{
printf("testIdListener()\n");
dumpFrameInfo(msg);
return true;
}
bool testGenericListener(TF_MSG *msg)
{
printf("testGenericListener()\n");
dumpFrameInfo(msg);
return true;
}
int main(void)
{
TF_Init(TF_MASTER);
TF_AddGenericListener(testGenericListener);
demo_init(TF_MASTER);
TF_SendSimple(1, (pu8)"Ahoj", 5);
TF_SendSimple(1, (pu8)"Hello", 6);
TF_QuerySimple(1, (pu8)"Query!", 6, testIdListener, 0);
while(1) usleep(10);
}
+29
View File
@@ -0,0 +1,29 @@
//
// Created by MightyPork on 2017/10/15.
//
#include <stdio.h>
#include "../../TinyFrame.h"
#include "../demo.h"
#include <unistd.h>
#include <memory.h>
bool helloListener(TF_MSG *msg)
{
printf("helloListener()\n");
dumpFrameInfo(msg);
msg->data = (const uint8_t *) "jak se mas?";
msg->len = (TF_LEN) strlen((const char *) msg->data);
TF_Respond(msg);
return true;
}
int main(void)
{
TF_Init(TF_SLAVE);
TF_AddTypeListener(1, helloListener);
demo_init(TF_SLAVE);
printf("MAIN PROCESS CONTINUES...\n");
while(1) usleep(10);
}
+11
View File
@@ -0,0 +1,11 @@
CFILES=../utils.c ../../TinyFrame.c
INCLDIRS=-I. -I.. -I../..
CFLAGS=-O0 -ggdb --std=gnu99 -Wno-main -Wall -Wextra $(CFILES) $(INCLDIRS)
run: test.bin
./test.bin
build: test.bin
test.bin: test.c $(CFILES)
gcc test.c $(CFLAGS) -o test.bin
+25
View File
@@ -0,0 +1,25 @@
//
// Created by MightyPork on 2017/10/15.
//
#ifndef TF_CONFIG_H
#define TF_CONFIG_H
#include <stdint.h>
#define TF_ID_BYTES 1
#define TF_LEN_BYTES 2
#define TF_TYPE_BYTES 1
#define TF_CKSUM_TYPE TF_CKSUM_CRC16
#define TF_USE_SOF_BYTE 1
#define TF_SOF_BYTE 0x01
typedef uint16_t TF_TICKS;
typedef uint8_t TF_COUNT;
#define TF_MAX_PAYLOAD_RX 1024
#define TF_MAX_PAYLOAD_TX 1024
#define TF_MAX_ID_LST 10
#define TF_MAX_TYPE_LST 10
#define TF_MAX_GEN_LST 5
#define TF_PARSER_TIMEOUT_TICKS 10
#endif //TF_CONFIG_H
+65
View File
@@ -0,0 +1,65 @@
#include <stdio.h>
#include <string.h>
#include "../../TinyFrame.h"
#include "../utils.h"
/**
* This function should be defined in the application code.
* It implements the lowest layer - sending bytes to UART (or other)
*/
void TF_WriteImpl(const uint8_t *buff, size_t len)
{
printf("--------------------\n");
printf("\033[32mTF_WriteImpl - sending frame:\033[0m\n");
dumpFrame(buff, len);
// Send it back as if we received it
TF_Accept(buff, len);
}
/** An example listener function */
bool myListener(TF_MSG *msg)
{
dumpFrameInfo(msg);
return true;
}
bool testIdListener(TF_MSG *msg)
{
printf("OK - ID Listener triggered for msg!\n");
dumpFrameInfo(msg);
return true;
}
void main(void)
{
TF_MSG msg;
const char *longstr = "Lorem ipsum dolor sit amet.";
// Set up the TinyFrame library
TF_Init(TF_MASTER); // 1 = master, 0 = slave
TF_AddGenericListener(myListener);
printf("------ Simulate sending a message --------\n");
TF_ClearMsg(&msg);
msg.type = 0x22;
msg.data = (pu8)"Hello TinyFrame";
msg.len = 16;
TF_Send(&msg);
msg.type = 0x33;
msg.data = (pu8)longstr;
msg.len = (TF_LEN) (strlen(longstr)+1); // add the null byte
TF_Send(&msg);
msg.type = 0x44;
msg.data = (pu8)"Hello2";
msg.len = 7;
TF_Send(&msg);
msg.len = 0;
msg.type = 0x77;
TF_Query(&msg, testIdListener, 0);
}
+32
View File
@@ -0,0 +1,32 @@
//
// Created by MightyPork on 2017/10/15.
//
#include "utils.h"
#include <stdio.h>
// helper func for testing
void dumpFrame(const uint8_t *buff, size_t len)
{
size_t i;
for(i = 0; i < len; i++) {
printf("%3u \033[34m%02X\033[0m", buff[i], buff[i]);
if (buff[i] >= 0x20 && buff[i] < 127) {
printf(" %c", buff[i]);
} else {
printf(" \033[31m.\033[0m");
}
printf("\n");
}
printf("--- end of frame ---\n");
}
void dumpFrameInfo(TF_MSG *msg)
{
printf("\033[33mRX frame\n"
" type: %02Xh\n"
" data: \"%.*s\"\n"
" len: %u\n"
" id: %Xh\033[0m\n",
msg->type, msg->len, msg->data, msg->len, msg->frame_id);
}
+15
View File
@@ -0,0 +1,15 @@
//
// Created by MightyPork on 2017/10/15.
//
#ifndef TF_UTILS_H
#define TF_UTILS_H
#include <stdio.h>
#include "../TinyFrame.h"
typedef unsigned char* pu8;
void dumpFrame(const uint8_t *buff, size_t len);
void dumpFrameInfo(TF_MSG *msg);
#endif //TF_UTILS_H