move all highlevel code into the protocol folder
This commit is contained in:
parent
917fac440f
commit
fee54a77eb
3
.gitmodules
vendored
3
.gitmodules
vendored
@ -1,3 +0,0 @@
|
||||
[submodule "firmware/slider/SliderCommunication"]
|
||||
path = firmware/slider/SliderCommunication
|
||||
url = https://gitlab.tubit.tu-berlin.de/dsp_labor_ws1819/SliderCommunication.git
|
4
protocol/Readme.md
Normal file
4
protocol/Readme.md
Normal file
@ -0,0 +1,4 @@
|
||||
This folder contains template implementations for the communication master and slaves.
|
||||
|
||||
It also defines the data packet that is exchanged on each poll. This definition is
|
||||
used in the actual slave firmware.
|
29
protocol/communication.h
Normal file
29
protocol/communication.h
Normal file
@ -0,0 +1,29 @@
|
||||
/*
|
||||
* communication.h
|
||||
*
|
||||
* Describes the data packet sent for each channel
|
||||
*/
|
||||
#pragma once
|
||||
#include "interface.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef struct {
|
||||
uint16_t poti[4];
|
||||
uint16_t slider;
|
||||
uint8_t button:1;
|
||||
} message_t;
|
||||
|
||||
/// END OF MESSAGE == MSB is set
|
||||
#define IS_EOM(b) (b & (0x80))
|
||||
|
||||
|
||||
// defines the message length of a slave message in bytes
|
||||
// NOTE: sizeof(message_t) is 12 because of the 4-byte alignment criteria
|
||||
#define SLAVE_MESSAGE_LEN (5*2+1)
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // end extern "C"
|
||||
#endif
|
24
protocol/interface.h
Normal file
24
protocol/interface.h
Normal file
@ -0,0 +1,24 @@
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef uint8_t byte_t;
|
||||
|
||||
// this struct describes a communication interface
|
||||
typedef struct iface {
|
||||
// callback, gets called when data arrives at interface
|
||||
void (*on_read)(struct iface *, byte_t, void*ptr);
|
||||
void *callback_data;
|
||||
|
||||
void (*write)(struct iface *, byte_t);
|
||||
} iface_t;
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // end extern "C"
|
||||
#endif
|
||||
|
62
protocol/master/master.c
Normal file
62
protocol/master/master.c
Normal file
@ -0,0 +1,62 @@
|
||||
/*
|
||||
* master.c
|
||||
*
|
||||
* Created on: 06.12.2018
|
||||
* Author: julian
|
||||
*/
|
||||
|
||||
#include "master.h"
|
||||
#include "../communication.h"
|
||||
|
||||
void on_receive(iface_t * me, byte_t b, void*ptr)
|
||||
{
|
||||
master_t * this = (master_t*)(ptr);
|
||||
|
||||
if (this->msg_byte_counter >= 0) {
|
||||
if (this->msg_byte_counter <=8) {
|
||||
static uint16_t temp = 0;
|
||||
if (this->msg_byte_counter%2) {
|
||||
temp |= (b<<7);
|
||||
|
||||
switch(this->msg_byte_counter) {
|
||||
case 1:
|
||||
case 3:
|
||||
case 5:
|
||||
this->buffer[this->chain_len].poti[this->msg_byte_counter/2] = temp;
|
||||
break;
|
||||
case 7:
|
||||
this->buffer[this->chain_len].slider = temp;
|
||||
break;
|
||||
}
|
||||
}else {
|
||||
temp = b&0x7F;
|
||||
}
|
||||
} else {
|
||||
this->buffer[this->chain_len].button = b&0x01;
|
||||
}
|
||||
}
|
||||
|
||||
this->msg_byte_counter++;
|
||||
if (!(this->msg_byte_counter = (this->msg_byte_counter+1)%SLAVE_MESSAGE_LEN)) {
|
||||
this->chain_len++;
|
||||
}
|
||||
|
||||
// decode package
|
||||
if (IS_EOM(b)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// keep communication running
|
||||
me->write(me, 0x00);
|
||||
}
|
||||
|
||||
void master_init(master_t *master, iface_t * dev)
|
||||
{
|
||||
dev->on_read = on_receive;
|
||||
dev->callback_data = master;
|
||||
|
||||
// initialize master values
|
||||
*master = struct {
|
||||
.iface = dev,
|
||||
};
|
||||
}
|
36
protocol/master/master.h
Normal file
36
protocol/master/master.h
Normal file
@ -0,0 +1,36 @@
|
||||
/*
|
||||
* master.h
|
||||
*
|
||||
* Created on: 06.12.2018
|
||||
* Author: julian
|
||||
*/
|
||||
|
||||
#ifndef __DSPLAB_COMMON_MASTER_H__
|
||||
#define __DSPLAB_COMMON_MASTER_H__
|
||||
|
||||
#include "../slave/slave.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
// how many channels we can encounter AT MOST
|
||||
#define MAX_CHAIN_LEN 10
|
||||
|
||||
// this structure defines one complete chain
|
||||
typedef struct {
|
||||
iface_t * iface;
|
||||
|
||||
message_t buffer[MAX_CHAIN_LEN];
|
||||
|
||||
int chain_len; //< measured chainlength
|
||||
int msg_byte_counter; //< bytecounter of receiver
|
||||
} master_t;
|
||||
|
||||
void master_init(master_t *master, iface_t * dev);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // end extern "C"
|
||||
#endif
|
||||
|
||||
#endif /* __DSPLAB_COMMON_MASTER_H__ */
|
48
protocol/slave/slave.c
Normal file
48
protocol/slave/slave.c
Normal file
@ -0,0 +1,48 @@
|
||||
/*
|
||||
* slave.c
|
||||
*
|
||||
* this is a default implementation for a slave
|
||||
* it will continously encode its state on request
|
||||
*/
|
||||
|
||||
#include "slave.h"
|
||||
#include "../communication.h"
|
||||
|
||||
|
||||
// implementation for slave_encode
|
||||
void slave_encode(iface_t *iface, int16_t s) {
|
||||
iface->write(iface, (s>>0)&0x7F);
|
||||
iface->write(iface, (s>>7)&0x7F);
|
||||
}
|
||||
|
||||
void slave_on_receive(iface_t * me, byte_t buffer, void *ptr)
|
||||
{
|
||||
slave_t * slave = (slave_t*)ptr;
|
||||
|
||||
if (!IS_EOM(buffer)) {
|
||||
me->write(me, buffer);
|
||||
return;
|
||||
}
|
||||
|
||||
me->write(me, buffer & 0x7F);
|
||||
|
||||
// write state
|
||||
// write potis
|
||||
for (int i = 0; i < 4; i++)
|
||||
slave_encode(me, slave->state.poti[i]);
|
||||
|
||||
// write slider
|
||||
slave_encode(me, slave->state.slider);
|
||||
|
||||
me->write(me, 0x80 | (slave->state.button & 0x01));
|
||||
}
|
||||
|
||||
void slave_init(slave_t *slave, iface_t *iface)
|
||||
{
|
||||
iface->on_read = slave_on_receive;
|
||||
iface->callback_data = slave;
|
||||
|
||||
slave->iface = iface;
|
||||
slave->state = (message_t){};
|
||||
}
|
||||
|
36
protocol/slave/slave.h
Normal file
36
protocol/slave/slave.h
Normal file
@ -0,0 +1,36 @@
|
||||
/*
|
||||
* slave.h
|
||||
*
|
||||
* contains a slave definition
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "../communication.h"
|
||||
#include "../interface.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
// this struct describes one chain in the link
|
||||
typedef struct
|
||||
{
|
||||
iface_t * iface;
|
||||
message_t state;
|
||||
} slave_t;
|
||||
|
||||
// The slave will use this method to encode
|
||||
// one adc sample
|
||||
void slave_encode(iface_t *iface, int16_t s);
|
||||
|
||||
// initialize the slave
|
||||
void slave_init(slave_t *slave, iface_t *iface);
|
||||
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // end extern "C"
|
||||
#endif
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user