[SSTV] Added Robot36 and Robot72 modes (#1160)
This commit is contained in:
parent
d1bfccd612
commit
fb049cc3af
3 changed files with 158 additions and 81 deletions
|
@ -74,6 +74,8 @@ Wrasse KEYWORD1
|
||||||
PasokonP3 KEYWORD1
|
PasokonP3 KEYWORD1
|
||||||
PasokonP5 KEYWORD1
|
PasokonP5 KEYWORD1
|
||||||
PasokonP7 KEYWORD1
|
PasokonP7 KEYWORD1
|
||||||
|
Robot36 KEYWORD1
|
||||||
|
Robot72 KEYWORD1
|
||||||
|
|
||||||
# Bell Modems
|
# Bell Modems
|
||||||
Bell101 KEYWORD1
|
Bell101 KEYWORD1
|
||||||
|
|
|
@ -8,13 +8,13 @@ const SSTVMode_t Scottie1 {
|
||||||
.scanPixelLen = 432,
|
.scanPixelLen = 432,
|
||||||
.numTones = 7,
|
.numTones = 7,
|
||||||
.tones = {
|
.tones = {
|
||||||
{ .type = tone_t::GENERIC, .len = 1500, .freq = 1500 },
|
{ .type = tone_t::GENERIC, .len = 1500, .freq = 1500 },
|
||||||
{ .type = tone_t::SCAN_GREEN, .len = 0, .freq = 0 },
|
{ .type = tone_t::SCAN_GREEN_Y, .len = 0, .freq = 0 },
|
||||||
{ .type = tone_t::GENERIC, .len = 1500, .freq = 1500 },
|
{ .type = tone_t::GENERIC, .len = 1500, .freq = 1500 },
|
||||||
{ .type = tone_t::SCAN_BLUE, .len = 0, .freq = 0 },
|
{ .type = tone_t::SCAN_BLUE_CB, .len = 0, .freq = 0 },
|
||||||
{ .type = tone_t::GENERIC, .len = 9000, .freq = 1200 },
|
{ .type = tone_t::GENERIC, .len = 9000, .freq = 1200 },
|
||||||
{ .type = tone_t::GENERIC, .len = 1500, .freq = 1500 },
|
{ .type = tone_t::GENERIC, .len = 1500, .freq = 1500 },
|
||||||
{ .type = tone_t::SCAN_RED, .len = 0, .freq = 0 }
|
{ .type = tone_t::SCAN_RED_CR, .len = 0, .freq = 0 }
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -25,13 +25,13 @@ const SSTVMode_t Scottie2 {
|
||||||
.scanPixelLen = 275,
|
.scanPixelLen = 275,
|
||||||
.numTones = 7,
|
.numTones = 7,
|
||||||
.tones = {
|
.tones = {
|
||||||
{ .type = tone_t::GENERIC, .len = 1500, .freq = 1500 },
|
{ .type = tone_t::GENERIC, .len = 1500, .freq = 1500 },
|
||||||
{ .type = tone_t::SCAN_GREEN, .len = 0, .freq = 0 },
|
{ .type = tone_t::SCAN_GREEN_Y, .len = 0, .freq = 0 },
|
||||||
{ .type = tone_t::GENERIC, .len = 1500, .freq = 1500 },
|
{ .type = tone_t::GENERIC, .len = 1500, .freq = 1500 },
|
||||||
{ .type = tone_t::SCAN_BLUE, .len = 0, .freq = 0 },
|
{ .type = tone_t::SCAN_BLUE_CB, .len = 0, .freq = 0 },
|
||||||
{ .type = tone_t::GENERIC, .len = 9000, .freq = 1200 },
|
{ .type = tone_t::GENERIC, .len = 9000, .freq = 1200 },
|
||||||
{ .type = tone_t::GENERIC, .len = 1500, .freq = 1500 },
|
{ .type = tone_t::GENERIC, .len = 1500, .freq = 1500 },
|
||||||
{ .type = tone_t::SCAN_RED, .len = 0, .freq = 0 }
|
{ .type = tone_t::SCAN_RED_CR, .len = 0, .freq = 0 }
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -42,13 +42,13 @@ const SSTVMode_t ScottieDX {
|
||||||
.scanPixelLen = 1080,
|
.scanPixelLen = 1080,
|
||||||
.numTones = 7,
|
.numTones = 7,
|
||||||
.tones = {
|
.tones = {
|
||||||
{ .type = tone_t::GENERIC, .len = 1500, .freq = 1500 },
|
{ .type = tone_t::GENERIC, .len = 1500, .freq = 1500 },
|
||||||
{ .type = tone_t::SCAN_GREEN, .len = 0, .freq = 0 },
|
{ .type = tone_t::SCAN_GREEN_Y, .len = 0, .freq = 0 },
|
||||||
{ .type = tone_t::GENERIC, .len = 1500, .freq = 1500 },
|
{ .type = tone_t::GENERIC, .len = 1500, .freq = 1500 },
|
||||||
{ .type = tone_t::SCAN_BLUE, .len = 0, .freq = 0 },
|
{ .type = tone_t::SCAN_BLUE_CB, .len = 0, .freq = 0 },
|
||||||
{ .type = tone_t::GENERIC, .len = 9000, .freq = 1200 },
|
{ .type = tone_t::GENERIC, .len = 9000, .freq = 1200 },
|
||||||
{ .type = tone_t::GENERIC, .len = 1500, .freq = 1500 },
|
{ .type = tone_t::GENERIC, .len = 1500, .freq = 1500 },
|
||||||
{ .type = tone_t::SCAN_RED, .len = 0, .freq = 0 }
|
{ .type = tone_t::SCAN_RED_CR, .len = 0, .freq = 0 }
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -59,14 +59,14 @@ const SSTVMode_t Martin1 {
|
||||||
.scanPixelLen = 458,
|
.scanPixelLen = 458,
|
||||||
.numTones = 8,
|
.numTones = 8,
|
||||||
.tones = {
|
.tones = {
|
||||||
{ .type = tone_t::GENERIC, .len = 4862, .freq = 1200 },
|
{ .type = tone_t::GENERIC, .len = 4862, .freq = 1200 },
|
||||||
{ .type = tone_t::GENERIC, .len = 572, .freq = 1500 },
|
{ .type = tone_t::GENERIC, .len = 572, .freq = 1500 },
|
||||||
{ .type = tone_t::SCAN_GREEN, .len = 0, .freq = 0 },
|
{ .type = tone_t::SCAN_GREEN_Y, .len = 0, .freq = 0 },
|
||||||
{ .type = tone_t::GENERIC, .len = 572, .freq = 1500 },
|
{ .type = tone_t::GENERIC, .len = 572, .freq = 1500 },
|
||||||
{ .type = tone_t::SCAN_BLUE, .len = 0, .freq = 0 },
|
{ .type = tone_t::SCAN_BLUE_CB, .len = 0, .freq = 0 },
|
||||||
{ .type = tone_t::GENERIC, .len = 572, .freq = 1500 },
|
{ .type = tone_t::GENERIC, .len = 572, .freq = 1500 },
|
||||||
{ .type = tone_t::SCAN_RED, .len = 0, .freq = 0 },
|
{ .type = tone_t::SCAN_RED_CR, .len = 0, .freq = 0 },
|
||||||
{ .type = tone_t::GENERIC, .len = 572, .freq = 1500 }
|
{ .type = tone_t::GENERIC, .len = 572, .freq = 1500 }
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -77,14 +77,14 @@ const SSTVMode_t Martin2 {
|
||||||
.scanPixelLen = 229,
|
.scanPixelLen = 229,
|
||||||
.numTones = 8,
|
.numTones = 8,
|
||||||
.tones = {
|
.tones = {
|
||||||
{ .type = tone_t::GENERIC, .len = 4862, .freq = 1200 },
|
{ .type = tone_t::GENERIC, .len = 4862, .freq = 1200 },
|
||||||
{ .type = tone_t::GENERIC, .len = 572, .freq = 1500 },
|
{ .type = tone_t::GENERIC, .len = 572, .freq = 1500 },
|
||||||
{ .type = tone_t::SCAN_GREEN, .len = 0, .freq = 0 },
|
{ .type = tone_t::SCAN_GREEN_Y, .len = 0, .freq = 0 },
|
||||||
{ .type = tone_t::GENERIC, .len = 572, .freq = 1500 },
|
{ .type = tone_t::GENERIC, .len = 572, .freq = 1500 },
|
||||||
{ .type = tone_t::SCAN_BLUE, .len = 0, .freq = 0 },
|
{ .type = tone_t::SCAN_BLUE_CB, .len = 0, .freq = 0 },
|
||||||
{ .type = tone_t::GENERIC, .len = 572, .freq = 1500 },
|
{ .type = tone_t::GENERIC, .len = 572, .freq = 1500 },
|
||||||
{ .type = tone_t::SCAN_RED, .len = 0, .freq = 0 },
|
{ .type = tone_t::SCAN_RED_CR, .len = 0, .freq = 0 },
|
||||||
{ .type = tone_t::GENERIC, .len = 572, .freq = 1500 }
|
{ .type = tone_t::GENERIC, .len = 572, .freq = 1500 }
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -95,11 +95,11 @@ const SSTVMode_t Wrasse {
|
||||||
.scanPixelLen = 734,
|
.scanPixelLen = 734,
|
||||||
.numTones = 5,
|
.numTones = 5,
|
||||||
.tones = {
|
.tones = {
|
||||||
{ .type = tone_t::GENERIC, .len = 5523, .freq = 1200 },
|
{ .type = tone_t::GENERIC, .len = 5523, .freq = 1200 },
|
||||||
{ .type = tone_t::GENERIC, .len = 500, .freq = 1500 },
|
{ .type = tone_t::GENERIC, .len = 500, .freq = 1500 },
|
||||||
{ .type = tone_t::SCAN_RED, .len = 0, .freq = 0 },
|
{ .type = tone_t::SCAN_RED_CR, .len = 0, .freq = 0 },
|
||||||
{ .type = tone_t::SCAN_GREEN, .len = 0, .freq = 0 },
|
{ .type = tone_t::SCAN_GREEN_Y, .len = 0, .freq = 0 },
|
||||||
{ .type = tone_t::SCAN_BLUE, .len = 0, .freq = 0 }
|
{ .type = tone_t::SCAN_BLUE_CB, .len = 0, .freq = 0 }
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -110,13 +110,13 @@ const SSTVMode_t PasokonP3 {
|
||||||
.scanPixelLen = 208,
|
.scanPixelLen = 208,
|
||||||
.numTones = 7,
|
.numTones = 7,
|
||||||
.tones = {
|
.tones = {
|
||||||
{ .type = tone_t::GENERIC, .len = 5208, .freq = 1200 },
|
{ .type = tone_t::GENERIC, .len = 5208, .freq = 1200 },
|
||||||
{ .type = tone_t::GENERIC, .len = 1042, .freq = 1500 },
|
{ .type = tone_t::GENERIC, .len = 1042, .freq = 1500 },
|
||||||
{ .type = tone_t::SCAN_RED, .len = 0, .freq = 0 },
|
{ .type = tone_t::SCAN_RED_CR, .len = 0, .freq = 0 },
|
||||||
{ .type = tone_t::GENERIC, .len = 1042, .freq = 1500 },
|
{ .type = tone_t::GENERIC, .len = 1042, .freq = 1500 },
|
||||||
{ .type = tone_t::SCAN_GREEN, .len = 0, .freq = 0 },
|
{ .type = tone_t::SCAN_GREEN_Y, .len = 0, .freq = 0 },
|
||||||
{ .type = tone_t::GENERIC, .len = 1042, .freq = 1500 },
|
{ .type = tone_t::GENERIC, .len = 1042, .freq = 1500 },
|
||||||
{ .type = tone_t::SCAN_BLUE, .len = 0, .freq = 0 }
|
{ .type = tone_t::SCAN_BLUE_CB, .len = 0, .freq = 0 }
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -127,13 +127,13 @@ const SSTVMode_t PasokonP5 {
|
||||||
.scanPixelLen = 312,
|
.scanPixelLen = 312,
|
||||||
.numTones = 7,
|
.numTones = 7,
|
||||||
.tones = {
|
.tones = {
|
||||||
{ .type = tone_t::GENERIC, .len = 7813, .freq = 1200 },
|
{ .type = tone_t::GENERIC, .len = 7813, .freq = 1200 },
|
||||||
{ .type = tone_t::GENERIC, .len = 1563, .freq = 1500 },
|
{ .type = tone_t::GENERIC, .len = 1563, .freq = 1500 },
|
||||||
{ .type = tone_t::SCAN_RED, .len = 0, .freq = 0 },
|
{ .type = tone_t::SCAN_RED_CR, .len = 0, .freq = 0 },
|
||||||
{ .type = tone_t::GENERIC, .len = 1563, .freq = 1500 },
|
{ .type = tone_t::GENERIC, .len = 1563, .freq = 1500 },
|
||||||
{ .type = tone_t::SCAN_GREEN, .len = 0, .freq = 0 },
|
{ .type = tone_t::SCAN_GREEN_Y, .len = 0, .freq = 0 },
|
||||||
{ .type = tone_t::GENERIC, .len = 1563, .freq = 1500 },
|
{ .type = tone_t::GENERIC, .len = 1563, .freq = 1500 },
|
||||||
{ .type = tone_t::SCAN_BLUE, .len = 0, .freq = 0 }
|
{ .type = tone_t::SCAN_BLUE_CB, .len = 0, .freq = 0 }
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -144,13 +144,48 @@ const SSTVMode_t PasokonP7 {
|
||||||
.scanPixelLen = 417,
|
.scanPixelLen = 417,
|
||||||
.numTones = 7,
|
.numTones = 7,
|
||||||
.tones = {
|
.tones = {
|
||||||
{ .type = tone_t::GENERIC, .len = 10417, .freq = 1200 },
|
{ .type = tone_t::GENERIC, .len = 10417, .freq = 1200 },
|
||||||
{ .type = tone_t::GENERIC, .len = 2083, .freq = 1500 },
|
{ .type = tone_t::GENERIC, .len = 2083, .freq = 1500 },
|
||||||
{ .type = tone_t::SCAN_RED, .len = 0, .freq = 0 },
|
{ .type = tone_t::SCAN_RED_CR, .len = 0, .freq = 0 },
|
||||||
{ .type = tone_t::GENERIC, .len = 2083, .freq = 1500 },
|
{ .type = tone_t::GENERIC, .len = 2083, .freq = 1500 },
|
||||||
{ .type = tone_t::SCAN_GREEN, .len = 0, .freq = 0 },
|
{ .type = tone_t::SCAN_GREEN_Y, .len = 0, .freq = 0 },
|
||||||
{ .type = tone_t::GENERIC, .len = 2083, .freq = 1500 },
|
{ .type = tone_t::GENERIC, .len = 2083, .freq = 1500 },
|
||||||
{ .type = tone_t::SCAN_BLUE, .len = 0, .freq = 0 }
|
{ .type = tone_t::SCAN_BLUE_CB, .len = 0, .freq = 0 }
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const SSTVMode_t Robot36 {
|
||||||
|
.visCode = RADIOLIB_SSTV_ROBOT_36,
|
||||||
|
.width = 320,
|
||||||
|
.height = 240,
|
||||||
|
.scanPixelLen = 275, // this is the Y-scan length, Cb/Cr are one half
|
||||||
|
.numTones = 6,
|
||||||
|
.tones = {
|
||||||
|
{ .type = tone_t::GENERIC, .len = 9000, .freq = 1200 },
|
||||||
|
{ .type = tone_t::GENERIC, .len = 3000, .freq = 1500 },
|
||||||
|
{ .type = tone_t::SCAN_GREEN_Y, .len = 0, .freq = 0 },
|
||||||
|
{ .type = tone_t::GENERIC, .len = 4500, .freq = 1500 },
|
||||||
|
{ .type = tone_t::GENERIC, .len = 1500, .freq = 1900 },
|
||||||
|
{ .type = tone_t::SCAN_BLUE_CB, .len = 0, .freq = 0 }, // on even lines, this is the Cr component
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const SSTVMode_t Robot72 {
|
||||||
|
.visCode = RADIOLIB_SSTV_ROBOT_72,
|
||||||
|
.width = 320,
|
||||||
|
.height = 240,
|
||||||
|
.scanPixelLen = 431, // this is the Y-scan length, Cb/Cr are one half
|
||||||
|
.numTones = 9,
|
||||||
|
.tones = {
|
||||||
|
{ .type = tone_t::GENERIC, .len = 9000, .freq = 1200 },
|
||||||
|
{ .type = tone_t::GENERIC, .len = 3000, .freq = 1500 },
|
||||||
|
{ .type = tone_t::SCAN_GREEN_Y, .len = 0, .freq = 0 },
|
||||||
|
{ .type = tone_t::GENERIC, .len = 4500, .freq = 1500 },
|
||||||
|
{ .type = tone_t::GENERIC, .len = 1500, .freq = 1900 },
|
||||||
|
{ .type = tone_t::SCAN_RED_CR, .len = 0, .freq = 0 },
|
||||||
|
{ .type = tone_t::GENERIC, .len = 4500, .freq = 2300 },
|
||||||
|
{ .type = tone_t::GENERIC, .len = 1500, .freq = 1500 },
|
||||||
|
{ .type = tone_t::SCAN_BLUE_CB, .len = 0, .freq = 0 },
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -210,8 +245,8 @@ void SSTVClient::idle() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void SSTVClient::sendHeader() {
|
void SSTVClient::sendHeader() {
|
||||||
// save first header flag for Scottie modes
|
// reset line counter
|
||||||
firstLine = true;
|
lineCount = 0;
|
||||||
phyLayer->transmitDirect();
|
phyLayer->transmitDirect();
|
||||||
|
|
||||||
// send the first part of header (leader-break-leader)
|
// send the first part of header (leader-break-leader)
|
||||||
|
@ -247,10 +282,8 @@ void SSTVClient::sendHeader() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void SSTVClient::sendLine(const uint32_t* imgLine) {
|
void SSTVClient::sendLine(const uint32_t* imgLine) {
|
||||||
// check first line flag in Scottie modes
|
// check first line in Scottie modes
|
||||||
if(firstLine && ((txMode.visCode == RADIOLIB_SSTV_SCOTTIE_1) || (txMode.visCode == RADIOLIB_SSTV_SCOTTIE_2) || (txMode.visCode == RADIOLIB_SSTV_SCOTTIE_DX))) {
|
if((lineCount == 0) && ((txMode.visCode == RADIOLIB_SSTV_SCOTTIE_1) || (txMode.visCode == RADIOLIB_SSTV_SCOTTIE_2) || (txMode.visCode == RADIOLIB_SSTV_SCOTTIE_DX))) {
|
||||||
firstLine = false;
|
|
||||||
|
|
||||||
// send start sync tone
|
// send start sync tone
|
||||||
this->tone(RADIOLIB_SSTV_TONE_BREAK, 9000);
|
this->tone(RADIOLIB_SSTV_TONE_BREAK, 9000);
|
||||||
}
|
}
|
||||||
|
@ -258,31 +291,67 @@ void SSTVClient::sendLine(const uint32_t* imgLine) {
|
||||||
// send all tones in sequence
|
// send all tones in sequence
|
||||||
for(uint8_t i = 0; i < txMode.numTones; i++) {
|
for(uint8_t i = 0; i < txMode.numTones; i++) {
|
||||||
if((txMode.tones[i].type == tone_t::GENERIC) && (txMode.tones[i].len > 0)) {
|
if((txMode.tones[i].type == tone_t::GENERIC) && (txMode.tones[i].len > 0)) {
|
||||||
|
// Robot36 has different separator tones for even and odd lines
|
||||||
|
uint32_t freq = txMode.tones[i].freq;
|
||||||
|
if((txMode.visCode == RADIOLIB_SSTV_ROBOT_36) && (i == 3)) {
|
||||||
|
freq = (lineCount % 2) ? 2300 : txMode.tones[3].freq;
|
||||||
|
}
|
||||||
|
|
||||||
// sync/porch tones
|
// sync/porch tones
|
||||||
this->tone(txMode.tones[i].freq, txMode.tones[i].len);
|
this->tone(freq, txMode.tones[i].len);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// scan lines
|
// scan lines
|
||||||
for(uint16_t j = 0; j < txMode.width; j++) {
|
for(uint16_t j = 0; j < txMode.width; j++) {
|
||||||
uint32_t color = imgLine[j];
|
uint32_t color = imgLine[j];
|
||||||
|
uint32_t len = txMode.scanPixelLen;
|
||||||
|
|
||||||
|
// Robot modes work in YCbCr
|
||||||
|
if((txMode.visCode == RADIOLIB_SSTV_ROBOT_36) || (txMode.visCode == RADIOLIB_SSTV_ROBOT_72)) {
|
||||||
|
uint8_t r = (color & 0x00FF0000) >> 16;
|
||||||
|
uint8_t g = (color & 0x0000FF00) >> 8;
|
||||||
|
uint8_t b = (color & 0x000000FF);
|
||||||
|
uint8_t y = 16.0 + (0.003906 * ((65.738 * r) + (129.057 * g) + (25.064 * b)));
|
||||||
|
uint8_t cb = 128.0 + (0.003906 * ((-37.945 * r) + (-74.494 * g) + (112.439 * b)));
|
||||||
|
uint8_t cr = 128.0 + (0.003906 * ((112.439 * r) + (-94.154 * g) + (-18.285 * b)));
|
||||||
|
color = ((uint32_t)y << 8);
|
||||||
|
if(txMode.visCode == RADIOLIB_SSTV_ROBOT_36) {
|
||||||
|
// odd lines carry Cb, even lines carry Cr
|
||||||
|
color |= (lineCount % 2) ? cb : cr;
|
||||||
|
} else {
|
||||||
|
color |= ((uint32_t)cr << 16) | cb;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
switch(txMode.tones[i].type) {
|
switch(txMode.tones[i].type) {
|
||||||
case(tone_t::SCAN_RED):
|
case(tone_t::SCAN_RED_CR):
|
||||||
color &= 0x00FF0000;
|
color &= 0x00FF0000;
|
||||||
color >>= 16;
|
color >>= 16;
|
||||||
|
if((txMode.visCode == RADIOLIB_SSTV_ROBOT_36) || (txMode.visCode == RADIOLIB_SSTV_ROBOT_72)) {
|
||||||
|
len /= 2;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case(tone_t::SCAN_GREEN):
|
case(tone_t::SCAN_GREEN_Y):
|
||||||
color &= 0x0000FF00;
|
color &= 0x0000FF00;
|
||||||
color >>= 8;
|
color >>= 8;
|
||||||
break;
|
break;
|
||||||
case(tone_t::SCAN_BLUE):
|
case(tone_t::SCAN_BLUE_CB):
|
||||||
color &= 0x000000FF;
|
color &= 0x000000FF;
|
||||||
|
if((txMode.visCode == RADIOLIB_SSTV_ROBOT_36) || (txMode.visCode == RADIOLIB_SSTV_ROBOT_72)) {
|
||||||
|
len /= 2;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case(tone_t::GENERIC):
|
case(tone_t::GENERIC):
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
this->tone(RADIOLIB_SSTV_TONE_BRIGHTNESS_MIN + ((float)color * 3.1372549), txMode.scanPixelLen);
|
this->tone(RADIOLIB_SSTV_TONE_BRIGHTNESS_MIN + ((float)color * 3.1372549), len);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// increment line counter (needed for Robot36 mode)
|
||||||
|
lineCount++;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t SSTVClient::getPictureHeight() const {
|
uint16_t SSTVClient::getPictureHeight() const {
|
||||||
|
|
|
@ -21,6 +21,8 @@
|
||||||
#define RADIOLIB_SSTV_PASOKON_P3 113
|
#define RADIOLIB_SSTV_PASOKON_P3 113
|
||||||
#define RADIOLIB_SSTV_PASOKON_P5 114
|
#define RADIOLIB_SSTV_PASOKON_P5 114
|
||||||
#define RADIOLIB_SSTV_PASOKON_P7 115
|
#define RADIOLIB_SSTV_PASOKON_P7 115
|
||||||
|
#define RADIOLIB_SSTV_ROBOT_36 8
|
||||||
|
#define RADIOLIB_SSTV_ROBOT_72 12
|
||||||
|
|
||||||
// SSTV tones in Hz
|
// SSTV tones in Hz
|
||||||
#define RADIOLIB_SSTV_TONE_LEADER 1900
|
#define RADIOLIB_SSTV_TONE_LEADER 1900
|
||||||
|
@ -46,9 +48,9 @@ struct tone_t {
|
||||||
*/
|
*/
|
||||||
enum {
|
enum {
|
||||||
GENERIC = 0,
|
GENERIC = 0,
|
||||||
SCAN_GREEN,
|
SCAN_GREEN_Y,
|
||||||
SCAN_BLUE,
|
SCAN_BLUE_CB,
|
||||||
SCAN_RED
|
SCAN_RED_CR
|
||||||
} type;
|
} type;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -96,7 +98,7 @@ struct SSTVMode_t {
|
||||||
/*!
|
/*!
|
||||||
\brief Sequence of tones in each transmission line. This is used to create the correct encoding sequence.
|
\brief Sequence of tones in each transmission line. This is used to create the correct encoding sequence.
|
||||||
*/
|
*/
|
||||||
tone_t tones[8];
|
tone_t tones[9];
|
||||||
};
|
};
|
||||||
|
|
||||||
// all currently supported SSTV modes
|
// all currently supported SSTV modes
|
||||||
|
@ -109,6 +111,8 @@ extern const SSTVMode_t Wrasse;
|
||||||
extern const SSTVMode_t PasokonP3;
|
extern const SSTVMode_t PasokonP3;
|
||||||
extern const SSTVMode_t PasokonP5;
|
extern const SSTVMode_t PasokonP5;
|
||||||
extern const SSTVMode_t PasokonP7;
|
extern const SSTVMode_t PasokonP7;
|
||||||
|
extern const SSTVMode_t Robot36;
|
||||||
|
extern const SSTVMode_t Robot72;
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\class SSTVClient
|
\class SSTVClient
|
||||||
|
@ -136,7 +140,8 @@ class SSTVClient {
|
||||||
\brief Initialization method for 2-FSK.
|
\brief Initialization method for 2-FSK.
|
||||||
\param base Base "0 Hz tone" RF frequency to be used in MHz.
|
\param base Base "0 Hz tone" RF frequency to be used in MHz.
|
||||||
\param mode SSTV mode to be used. Currently supported modes are Scottie1, Scottie2,
|
\param mode SSTV mode to be used. Currently supported modes are Scottie1, Scottie2,
|
||||||
ScottieDX, Martin1, Martin2, Wrasse, PasokonP3, PasokonP5 and PasokonP7.
|
ScottieDX, Martin1, Martin2, Wrasse, PasokonP3, PasokonP5 and PasokonP7,
|
||||||
|
Robot36 and Robot37.
|
||||||
\returns \ref status_codes
|
\returns \ref status_codes
|
||||||
*/
|
*/
|
||||||
int16_t begin(float base, const SSTVMode_t& mode);
|
int16_t begin(float base, const SSTVMode_t& mode);
|
||||||
|
@ -145,7 +150,8 @@ class SSTVClient {
|
||||||
/*!
|
/*!
|
||||||
\brief Initialization method for AFSK.
|
\brief Initialization method for AFSK.
|
||||||
\param mode SSTV mode to be used. Currently supported modes are Scottie1, Scottie2,
|
\param mode SSTV mode to be used. Currently supported modes are Scottie1, Scottie2,
|
||||||
ScottieDX, Martin1, Martin2, Wrasse, PasokonP3, PasokonP5 and PasokonP7.
|
ScottieDX, Martin1, Martin2, Wrasse, PasokonP3, PasokonP5 and PasokonP7,
|
||||||
|
Robot36 and Robot37.
|
||||||
\returns \ref status_codes
|
\returns \ref status_codes
|
||||||
*/
|
*/
|
||||||
int16_t begin(const SSTVMode_t& mode);
|
int16_t begin(const SSTVMode_t& mode);
|
||||||
|
@ -192,7 +198,7 @@ class SSTVClient {
|
||||||
|
|
||||||
uint32_t baseFreq = 0;
|
uint32_t baseFreq = 0;
|
||||||
SSTVMode_t txMode = Scottie1;
|
SSTVMode_t txMode = Scottie1;
|
||||||
bool firstLine = true;
|
uint32_t lineCount = 0;
|
||||||
|
|
||||||
void tone(float freq, RadioLibTime_t len = 0);
|
void tone(float freq, RadioLibTime_t len = 0);
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Reference in a new issue