Skip to content
Snippets Groups Projects
Commit 37d70f35 authored by Florian Hölzl's avatar Florian Hölzl
Browse files

Created tag for rapsberry rover code at end of first lab course.

parent 994f5391
No related branches found
No related tags found
No related merge requests found
Showing
with 806 additions and 0 deletions
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="src" path="generated-src"/>
<classpathentry kind="output" path="build"/>
</classpath>
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>org.fortiss.af3.platform.raspberry</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.fortiss.ide.dev_tools.emf.builder.EcoreBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.ManifestBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.pde.SchemaBuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.fortiss.ide.dev_tools.warnings.RemoveWarningsBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.pde.PluginNature</nature>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Fortiss AF3 Platform Raspberry
Bundle-SymbolicName: org.fortiss.af3.platform.raspberry;singleton:=true
Bundle-Version: 2.9.0.qualifier
Bundle-ClassPath: .
Bundle-Vendor: fortiss GmbH
Bundle-Localization: plugin
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
Export-Package: org.fortiss.af3.platform.raspberry.model,
org.fortiss.af3.platform.raspberry.model.gamepad,
org.fortiss.af3.platform.raspberry.model.gamepad.impl,
org.fortiss.af3.platform.raspberry.model.gamepad.util,
org.fortiss.af3.platform.raspberry.model.impl,
org.fortiss.af3.platform.raspberry.model.util,
org.fortiss.af3.platform.raspberry.util
Bundle-ActivationPolicy: lazy
Bundle-Activator: org.fortiss.af3.platform.raspberry.AF3PlatformRaspberryActivator
Require-Bundle: org.fortiss.af3.project,
org.fortiss.tooling.kernel;visibility:=reexport,
org.eclipse.core.runtime,
org.eclipse.emf.ecore;visibility:=reexport,
org.fortiss.tooling.base;visibility:=reexport,
org.fortiss.af3.platform;bundle-version="2.5.0";visibility:=reexport,
org.fortiss.tooling.base.ui;bundle-version="2.11.0",
org.fortiss.af3.generator.common
Import-Package: org.fortiss.af3.deployment.generator,
org.fortiss.af3.platform.model
<?xml version="1.0" encoding="UTF-8"?>
<cspecExtension
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:bc="http://www.eclipse.org/buckminster/Common-1.0"
xmlns="http://www.eclipse.org/buckminster/CSpec-1.0">
<actions>
<!-- Place your Actions here -->
<public name="generate-ecore" actor="jdt.ant" always="true">
<actorProperties>
<property key="buildFile" value="model/generate-ecore.xml" />
<property key="targets" value="generate-ecore"/>
</actorProperties>
<products>
<path path="generated-src" />
</products>
</public>
</actions>
<alterGroups>
<!-- Place your Group alterations here -->
<public name="eclipse.build.source">
<attribute name="generate-ecore"/>
</public>
</alterGroups>
</cspecExtension>
# <copyright>
# </copyright>
#
# $Id$
bin.includes = .,\
model/,\
META-INF/,\
plugin.xml,\
plugin.properties
source.. = src/,\
generated-src/
output.. = build/
# The default application name.
ifndef APPL
APPL=my_app
endif
# The default build path.
ifndef BPATH
BPATH=build
endif
# The compiler.
ifndef CROSSCC
CROSSCC=gcc
endif
# The linker.
ifndef CROSSLD
CROSSLD=gcc
endif
# The flags which are passed to the compiler and the linker.
CCFLAGS+=-std=gnu99 -Wall -pthread -lwiringPi -pedantic -c ${patsubst %,-I%,${subst :, ,${IPATH}}}
LDFLAGS+=-std=gnu99 -Wall -pthread -lpthread -lwiringPi -pedantic
# The default rules, i.e. the entry point.
all: ${BPATH}
all: ${BPATH}/${APPL}.run
# The target to clean the build directory.
clean:
@echo "cleaning up path '${BPATH}' ..."
@rm -rf ${BPATH}
# The rule for creating the build directory.
${BPATH}:
@echo "creating path '${BPATH}' ..."
@mkdir ${BPATH}
# The rule for building an object file from the corresponding C source file.
${BPATH}/%.o: %.c
@echo "compiling file '${<}' ..."
@${CROSSCC} ${CCFLAGS} -o ${@} ${<}
# The rule for linking an application.
${BPATH}/%.run:
@echo "linking application '${@}' ..."
@${CROSSLD} ${LDFLAGS} -o ${@} $(filter %.o %.a, ${^})
\ No newline at end of file
/* generated by AutoFOCUS 3 (2.11.0) on Tue May 16 17:42:09 CEST 2017 */
#ifndef __HEADER_data_dictionary_h
#define __HEADER_data_dictionary_h
#if defined(__cplusplus)
typedef bool GEN_TYPE_boolean;
#else
typedef enum Enum_TYPE_boolean {
false = 0, true = 1
} GEN_TYPE_boolean;
#endif
typedef int GEN_TYPE_int;
typedef double GEN_TYPE_double;
/*extern GEN_TYPE_double abs(GEN_TYPE_double _V);
extern GEN_TYPE_double arctan(GEN_TYPE_double _V);
extern GEN_TYPE_double cos(GEN_TYPE_double _V);
extern GEN_TYPE_double cot(GEN_TYPE_double _V);
extern GEN_TYPE_double e();
extern GEN_TYPE_double exp(GEN_TYPE_double _V);
extern GEN_TYPE_double ln(GEN_TYPE_double _V);
extern GEN_TYPE_double pi();
extern GEN_TYPE_double sgn(GEN_TYPE_double _V);
extern GEN_TYPE_double sin(GEN_TYPE_double _V);
extern GEN_TYPE_double sqrt(GEN_TYPE_double _V);
extern GEN_TYPE_double tan(GEN_TYPE_double _V);
extern GEN_TYPE_double _sqrt(GEN_TYPE_double _X,GEN_TYPE_double _V);
extern GEN_TYPE_double pow(GEN_TYPE_double _V,GEN_TYPE_double _N);
extern GEN_TYPE_double factorial(GEN_TYPE_double _V);
extern GEN_TYPE_double min(GEN_TYPE_double _a,GEN_TYPE_double _b);
extern GEN_TYPE_double max(GEN_TYPE_double _a,GEN_TYPE_double _b);
extern GEN_TYPE_double rad2deg(GEN_TYPE_double _A);
extern GEN_TYPE_double deg2rad(GEN_TYPE_double _A);*/
#endif // __HEADER_data_dictionary_h
#ifndef __CANCONNECTOR_H
#define __CANCONNECTOR_H
#include <stdio.h>
#include "inc/libcansocket.h"
#include "inc-gen/data_dictionary.h"
// types
typedef const char* CAN_MSG_T;
typedef unsigned long CAN_CLK_T;
// constants
extern const char* CAN_DEVICE_NAME;
// send and receive
void can_send();
void can_send_clock(CAN_CLK_T counter);
void can_receive();
CAN_CLK_T can_receive_clock();
// init, terminate, prepare
void can_init();
void can_term();
void prepare_input_CanConnector();
void finish_input_CanConnector();
void prepare_output_CanConnector();
void finish_output_CanConnector();
// noval
GEN_TYPE_boolean can_is_noval(CAN_MSG_T msg);
GEN_TYPE_boolean can_set_noval(CAN_MSG_T msg);
// readers
GEN_TYPE_boolean can_read_bool(CAN_MSG_T msg);
GEN_TYPE_double can_read_double(CAN_MSG_T msg);
GEN_TYPE_int can_read_int(CAN_MSG_T pomsgrt);
// writers
void can_write_bool(CAN_MSG_T msg, GEN_TYPE_boolean value);
void can_write_double(CAN_MSG_T msg, GEN_TYPE_double value);
void can_write_int(CAN_MSG_T msg, GEN_TYPE_int value);
#endif // __CANCONNECTOR_H
#ifndef __GPIO_H
#define __GPIO_H
#include <stdio.h>
#include <wiringPi.h>
#include "inc-gen/data_dictionary.h"
// types
typedef int GPIO_PIN_T;
// init, term
void gpio_init(GPIO_PIN_T pin);
void gpio_init_in(GPIO_PIN_T pin);
void gpio_init_out(GPIO_PIN_T pin);
void gpio_term(GPIO_PIN_T pin);
// noval
GEN_TYPE_boolean gpio_is_noval(GPIO_PIN_T pin);
void gpio_set_noval(GPIO_PIN_T pin);
// readers
GEN_TYPE_boolean gpio_read(GPIO_PIN_T pin);
// writers
void gpio_write(GPIO_PIN_T pin, GEN_TYPE_boolean value);
#endif // __GPIO_H
#ifndef __GAMEPAD_H
#define __GAMEPAD_H
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <unistd.h>
#include "inc-gen/data_dictionary.h"
// constants
#define JS_EVENT_BUTTON 0x01
#define JS_EVENT_AXIS 0x02
#define JS_EVENT_INIT 0x80
extern const char* GP_DEVICE_NAME;
// types etc
union input_events {
struct input_btns {
int16_t js1_lr; // LX
int16_t js1_ud; // LY
int16_t js2_lr; // RX
int16_t js2_ud; // RY
int16_t gp_lr; // GPX
int16_t gp_ud; // GPY
int16_t bt_tri; // BTN1
int16_t bt_cir; // BTN2
int16_t bt_x; // BTN3
int16_t bt_sqr; // BTN4
int16_t bt_l1; // L1
int16_t bt_r1; // R1
int16_t bt_l2; // L2
int16_t bt_r2; // R2
int16_t bt_sel; // SELECT
int16_t bt_strt;// START
int16_t js1_bt; // LCLICK
int16_t js2_bt; // RCLICK
} btns;
int16_t inps[18];
};
struct js_event {
uint32_t time; // event time stamp in millisecons
int16_t value; // value
uint8_t type; // event type
uint8_t number; // axis/button number
};
extern volatile union input_events ie;
// worker
void* gp_worker(void* pt_args);
// init, term
void gp_init();
void gp_term();
// readers
GEN_TYPE_boolean gp_btn1_read();
GEN_TYPE_boolean gp_btn2_read();
GEN_TYPE_boolean gp_btn3_read();
GEN_TYPE_boolean gp_btn4_read();
GEN_TYPE_boolean gp_btnL1_read();
GEN_TYPE_boolean gp_btnL2_read();
GEN_TYPE_boolean gp_btnR1_read();
GEN_TYPE_boolean gp_btnR2_read();
GEN_TYPE_double gp_btnLX_read();
GEN_TYPE_double gp_btnLY_read();
GEN_TYPE_double gp_btnRX_read();
GEN_TYPE_double gp_btnRY_read();
// noval
GEN_TYPE_boolean gp_btn1_is_noval();
GEN_TYPE_boolean gp_btn2_is_noval();
GEN_TYPE_boolean gp_btn3_is_noval();
GEN_TYPE_boolean gp_btn4_is_noval();
GEN_TYPE_boolean gp_btnL1_is_noval();
GEN_TYPE_boolean gp_btnL2_is_noval();
GEN_TYPE_boolean gp_btnR1_is_noval();
GEN_TYPE_boolean gp_btnR2_is_noval();
GEN_TYPE_boolean gp_btnLX_is_noval();
GEN_TYPE_boolean gp_btnLY_is_noval();
GEN_TYPE_boolean gp_btnRX_is_noval();
GEN_TYPE_boolean gp_btnRY_is_noval();
#endif // __GAMEPAD_H
#ifndef __LASERRANGEFINDER_H
#define __LASERRANGEFINDER_H
#include <stdlib.h>
#include "inc-gen/data_dictionary.h"
#include "inc/libuart.h"
// constants
const char* LRF_DEVICE_NAME;
// init, terminate
void lrf_init();
void lrf_term();
// getters
GEN_TYPE_boolean lrf_is_noval();
GEN_TYPE_int lrf_read();
#endif // __LASERRANGEFINDER_H
#ifndef __PWM_H
#define __PWM_H
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <termios.h>
#include <fcntl.h>
#include <sys/stat.h>
#include "inc-gen/data_dictionary.h"
#include "inc/libmaestro.h"
// macros
// 6072 is the value for 0, max. value to motor is currently 7572
// from AF3 you get a max. speed value in mm/s : 1471
// Hence, add the constant 6072 and map values -1471-1471 to -1500-1500
#define PWM_ADJUST_VALUE(x) (6072 + 1500 * x /1471)
// types
typedef unsigned char PWM_CHANNEL_T;
// constants
extern const int PWM_SLEEP_TIME;
extern const char* PWM_DEVICE_NAME;
extern const size_t PWM_MAX_NO_CHANNELS;
// worker
void* pwm_worker(void* pt_args);
// init, term
void pwm_init(PWM_CHANNEL_T channel);
void pwm_term(PWM_CHANNEL_T channel);
// writers
void pwm_write(PWM_CHANNEL_T channel, GEN_TYPE_int value);
void pwm_set_noval(PWM_CHANNEL_T channel);
#endif // __PWM_H
#ifndef __IO_H
#define __IO_H
#include "inc-gen/data_dictionary.h"
// init, terminate
void init_left_stick();
void term_left_stick();
void init_right_stick();
void term_right_stick();
// NOVAL
GEN_TYPE_boolean is_noval_left_stick();
GEN_TYPE_boolean is_noval_right_stick();
// readers
GEN_TYPE_double read_left_stick();
GEN_TYPE_double read_right_stick();
// writers
void write_left_stick(GEN_TYPE_double value);
void write_right_stick(GEN_TYPE_double value);
#endif // __IO_H
#ifndef __LIBCANSOCKET_H
#define __LIBCANSOCKET_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <linux/can.h>
#include <linux/can/raw.h>
#define SR_ERR -1
struct can_socket {
int s;
struct sockaddr_can addr;
struct ifreq ifr;
};
/**
* Opens a can socket on the given interface
*/
struct can_socket* can_socket_open(const char *if_name);
/**
* Closes a given socket
*/
void can_socket_close(struct can_socket* sock);
/**
* Sends a can frame on the specified socket
*/
ssize_t can_socket_send(struct can_socket* sock, struct can_frame* frame);
/**
*
*/
ssize_t can_socket_receive(struct can_socket* sock, struct can_frame* frame);
#endif // __LIBCANSOCKET_H
#ifndef __LIBMAESTRO_H
#define __LIBMAESTRO_H
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <termios.h>
int maestroRead(int fd, unsigned char channel);
int maestroWrite(int fd, unsigned char channel, unsigned short target);
#endif // __LIBMAESTRO_H
/**
* @file uart.h
* @author Bianca Forkel
*/
#ifndef MBSE_UART_H
#define MBSE_UART_H
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <errno.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/select.h>
extern int uart_filestream;
char port[13];
int uart_setup(const char*);
int uart_send_byte(char, int);
int uart_send_string(char*, int, int);
int uart_receive(char*, int, int);
void uart_close();
void uart_flush();
#endif
/* generated by AutoFOCUS 3 (2.11.0) on Tue May 16 17:42:09 CEST 2017 */
#include "inc-gen/data_dictionary.h"
/*GEN_TYPE_double abs(GEN_TYPE_double _V){
return _V * sgn(_V);
}
GEN_TYPE_double arctan(GEN_TYPE_double _V){
if (abs(_V) <= 1.0) {
return _V / (1 + (0.28 * _V) * _V);
}
else {
if (_V > 1) {
return pi() / 2.0 - _V / (_V * _V + 0.28);
}
else {
return -(pi() / 2.0) - _V / (_V * _V + 0.28);
}
}
}
GEN_TYPE_double cos(GEN_TYPE_double _V){
return sin((_V + pi() / 2.0));
}
GEN_TYPE_double cot(GEN_TYPE_double _V){
return cos(_V) / sin(_V);
}
GEN_TYPE_double e(){
return 2.718281828459;
}
GEN_TYPE_double exp(GEN_TYPE_double _V){
return ((((1 + _V) + (_V * _V) / 2) + ((_V * _V) * _V) / 6) + (((_V * _V) * _V) * _V) / 24) + ((((_V * _V) * _V) * _V) * _V) / 120;
}
GEN_TYPE_double ln(GEN_TYPE_double _V){
if (_V <= 0) {
return 0;
}
else {
return ((((_V - 1.0) - ((_V - 1.0) * (_V - 1.0)) / 2.0) + (((_V - 1) * (_V - 1)) * (_V - 1)) / 3.0) - ((((_V - 1) * (_V - 1)) * (_V - 1)) * (_V - 1)) / 4.0) + (((((_V - 1) * (_V - 1)) * (_V - 1)) * (_V - 1)) * (_V - 1)) / 5.0;
}
}
GEN_TYPE_double pi(){
return 3.14159265;
}
GEN_TYPE_double sgn(GEN_TYPE_double _V){
if (_V < 0) {
return -1;
}
else {
if (_V == 0) {
return 0;
}
else {
return 1;
}
}
}
GEN_TYPE_double sin(GEN_TYPE_double _V){
if (_V % (2 * pi()) < 0) {
return -sin((-_V));
}
else {
if (_V % (2 * pi()) > pi()) {
return -sin((_V % (2 * pi()) - pi()));
}
else {
if (_V % (2 * pi()) < 0) {
if (1.27323954 * (_V % (2 * pi())) + (0.405284735 * (_V % (2 * pi()))) * (_V % (2 * pi())) < 0) {
return 0.225 * ((1.27323954 * (_V % (2 * pi())) + (0.405284735 * (_V % (2 * pi()))) * (_V % (2 * pi()))) * -(1.27323954 * (_V % (2 * pi())) + (0.405284735 * (_V % (2 * pi()))) * (_V % (2 * pi()))) - (1.27323954 * (_V % (2 * pi())) + (0.405284735 * (_V % (2 * pi()))) * (_V % (2 * pi())))) + (1.27323954 * (_V % (2 * pi())) + (0.405284735 * (_V % (2 * pi()))) * (_V % (2 * pi())));
}
else {
return 0.225 * ((1.27323954 * (_V % (2 * pi())) + (0.405284735 * (_V % (2 * pi()))) * (_V % (2 * pi()))) * (1.27323954 * (_V % (2 * pi())) + (0.405284735 * (_V % (2 * pi()))) * (_V % (2 * pi()))) - (1.27323954 * (_V % (2 * pi())) + (0.405284735 * (_V % (2 * pi()))) * (_V % (2 * pi())))) + (1.27323954 * (_V % (2 * pi())) + (0.405284735 * (_V % (2 * pi()))) * (_V % (2 * pi())));
}
}
else {
if (1.27323954 * (_V % (2 * pi())) - (0.405284735 * (_V % (2 * pi()))) * (_V % (2 * pi())) < 0) {
return 0.225 * ((1.27323954 * (_V % (2 * pi())) - (0.405284735 * (_V % (2 * pi()))) * (_V % (2 * pi()))) * -(1.27323954 * (_V % (2 * pi())) - (0.405284735 * (_V % (2 * pi()))) * (_V % (2 * pi()))) - (1.27323954 * (_V % (2 * pi())) - (0.405284735 * (_V % (2 * pi()))) * (_V % (2 * pi())))) + (1.27323954 * (_V % (2 * pi())) - (0.405284735 * (_V % (2 * pi()))) * (_V % (2 * pi())));
}
else {
return 0.225 * ((1.27323954 * (_V % (2 * pi())) - (0.405284735 * (_V % (2 * pi()))) * (_V % (2 * pi()))) * (1.27323954 * (_V % (2 * pi())) - (0.405284735 * (_V % (2 * pi()))) * (_V % (2 * pi()))) - (1.27323954 * (_V % (2 * pi())) - (0.405284735 * (_V % (2 * pi()))) * (_V % (2 * pi())))) + (1.27323954 * (_V % (2 * pi())) - (0.405284735 * (_V % (2 * pi()))) * (_V % (2 * pi())));
}
}
}
}
}
GEN_TYPE_double sqrt(GEN_TYPE_double _V){
if (_V <= 0) {
return 0;
}
else {
return _sqrt(_V, _sqrt(_V, _sqrt(_V, _sqrt(_V, _sqrt(_V, _sqrt(_V, _sqrt(_V, _sqrt(_V, _sqrt(_V, _sqrt(_V, ((_V + 1.0) / 2.0)))))))))));
}
}
GEN_TYPE_double tan(GEN_TYPE_double _V){
return sin(_V) / cos(_V);
}
GEN_TYPE_double _sqrt(GEN_TYPE_double _X,GEN_TYPE_double _V){
return 0.5 * (_V + _X / _V);
}
GEN_TYPE_double pow(GEN_TYPE_double _V,GEN_TYPE_double _N){
if (_N == 0) {
return 1;
}
else {
if (_N < 0) {
if (_V == 0) {
return 0;
}
else {
return 1.0 / pow(_V, (-_N));
}
}
else {
if (_N == 1) {
return _V;
}
else {
return _V * pow(_V, (_N - 1));
}
}
}
}
GEN_TYPE_double factorial(GEN_TYPE_double _V){
if (_V % 1 != 0) {
return factorial((_V - _V % 1));
}
else {
if (_V == 0 || _V == 1) {
return 1;
}
else {
return factorial((_V - 1)) * _V;
}
}
}
GEN_TYPE_double min(GEN_TYPE_double _a,GEN_TYPE_double _b){
if (_a < _b) {
return _a;
}
return _b;
}
GEN_TYPE_double max(GEN_TYPE_double _a,GEN_TYPE_double _b){
if (_a > _b) {
return _a;
}
return _b;
}
GEN_TYPE_double rad2deg(GEN_TYPE_double _A){
return (_A / pi()) * 180.0;
}
GEN_TYPE_double deg2rad(GEN_TYPE_double _A){
return (_A / 180.0) * pi();
}*/
#include "inc/CanConnector.h"
// constants
const char* CAN_DEVICE_NAME = "can0";
// variables
struct can_socket* can_sock;
// send and receive
void can_send() {
// TODO send and empty buffer
}
void can_send_clock(CAN_CLK_T counter) {
// TODO send clock message with clock counter
}
void can_receive() {
// TODO fill buffer
}
CAN_CLK_T can_receive_clock() {
// TODO receive clock message and return clock counter
}
// init, terminate
void can_init() {
printf("initializing CAN\n");
can_sock = can_socket_open(CAN_DEVICE_NAME);
// TODO init buffers
}
void can_term() {
printf("terminating CAN\n");
can_socket_close(can_sock);
}
void prepare_input_CanConnector() {}
void finish_input_CanConnector() {}
void prepare_output_CanConnector() {}
void finish_output_CanConnector() {}
// noval
GEN_TYPE_boolean can_is_noval(CAN_MSG_T msg) {
return false;
}
GEN_TYPE_boolean can_set_noval(CAN_MSG_T msg) {
return false;
}
// readers
GEN_TYPE_boolean can_read_bool(CAN_MSG_T msg) {
return false; // TODO
}
GEN_TYPE_double can_read_double(CAN_MSG_T msg) {
return 0.0; // TODO
}
GEN_TYPE_int can_read_int(CAN_MSG_T msg) {
return 0; // TODO
}
// writers
void can_write_bool(CAN_MSG_T msg, GEN_TYPE_boolean value) {
// TODO
}
void can_write_double(CAN_MSG_T msg, GEN_TYPE_double value) {
// TODO
}
void can_write_int(CAN_MSG_T msg, GEN_TYPE_int value) {
// TODO
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment