0.1.0 TinyKT0803

This commit is contained in:
Rob Tillaart 2024-03-28 09:38:05 +01:00
parent ff35f013ef
commit 7e418fc5d5
16 changed files with 986 additions and 0 deletions

View File

@ -0,0 +1,28 @@
platforms:
rpipico:
board: rp2040:rp2040:rpipico
package: rp2040:rp2040
gcc:
features:
defines:
- ARDUINO_ARCH_RP2040
warnings:
flags:
packages:
rp2040:rp2040:
url: https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
compile:
# Choosing to run compilation tests on 2 different Arduino platforms
platforms:
# - uno
# - due
# - zero
# - leonardo
# - m4
# - esp32
# - esp8266
# - mega2560
# - rpipico

View File

@ -0,0 +1,4 @@
# These are supported funding model platforms
github: RobTillaart
custom: "https://www.paypal.me/robtillaart"

View File

@ -0,0 +1,14 @@
name: Arduino-lint
on: [push, pull_request]
jobs:
lint:
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@v4
- uses: arduino/arduino-lint-action@v1
with:
library-manager: update
compliance: strict

View File

@ -0,0 +1,19 @@
---
name: Arduino CI
on: [push, pull_request]
jobs:
runTest:
runs-on: ubuntu-latest
timeout-minutes: 20
steps:
- uses: actions/checkout@v4
- uses: ruby/setup-ruby@v1
with:
ruby-version: 2.6
- run: |
# sudo sysctl vm.mmap_rnd_bits=28
gem install arduino_ci
arduino_ci.rb

View File

@ -0,0 +1,19 @@
name: JSON check
on:
push:
paths:
- '**.json'
pull_request:
jobs:
test:
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- uses: actions/checkout@v4
- name: json-syntax-check
uses: limitusus/json-syntax-check@v2
with:
pattern: "\\.json$"

View File

@ -0,0 +1,11 @@
# Change Log TinyKT0803
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](http://keepachangelog.com/)
and this project adheres to [Semantic Versioning](http://semver.org/).
## [0.1.0] - 2024-03-26
- initial version based upon KT0803

View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2023-2024 Rob Tillaart
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -0,0 +1,225 @@
[![Arduino CI](https://github.com/RobTillaart/TinyKT0803/workflows/Arduino%20CI/badge.svg)](https://github.com/marketplace/actions/arduino_ci)
[![Arduino-lint](https://github.com/RobTillaart/TinyKT0803/actions/workflows/arduino-lint.yml/badge.svg)](https://github.com/RobTillaart/TinyKT0803/actions/workflows/arduino-lint.yml)
[![JSON check](https://github.com/RobTillaart/TinyKT0803/actions/workflows/jsoncheck.yml/badge.svg)](https://github.com/RobTillaart/TinyKT0803/actions/workflows/jsoncheck.yml)
[![GitHub issues](https://img.shields.io/github/issues/RobTillaart/TinyKT0803.svg)](https://github.com/RobTillaart/TinyKT0803/issues)
[![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](https://github.com/RobTillaart/TinyKT0803/blob/master/LICENSE)
[![GitHub release](https://img.shields.io/github/release/RobTillaart/TinyKT0803.svg?maxAge=3600)](https://github.com/RobTillaart/TinyKT0803/releases)
[![PlatformIO Registry](https://badges.registry.platformio.org/packages/robtillaart/library/TinyKT0803.svg)](https://registry.platformio.org/libraries/robtillaart/TinyKT0803)
# TinyKT0803
Arduino Library for KT0803 and KT0803K FM transmitter. Tiny85 edition.
### Legal point of attention
In different countries there are different laws with respect to using transmitting devices
and their range.
Please inform yourself of the local rules and laws if and how you may or may not use a
device like the KT0803 in your projects, either hobby, commercial or otherwise.
## Description
This is an **EXPERIMENTAL** port to the Tiny85/45/25 processor of - https://github.com/RobTillaart/KT0803
The library is verified to work - See issue #2
There are two points of attention:
- ATTiny85 needs a 500 ms delay to initialize I2C to communicate properly (assuming 1 MHz clock)
- ATTiny85 needs a decoupling capacitor 100-300 nF between RESET and GND and a 10K resistor between VDC and RESET
Note: The KT0803 library will be leading in development and this one will follow.
The interface section below is identical except for the constructor.
## Interface
```cpp
#include "TinyKT0803.h"
```
#### Constructor
- **TinyKT0803()** constructor.
- **TinyKT0803K()** constructor.
- **bool begin(float freq = 90.0, bool mute = true)** initializes the library.
Furthermore it checks if the deviceAddress is available on the I2C bus.
Default it sets the frequency to 90 MHz and **mutes the signal**.
Returns true if deviceAddress is found on the bus, false otherwise.
- **bool isConnected()** test to see if deviceAddress is found on the I2C-bus.
#### Frequency
- **bool setFrequency(float MHz)** converts the frequency in MHz to
call **setChannel(channel)**. The value of channel is rounded off depending
on the resolution of the device.
Returns false if MHz is out of range or **setChannel()** fails.
- **float getFrequency()** returns the current frequency in MHz, can be slightly different
from the set value due to rounding math mentioned above.
The return value is derived from a call to **getChannel()**
- **bool setChannel(uint16_t channel)** writes the channel to broadcast on to the device.
This involves two or three writes to different device registers.
- **uint16_t getChannel()** reads the selected channel from the device and
returns it.
#### PGA
Read Datasheet.
The KT0803K has a **PGA_LSB** (2 bits) setting, which allows setting the gain
with single (1) dB steps. This is not yet implemented in the library.
- **bool setPGA(uint8_t pga)** sets gain according to table below.
Returns false if pga is out of range (0..7).
- **uint8_t getPGA()** returns 0..7, default 0.
| PGA | gain | notes |
|:-----:|:-------:|:-------:|
| 111 | 12dB |
| 110 | 8dB |
| 101 | 4dB |
| 100 | 0dB |
| 000 | 0dB | default
| 001 | -4dB |
| 010 | -8dB |
| 011 | -12dB |
#### RFGain
Read Datasheet.
Note: the RFGain value (4 bits) is distributed over three registers.
PA_BIAS (register 0x05) is only supported in the KT0803K device.
It is not yet supported in the library.
- **bool setRFGain(uint8_t rfgain)** sets rfgain according to table below.
Returns false if rfgain is out of range (0..15).
- **uint8_t getRFgain()** returns 0..15, default 15.
| RFGAIN | RFout | PA_BIAS = 1 | notes |
|:--------:|:------------:|:------------:|:-------:|
| 0000 | 95.5 dBuV | - |
| 0001 | 96.5 dBuV | - |
| 0010 | 97.5 dBuV | - |
| 0011 | 98.2 dBuV | - |
| 0100 | 98.9 dBuV | - |
| 0101 | 100.0 dBuV | - |
| 0110 | 101.5 dBuV | - |
| 0111 | 102.8 dBuV | - |
| 1000 | 105.1 dBuV | 107.2 dBuV |
| 1001 | 105.6 dBuV | 108.0 dBuV |
| 1010 | 106.2 dBuV | 108.7 dBuV |
| 1011 | 106.5 dBuV | 109.5 dBuV |
| 1100 | 107.0 dBuV | 110.3 dBuV |
| 1101 | 107.4 dBuV | 111.0 dBuV |
| 1110 | 107.7 dBuV | 111.7 dBuV |
| 1111 | 108.0 dBuV | 112.5 dBuV | default
#### Region selection
Read datasheet for details.
Note that not all frequencies are allowed in all regions / countries!
The first four are convenience wrappers for **setPHTCNST()**
If some region is missing please let me know the details and I can add
a wrapper for it.
- **void setEurope()**
- **void setAustralia()**
- **void setUSA()**
- **void setJapan()**
- **bool setPHTCNST(bool on)** See table below.
- **bool getPHTCNST()** returns set value.
| PHTCNST | time | Region |
|:---------:|:-------:|:--------:|
| 0 | 75 μs | USA, Japan, (default)
| 1 | 50 μs | Europe, Australia
#### PilotToneAdjust
Read datasheet.
- **bool setPilotToneAdjust(uint8_t mode)** HIGH = 1 LOW = 0
- **uint8_t getPilotToneAdjust()**
#### Mute
Default the device is not muted, but **begin()** will default mute it.
See interface section above.
- **bool setMute(bool mute)** enables or disables the transmitting
by muting the signal.
- **bool getMute()** returns the current state of muting.
## Preference channels
The device and library do not implement the persistant store of user
selectable preferences (frequencies or channels).
This can be implemented by the user in EEPROM or another persistent medium.
Think of a class that holds an array of channels and optional descriptions.
A minimal hardcoded preset sketch is in the examples.
## Derived classes
A derived class TinyKT0803K class is created, with some extended
functions.
The KT0803L will work as it is backwards compatible with KT0803K.
It has far more registers in use than the KT0803/K.
The KT0803M is identical to the KT0803K (no new registers), so
a derived class is straightforward.
## Interface KT0803K
(not tested), check datasheet.
#### Mono Stereo
- **bool setMono()** idem
- **bool setStereo()** idem
- **bool isStereo()** idem
#### Bass
- **bool setBass(uint8_t bass); // 0..3 = 0, 5, 11, 17 dB
- **uint8_t getBass()** idem
#### Misc
- **bool powerOK()** idem
- **bool silenceDetected()** idem
## Future
See - https://github.com/RobTillaart/KT0803
## Support
If you appreciate my libraries, you can support the development and maintenance.
Improve the quality of the libraries by providing issues and Pull Requests, or
donate through PayPal or GitHub sponsors.
Thank you,

View File

@ -0,0 +1,34 @@
//
// FILE: KT0803_minimal.ino
// AUTHOR: Rob Tillaart
// PURPOSE: minimal demo
// URL: https://github.com/RobTillaart/TinyKT0803
#include "TinyKT0803.h"
TinyKT0803 FM_SEND;
void setup()
{
// Tiny only supports SWSerial
// Serial.begin(115200);
// while(!Serial);
TinyWireM.begin();
// give I2C time to initialize
delay(500);
FM_SEND.begin();
FM_SEND.setChannel(2000); // * 0.05 = 100.00 MHz
FM_SEND.setMute(false);
}
void loop()
{
}
// -- END OF FILE --

View File

@ -0,0 +1,36 @@
// https://github.com/RobTillaart/TinyKT0803/
#include <TinyKT0803.h>
#include <Tiny4kOLED.h>
TinyKT0803 FM_SEND;
void oledInit() {
oled.begin(128, 64, sizeof(tiny4koled_init_128x64br), tiny4koled_init_128x64br);
oled.clear();
oled.on();
}
void oledFreq() {
oled.clear();
oled.setFont(FONT8X16P);
oled.setCursor(20, 2);
oled.print(FM_SEND.getFrequency());
}
void setup() {
TinyWireM.begin();
// give I2C time to initialize (hard coded here)
delay(500);
FM_SEND.begin();
FM_SEND.setFrequency(97.00);
FM_SEND.setMute(false);
oledInit();
oledFreq();
}
void loop() {
//
}

View File

@ -0,0 +1,39 @@
//
// FILE: KT0803_setFrequency.ino
// AUTHOR: Rob Tillaart
// PURPOSE: minimal demo
// URL: https://github.com/RobTillaart/TinyKT0803
#include "TinyKT0803.h"
TinyKT0803 FM_SEND;
void setup()
{
// Tiny only supports SWSerial
// Serial.begin(115200);
// while(!Serial);
TinyWireM.begin();
// give I2C time to initialize (hard coded here)
delay(500);
FM_SEND.begin();
FM_SEND.setFrequency(105.75);
FM_SEND.setMute(false);
// Serial.print("Freq: ");
// Serial.println(FM_SEND.getFrequency());
// Serial.print("Channel: ");
// Serial.println(FM_SEND.getChannel());
}
void loop()
{
}
// -- END OF FILE --

View File

@ -0,0 +1,53 @@
# Syntax Colouring Map For tinyKT0803
# Data types (KEYWORD1)
tinyKT0803 KEYWORD1
tinyKT0803K KEYWORD1
# Methods and Functions (KEYWORD2)
begin KEYWORD2
isConnected KEYWORD2
setFrequency KEYWORD2
getFrequency KEYWORD2
setChannel KEYWORD2
getChannel KEYWORD2
setPGA KEYWORD2
getPGA KEYWORD2
setRFGain KEYWORD2
getRFgain KEYWORD2
setEurope KEYWORD2
setAustralia KEYWORD2
setUSA KEYWORD2
setJapan KEYWORD2
setPHTCNST KEYWORD2
getPHTCNST KEYWORD2
setPilotToneAdjust KEYWORD2
getPilotToneAdjust KEYWORD2
setMute KEYWORD2
getMute KEYWORD2
# KT0803K specific
setMono KEYWORD2
setStereo KEYWORD2
isStereo KEYWORD2
setBass KEYWORD2
getBass KEYWORD2
powerOK KEYWORD2
silenceDetected KEYWORD2
# Constants (LITERAL1)
TINY_KT0803_LIB_VERSION LITERAL1

View File

@ -0,0 +1,23 @@
{
"name": "TinyKT0803",
"keywords": "FM,Broadcast,KT0803K,KT0803L,KT0803M,ATTiny25,ATTiny45,ATTiny85",
"description": "Arduino library for the KT0803 and KT0803K FM transmitter (tiny edition).\n Based upon KT0803.",
"authors":
[
{
"name": "Rob Tillaart",
"email": "Rob.Tillaart@gmail.com",
"maintainer": true
}
],
"repository":
{
"type": "git",
"url": "https://github.com/RobTillaart/TinyKT0803.git"
},
"version": "0.1.0",
"license": "MIT",
"frameworks": "*",
"platforms": "*",
"headers": "TinyKT0803.h"
}

View File

@ -0,0 +1,11 @@
name=TinyKT0803
version=0.1.0
author=Rob Tillaart <rob.tillaart@gmail.com>
maintainer=Rob Tillaart <rob.tillaart@gmail.com>
sentence=Arduino library for the KT0803 and KT0803K FM transmitter.(tiny edition). Based upon KT0803.
paragraph=KT0803K, KT0803L, KT0803M, ATTiny25, ATTiny45, ATTiny85
category=Communication
url=https://github.com/RobTillaart/TinyKT0803
architectures=*
includes=TinyKT0803.h
depends=

View File

@ -0,0 +1,335 @@
//
// FILE: TinyKT0803.cpp
// AUTHOR: Rob Tillaart
// VERSION: 0.1.0
// PURPOSE: Arduino Library for KT0803 and KT0803K FM transmitter. Tiny edition.
// URL: https://github.com/RobTillaart/TinyKT0803
// URL: https://github.com/RobTillaart/KT0803
#include "TinyKT0803.h"
// REGISTERS on page 7 datasheet
TinyKT0803::TinyKT0803()
{
_address = 0x3E;
}
bool TinyKT0803::begin(float freq, bool mute)
{
if (! isConnected()) return false;
if (! setMute(mute)) return false;
return setFrequency(freq);
}
bool TinyKT0803::isConnected()
{
TinyWireM.beginTransmission(_address);
return (TinyWireM.endTransmission() == 0);
}
///////////////////////////////////////////////////////////
//
// FREQUENCY
//
bool TinyKT0803::setFrequency(float MHz)
{
if ((MHz < 70) || (MHz > 108)) return false;
// steps 50 KHz although KT0803 will truncate to 100 KHz.
return setChannel(round(MHz * 20));
}
// MHz
float TinyKT0803::getFrequency()
{
return getChannel() * 0.05;
}
// steps of 50 KHz.
bool TinyKT0803::setChannel(uint16_t channel)
{
if ((channel < 1400) || (channel > 2160)) return false;
// need to split over 3 registers
// register 2 part skipped (always 0) for KT0803
uint16_t ch = channel >> 1;
uint8_t register0 = ch & 0xFF; // CHSEL[8:1]
if (writeData(0x00, register0) == false) return false;
ch >>= 8;
uint8_t register1 = readData(0x01);
register1 &= 0xF8; // CHSEL[11:9]
register1 |= (ch & 0x07); // CHSEL[11:9]
return writeData(0x01, register1);
}
uint16_t TinyKT0803::getChannel()
{
uint16_t channel = readData(0x01) & 0x07;
channel <<= 8;
channel |= readData(0x00);
channel <<= 1;
return channel;
}
///////////////////////////////////////////////////////////
//
// GAIN
//
bool TinyKT0803::setPGA(uint8_t pga)
{
if (pga > 7) return false;
uint8_t data = readData(0x01);
data &= 0xC7; // keep other bits
data |= (pga << 3);
return writeData(0x01, data);
}
uint8_t TinyKT0803::getPGA()
{
return (readData(0x01) >> 3) & 0x07;
}
bool TinyKT0803::setRFGain(uint8_t rfgain)
{
if (rfgain > 15) return false;
// bits 0 and 1
uint8_t data = readData(0x01) & 0x3F;
data |= (rfgain & 0x03) << 6;
writeData(0x01, data);
// bit 2
data = readData(0x13) & 0x7F;
data |= (rfgain & 0x04) << 5;
writeData(0x13, data);
// bit 3
data = readData(0x02) & 0xBF;
data |= (rfgain & 0x08) << 3;
writeData(0x02, data);
return true;
}
uint8_t TinyKT0803::getRFgain()
{
uint8_t data = readData(0x01) >> 6; // bit 0, 1
data |= ((readData(0x13) & 0x80) >> 5); // bit 2
data |= ((readData(0x02) & 0x40) >> 3); // bit 3
return data;
}
bool TinyKT0803::setPHTCNST(bool on)
{
uint8_t data = readData(0x02);
// is the bit already OK
if ((on == true) && (data & 0x01) == 0x01) return true;
if ((on == false) && (data & 0x01) == 0x00) return true;
// otherwise flip the bit
data = data ^ 0x01;
return writeData(0x02, data);
}
///////////////////////////////////////////////////////////
//
// MISC
//
bool TinyKT0803::getPHTCNST()
{
return (readData(0x02) & 0x01) > 0;
}
bool TinyKT0803::setPilotToneAdjust(uint8_t mode)
{
if (mode > 1) return false;
uint8_t data = readData(0x02);
// is the bit already OK
if ((mode == 1) && (data & 0x04) == 0x04) return true;
if ((mode == 0) && (data & 0x04) == 0x00) return true;
// otherwise flip the bit
data = data ^ 0x04;
return writeData(0x02, data);
}
uint8_t TinyKT0803::getPilotToneAdjust()
{
return (readData(0x02) & 0x04) > 0;
}
///////////////////////////////////////////////////////////
//
// MUTE
//
bool TinyKT0803::setMute(bool mute)
{
uint8_t data = readData(0x02);
// is the bit already OK
if ((mute == true) && (data & 0x08) == 0x08) return true;
if ((mute == false) && (data & 0x08) == 0x00) return true;
// otherwise flip the bit
data = data ^ 0x08;
return writeData(0x02, data);
}
bool TinyKT0803::getMute()
{
return (readData(0x02) & 0x08) > 0;
}
///////////////////////////////////////////////////////////////////////
//
// PROTECTED
//
bool TinyKT0803::writeData(uint8_t reg, uint8_t data)
{
TinyWireM.beginTransmission(_address);
TinyWireM.write(reg);
TinyWireM.write(data);
return (TinyWireM.endTransmission() == 0);
}
int TinyKT0803::readData(uint8_t reg)
{
TinyWireM.beginTransmission(_address);
TinyWireM.write(reg);
TinyWireM.endTransmission(false); // explicit no STOP fig 3 page 4
// Behaviour differs from TwoWire class
// returns 0 if OK, not the bytes available.
int rv = TinyWireM.requestFrom(_address, (uint8_t) 1);
if (rv == 0)
{
uint8_t data = TinyWireM.read();
return data;
}
return rv;
}
/////////////////////////////////////////////////////////////////////////////
//
// DERIVED CLASSES
//
TinyKT0803K::TinyKT0803K() : TinyKT0803()
{
}
bool TinyKT0803K::setChannel(uint16_t channel)
{
if ((channel < 1400) || (channel > 2160)) return false;
// need to split over 3 registers
uint16_t ch = channel;
uint8_t register2 = readData(0x02) & 0x7F;
register2 |= (channel & 0x01) << 7; // CHSEL[0]
if (writeData(0x02, register2) == false) return false;
ch >>= 1;
uint8_t register0 = ch & 0xFF; // CHSEL[8:1]
if (writeData(0x00, register0) == false) return false;
ch >>= 8;
uint8_t register1 = readData(0x01);
register1 &= 0xF8; // CHSEL[11:9]
register1 |= (ch & 0x07); // CHSEL[11:9]
return writeData(0x01, register1);
}
uint16_t TinyKT0803K::getChannel()
{
uint16_t channel = readData(0x01) & 0x07;
channel <<= 8;
channel |= readData(0x00);
channel <<= 1;
channel |= (readData(0x02) >> 7);
return channel;
}
///////////////////////////////////////////////////////////
//
// KT0803K SPECIFIC
//
bool TinyKT0803K::setMono()
{
uint8_t register4 = readData(0x04);
if (register4 & (1 << 6))
{
register4 &= ~(1 << 6);
return writeData(0x04, register4);
}
return true;
}
bool TinyKT0803K::setStereo()
{
uint8_t register4 = readData(0x04);
if ((register4 & (1 << 6)) == 0)
{
register4 |= (1 << 6);
return writeData(0x04, register4);
}
return true;
}
bool TinyKT0803K::isStereo()
{
uint8_t register4 = readData(0x04);
return (register4 & (1 << 6));
}
bool TinyKT0803K::setBass(uint8_t bass) // 0..3 = 0, 5, 11, 17 dB
{
if (bass > 3) return false;
uint8_t register4 = readData(0x04);
register4 &= ~0x03; // mask off bits
register4 |= bass;
return writeData(0x04, register4);
}
uint8_t TinyKT0803K::getBass()
{
uint8_t register4 = readData(0x04);
return register4 & 0x03;
}
bool TinyKT0803K::powerOK()
{
uint8_t register0F = readData(0x0F);
return (register0F & (1 << 4)) > 0;
}
bool TinyKT0803K::silenceDetected()
{
uint8_t register0F = readData(0x0F);
return (register0F & (1 << 2)) > 0;
}
// -- END OF FILE --

View File

@ -0,0 +1,114 @@
#pragma once
//
// FILE: TinyKT0803.h
// AUTHOR: Rob Tillaart
// VERSION: 0.1.0
// PURPOSE: Arduino Library for KT0803 and KT0803K FM transmitter. Tiny edition.
// URL: https://github.com/RobTillaart/TinyKT0803
// URL: https://github.com/RobTillaart/KT0803
#include "Arduino.h"
#include "TinyWireM.h"
#define TINY_KT0803_LIB_VERSION (F("0.1.0"))
class TinyKT0803
{
public:
TinyKT0803();
bool begin(float freq = 90.0, bool mute = true);
bool isConnected();
// FM FREQUENCY (70-108)
// KT0803 truncates to 0.1 MHz
// KT0803K (L&M) truncates to 0.05 MHz
bool setFrequency(float MHz);
float getFrequency();
// FM CHANNEL (1400-2160)
// KT0803 only supports even channels
// KT0803K (L&M) supports all channels
bool setChannel(uint16_t channel);
uint16_t getChannel();
// GAIN
bool setPGA(uint8_t pga); // 0-3 = 0..-12dB 4-7 = 0..12dB
// 111: 12dB
// 110: 8dB
// 101: 4dB
// 100: 0dB
// 000: 0dB
// 001: -4dB
// 010: -8dB
// 011: -12dB
uint8_t getPGA();
bool setRFGain(uint8_t rfgain); // 0-15
uint8_t getRFgain();
// REGION SELECTION
// first four are wrappers
void setEurope() { setPHTCNST(true); };
void setAustralia() { setPHTCNST(true); };
void setUSA() { setPHTCNST(false); };
void setJapan() { setPHTCNST(false); };
bool setPHTCNST(bool on);
bool getPHTCNST();
// PILOT TONE ADJUST (PLTADJ)
bool setPilotToneAdjust(uint8_t mode); // HIGH = 1 LOW = 0
uint8_t getPilotToneAdjust();
// MUTE software
bool setMute(bool mute); // true == muted
bool getMute(); // isMuted().
// direct access to registers - debug / develop
// to access not implemented functions.
bool writeData(uint8_t reg, uint8_t data);
int readData(uint8_t reg);
protected:
uint8_t _address = 0x3E; // fixed address for KT0803.
};
/////////////////////////////////////////////////////////////////////////////
//
// DERIVED CLASSES
//
class TinyKT0803K : public TinyKT0803
{
public:
TinyKT0803K();
// CHANNEL
bool setChannel(uint16_t channel);
uint16_t getChannel();
// KT0803K SPECIFIC
bool setMono();
bool setStereo();
bool isStereo();
bool setBass(uint8_t bass); // 0..3 = 0, 5, 11, 17 dB
uint8_t getBass();
bool powerOK();
bool silenceDetected();
};
// -- END OF FILE --