/* * Copyright (C) 2017 Jared Boone, ShareBrained Technology, Inc. * Copyright (C) 2017 Furrtek * * This file is part of PortaPack. * * This program 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 2, or (at your option) * any later version. * * This program 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; see the file COPYING. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, * Boston, MA 02110-1301, USA. */ #ifndef __EMU_CC1101_H__ #define __EMU_CC1101_H__ #include #include #include "utility.hpp" namespace cc1101 { // Data rate (Bauds) // Whitening: Everything except preamble and sync word, init value = 111111111 // Packet format: preamble, sync word, (opt) length, (opt) address, payload, (opt) CRC // Preamble: 8*n bits of 10101010 // Sync word: 2 bytes (can be repeated twice) // Length: 1 byte (address + payload) // 2-FSK: 0=-dev, 1=+dev // 4-FSK: 00=-1/3dev, 01=-dev, 10=1/3dev, 11=+dev (preamble and sync are in 2-FSK) // OOK: PA on or off // ASK: Power can be adjusted // FEC: ? class CC1101Emu { public: //CC1101Emu(); //~CC1101Emu(); enum packet_mode_t { FIXED_LENGTH, VARIABLE_LENGTH, INFINITE_LENGTH }; enum modulation_t { TWO_FSK, GFSK, OOK, FOUR_FSK, MSK, }; void set_sync_word(const uint16_t sync_word) { sync_word_ = sync_word; }; void set_address(const uint8_t address) { address_ = address; }; void set_packet_length(const uint8_t packet_length) { packet_length_ = packet_length; }; void set_data_config(const bool CRC, const bool manchester, const bool whitening) { CRC_ = CRC; manchester_ = manchester; whitening_ = whitening; }; void set_packet_mode(const packet_mode_t packet_mode) { packet_mode_ = packet_mode; }; void set_modulation(const modulation_t modulation) { modulation_ = modulation; } void set_num_preamble(const uint8_t num_preamble) { // 2, 3, 4, 6, 8, 12, 16, or 24 num_preamble_ = num_preamble; }; void set_deviation(const size_t deviation) { deviation_ = deviation; }; private: uint16_t sync_word_ { 0xD391 }; uint8_t address_ { 0x00 }; uint8_t packet_length_ { 0 }; bool CRC_ { false }; bool manchester_ { false }; bool whitening_ { true }; packet_mode_t packet_mode_ { VARIABLE_LENGTH }; modulation_t modulation_ { TWO_FSK }; uint8_t num_preamble_ { 4 }; size_t deviation_ { 4000 }; uint16_t whitening_pn { 0x1FF }; void whitening_init(); uint8_t whiten_byte(uint8_t byte); }; } /* namespace cc1101 */ #endif/*__EMU_CC1101_H__*/