kinda working demo
This commit is contained in:
+197
@@ -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
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user