initial commit

This commit is contained in:
willem oldemans
2020-10-01 08:35:17 +02:00
commit 8294950b63
2 changed files with 294 additions and 0 deletions

123
radio.cpp Normal file
View File

@@ -0,0 +1,123 @@
#include <Arduino.h>
#include <RHReliableDatagram.h>
#include <RH_NRF24.h>
#include <SPI.h>
#include "radio.h"
static unsigned long lastSerialTime;
RcData data;
RcData* getDataptr( void )
{
return &data;
}
void radio_c::begin( )
{
if (!RadioManager.init())
{
Serial.println("init failed");
}
}
bool radio_c::transmitData( void )
{
RcData* data = getDataptr();
uint8_t* payload = data->getByteArray();
if (RadioManager.sendtoWait(payload, sizeof(payload), m_myaddress))
{
// Now wait for a reply from the server
uint8_t len = sizeof(buf);
uint8_t from;
if (RadioManager.recvfromAckTimeout(buf, &len, 2000, &from))
{
Serial.print("got reply from : 0x");
Serial.print(from, HEX);
Serial.print(": ");
Serial.println((char*)buf);
return true;
}
else
{
Serial.println("No reply, is nrf24_reliable_datagram_server running?");
return false;
}
}
else
{
Serial.println("sending failed");
return false;
}
}
bool radio_c::receiveData( void )
{
RcData* data = getDataptr();
if (RadioManager.available())
{
// Wait for a message addressed to us from the client
uint8_t len = sizeof(buf);
uint8_t from;
if (RadioManager.recvfromAck(buf, &len, &from))
{
lastRecvTime = millis();
if(!data->setRcData(buf))
{
#ifdef DEBUG
Serial.println("package inclompete")
#endif
return false;
}
// Send a reply back to the originator client, check for error
if (!RadioManager.sendtoWait(data->getReturnData(), sizeof(data->getReturnData()), from))
{
#ifdef DEBUG
Serial.println("sendtoWait failed");
#endif
return false;
}
}
// set all analog values to their middle position, if no RC signal is received during 1s!
if (millis() - lastRecvTime > 1000)
{
data->setfailsafe();
#ifdef DEBUG
Serial.println("No Radio Available - Check Transmitter!");
#endif
return false;
}
if (millis() - lastRecvTime > 2000) {
begin(); // re-initialize radio
lastRecvTime = millis();
return false;
}
}
return true;
}
void sendSerialCommands( void )
{
RcData* data = getDataptr();
if (millis() - lastSerialTime > 20) { // Send the data every 20ms
lastSerialTime = millis();
Serial.print('<'); // Start marker
Serial.println(data->axis1);
Serial.println(data->axis2);
Serial.println(data->axis3);
Serial.println(data->axis4);
Serial.println(data->pot);
Serial.println(data->momentary1);
Serial.println(data->momentary2);
Serial.println(data->getfailsafe());
Serial.print('>'); // End marker
}
}

171
radio.h Normal file
View File

@@ -0,0 +1,171 @@
#ifndef RADIOH
#define RADIOH
#include <Arduino.h>
#include <RHReliableDatagram.h>
#include <RH_NRF24.h>
#include <SPI.h>
enum dataFields
{
AXIS1=0,
AXIS2,
AXIS3,
AXIS4,
POT,
MODE1,
MODE2,
MOMENTARY1,
MOMENTARY2,
FAILSAFE,
DUMMY,
LASTDATAFIELD
};
class RcData
{
const byte dummy;
uint8_t dataArray[LASTDATAFIELD];
public:
RcData():dummy(0xAA)
{
// All axes to neutral position
clearData();
}
byte axis1;
byte axis2;
byte axis3;
byte axis4;
byte pot;
bool mode1;
bool mode2;
bool momentary1; // Momentary push button
bool momentary2;
bool failsafe;
//return data
int voltage;
bool batteryOk;
int dx;
int dy;
int dz;
void setfailsafe( void)
{
failsafe = true;
clearData();
}
void clearFailsafe( void )
{
failsafe = false;
}
bool getfailsafe( void )
{
return failsafe;
}
void clearData( void )
{
axis1 = 50;
axis2 = 50;
axis3 = 50;
axis4 = 50;
pot = 50;
batteryOk = true;
mode1 = false;
mode2 = false;
momentary2 = false;
momentary1 = false;
failsafe = false;
voltage = 0;
dx=0;
dy=0;
dz=0;
}
uint8_t* getByteArray( void )
{
dataArray[AXIS1] = axis1;
dataArray[AXIS2] = axis2;
dataArray[AXIS3] = axis3;
dataArray[AXIS4] = axis4;
dataArray[MODE1] = mode1;
dataArray[MODE2] = mode2;
dataArray[POT] = pot;
dataArray[MOMENTARY1] = uint8_t (momentary1);
dataArray[MOMENTARY2] = uint8_t (momentary2);
dataArray[FAILSAFE] = byte (failsafe);
dataArray[DUMMY] = dummy;
return dataArray;
}
uint8_t* getReturnData( void )
{
dataArray[0] = voltage;
dataArray[1] = dx;
dataArray[2] = dy;
dataArray[3] = dz;
dataArray[4] = 0;
dataArray[5] = 0;
dataArray[6] = 0;
dataArray[7] = 0;
dataArray[DUMMY] = dummy;
return dataArray;
}
bool setRcData( uint8_t* buf )
{
if (dataArray[DUMMY] == dummy)
{
axis1 = dataArray[AXIS1];
axis2 = dataArray[AXIS2];
axis3 = dataArray[AXIS3];
axis4 = dataArray[AXIS4];
mode1 = dataArray[MODE1];
mode2 = dataArray[MODE2];
pot = dataArray[POT];
momentary1 = bool(dataArray[MOMENTARY1]);
momentary2 = bool(dataArray[MOMENTARY2]);
failsafe = bool(dataArray[FAILSAFE]);
return true;
}
return false;
}
void setVoltage( int volt)
{
voltage = volt;
}
};
class radio_c
{
uint8_t buf[RH_NRF24_MAX_MESSAGE_LEN];
// Create an instance of the radio driver
RH_NRF24 RadioDriver;
// Sets the radio driver to NRF24 and the client address to 1
RHReliableDatagram RadioManager;
int m_myaddress;
unsigned long lastRecvTime;
public:
radio_c(int address, int CE, int CSN) :RadioDriver(CE, CSN), RadioManager(RadioDriver, address) {};
void begin( void );
bool transmitData( void );
bool receiveData( void );
};
void sendSerialCommands( void );
RcData* getDataptr( void );
#endif //RADIOH