mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-01-19 23:28:32 -04:00
79b004cf6a
This allows to use a Solo controller to control Linux-based flight controllers. The protocol has been derived by analyzing a tcpdump trace: some fields are ignored. Example trace of RC data (obtained with `tshark -T fields -e data -n -c 5 -r rc.pcap` unkonwn seq ch1 ch2 ch3 ... ch8 5fa8 f441 3414 0500 73d7 dc05 dc05 dc05 db05 e803 e803 e803 f401 73f6 f441 3414 0500 74d7 dc05 dc05 dc05 db05 e803 e803 e803 f401 dc44 f541 3414 0500 75d7 dc05 dc05 dc05 db05 e803 e803 e803 f401 bc92 f541 3414 0500 76d7 dc05 dc05 dc05 db05 e803 e803 e803 f401 dfe0 f541 3414 0500 77d7 dc05 dc05 dc05 db05 e803 e803 e803 f401
61 lines
1.5 KiB
C++
61 lines
1.5 KiB
C++
/*
|
|
* Copyright (C) 2017 Intel Corporation. All rights reserved.
|
|
*
|
|
* This file is free software: you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License as published by the
|
|
* Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This file is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
* See the GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
#pragma once
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <AP_HAL/utility/Socket.h>
|
|
#include <AP_HAL/utility/sparse-endian.h>
|
|
|
|
#include "RCInput.h"
|
|
|
|
namespace Linux {
|
|
|
|
class RCInput_SoloLink : public RCInput
|
|
{
|
|
public:
|
|
RCInput_SoloLink();
|
|
|
|
void init();
|
|
void _timer_tick();
|
|
|
|
private:
|
|
static const unsigned int PACKET_LEN = 26;
|
|
static const unsigned int PORT = 5005;
|
|
|
|
union packet {
|
|
struct PACKED {
|
|
/* changes at every packet */
|
|
uint32_t _unknown0;
|
|
/* apparently doesn't change: version? */
|
|
uint32_t _unknown1;
|
|
le16_t seq;
|
|
le16_t channel[8];
|
|
};
|
|
uint8_t buf[PACKET_LEN];
|
|
};
|
|
|
|
bool _check_hdr(ssize_t len);
|
|
|
|
SocketAPM _socket{true};
|
|
uint64_t _last_usec = 0;
|
|
uint16_t _last_seq = 0;
|
|
union packet _packet;
|
|
};
|
|
|
|
}
|