quite a lot of stuff, can't list them all here (approaching 1.9)

This commit is contained in:
2026-04-25 18:13:09 +02:00
parent d79c238924
commit 4b904bc720
20 changed files with 639 additions and 628 deletions
+240 -143
View File
@@ -76,201 +76,299 @@ uint8_t add_rds_af(RDSAFs *af_list, float freq) {
return 0;
}
char *convert_to_rdscharset(const char *str) {
static char new_str[255];
uint8_t i = 0;
void convert_to_rdscharset(const char *str, char *output, size_t buffer_size) {
size_t i = 0;
while (*str != 0 && i < 255) {
while (*str != 0 && i < buffer_size) {
// The following line is neccesary for the charset.py to work properly
// CHARSET START
switch(*str) {
case (char)0x0a: output[i] = (char)0x0a; break; // N/A
case (char)0x0d: output[i] = (char)0x0d; break; // N/A
case (char)0x1f: output[i] = (char)0x1f; break; // N/A
case (char)0x20: output[i] = (char)0x20; break; // SPACE
case (char)0x21: output[i] = (char)0x21; break; // EXCLAMATION MARK
case (char)0x22: output[i] = (char)0x22; break; // QUOTATION MARK
case (char)0x23: output[i] = (char)0x23; break; // NUMBER SIGN
case (char)0xc2:
str++;
switch(*str) {
case (char)0xa4: new_str[i] = (char)0x24; break; // CURRENCY SIGN
case (char)0xa1: new_str[i] = (char)0x8e; break; // INVERTED EXCLAMATION MARK
case (char)0xaa: new_str[i] = (char)0xa0; break; // FEMININE ORDINAL INDICATOR
case (char)0xa9: new_str[i] = (char)0xa2; break; // COPYRIGHT SIGN
case (char)0xa3: new_str[i] = (char)0xaa; break; // POUND SIGN
case (char)0xba: new_str[i] = (char)0xb0; break; // MASCULINE ORDINAL INDICATOR
case (char)0xb9: new_str[i] = (char)0xb1; break; // SUPERSCRIPT ONE
case (char)0xb1: new_str[i] = (char)0xb4; break; // PLUS-MINUS SIGN
case (char)0xb5: new_str[i] = (char)0xb8; break; // MICRO SIGN
case (char)0xbf: new_str[i] = (char)0xb9; break; // INVERTED QUESTION MARK
case (char)0xb0: new_str[i] = (char)0xbb; break; // DEGREE SIGN
case (char)0xa7: new_str[i] = (char)0xbf; break; // SECTION SIGN
default: new_str[i] = (char)0x3f; break; // QUESTION MARK
case (char)0xa4: output[i] = (char)0x24; break; // CURRENCY SIGN
case (char)0xa1: output[i] = (char)0x8e; break; // INVERTED EXCLAMATION MARK
case (char)0xaa: output[i] = (char)0xa0; break; // FEMININE ORDINAL INDICATOR
case (char)0xa9: output[i] = (char)0xa2; break; // COPYRIGHT SIGN
case (char)0xa3: output[i] = (char)0xaa; break; // POUND SIGN
case (char)0xba: output[i] = (char)0xb0; break; // MASCULINE ORDINAL INDICATOR
case (char)0xb9: output[i] = (char)0xb1; break; // SUPERSCRIPT ONE
case (char)0xb2: output[i] = (char)0xb2; break; // SUPERSCRIPT TWO
case (char)0xb3: output[i] = (char)0xb3; break; // SUPERSCRIPT THREE
case (char)0xb1: output[i] = (char)0xb4; break; // PLUS-MINUS SIGN
case (char)0xb5: output[i] = (char)0xb8; break; // MICRO SIGN
case (char)0xbf: output[i] = (char)0xb9; break; // INVERTED QUESTION MARK
case (char)0xb0: output[i] = (char)0xbb; break; // DEGREE SIGN
case (char)0xbc: output[i] = (char)0xbc; break; // VULGAR FRACTION ONE QUARTER
case (char)0xbd: output[i] = (char)0xbd; break; // VULGAR FRACTION ONE HALF
case (char)0xbe: output[i] = (char)0xbe; break; // VULGAR FRACTION THREE QUARTERS
case (char)0xa7: output[i] = (char)0xbf; break; // SECTION SIGN
default: output[i] = (char)0x3f; break; // QUESTION MARK
}
break;
case (char)0x25: output[i] = (char)0x25; break; // PERCENT SIGN
case (char)0x26: output[i] = (char)0x26; break; // AMPERSAND
case (char)0x27: output[i] = (char)0x27; break; // APOSTROPHE
case (char)0x28: output[i] = (char)0x28; break; // LEFT PARENTHESIS
case (char)0x29: output[i] = (char)0x29; break; // RIGHT PARENTHESIS
case (char)0x2a: output[i] = (char)0x2a; break; // ASTERISK
case (char)0x2b: output[i] = (char)0x2b; break; // PLUS SIGN
case (char)0x2c: output[i] = (char)0x2c; break; // COMMA
case (char)0x2d: output[i] = (char)0x2d; break; // HYPHEN-MINUS
case (char)0x2e: output[i] = (char)0x2e; break; // FULL STOP
case (char)0x2f: output[i] = (char)0x2f; break; // SOLIDUS
case (char)0x30: output[i] = (char)0x30; break; // DIGIT ZERO
case (char)0x31: output[i] = (char)0x31; break; // DIGIT ONE
case (char)0x32: output[i] = (char)0x32; break; // DIGIT TWO
case (char)0x33: output[i] = (char)0x33; break; // DIGIT THREE
case (char)0x34: output[i] = (char)0x34; break; // DIGIT FOUR
case (char)0x35: output[i] = (char)0x35; break; // DIGIT FIVE
case (char)0x36: output[i] = (char)0x36; break; // DIGIT SIX
case (char)0x37: output[i] = (char)0x37; break; // DIGIT SEVEN
case (char)0x38: output[i] = (char)0x38; break; // DIGIT EIGHT
case (char)0x39: output[i] = (char)0x39; break; // DIGIT NINE
case (char)0x3a: output[i] = (char)0x3a; break; // COLON
case (char)0x3b: output[i] = (char)0x3b; break; // SEMICOLON
case (char)0x3c: output[i] = (char)0x3c; break; // LESS-THAN SIGN
case (char)0x3d: output[i] = (char)0x3d; break; // EQUALS SIGN
case (char)0x3e: output[i] = (char)0x3e; break; // GREATER-THAN SIGN
case (char)0x3f: output[i] = (char)0x3f; break; // QUESTION MARK
case (char)0x40: output[i] = (char)0x40; break; // COMMERCIAL AT
case (char)0x41: output[i] = (char)0x41; break; // LATIN CAPITAL LETTER A
case (char)0x42: output[i] = (char)0x42; break; // LATIN CAPITAL LETTER B
case (char)0x43: output[i] = (char)0x43; break; // LATIN CAPITAL LETTER C
case (char)0x44: output[i] = (char)0x44; break; // LATIN CAPITAL LETTER D
case (char)0x45: output[i] = (char)0x45; break; // LATIN CAPITAL LETTER E
case (char)0x46: output[i] = (char)0x46; break; // LATIN CAPITAL LETTER F
case (char)0x47: output[i] = (char)0x47; break; // LATIN CAPITAL LETTER G
case (char)0x48: output[i] = (char)0x48; break; // LATIN CAPITAL LETTER H
case (char)0x49: output[i] = (char)0x49; break; // LATIN CAPITAL LETTER I
case (char)0x4a: output[i] = (char)0x4a; break; // LATIN CAPITAL LETTER J
case (char)0x4b: output[i] = (char)0x4b; break; // LATIN CAPITAL LETTER K
case (char)0x4c: output[i] = (char)0x4c; break; // LATIN CAPITAL LETTER L
case (char)0x4d: output[i] = (char)0x4d; break; // LATIN CAPITAL LETTER M
case (char)0x4e: output[i] = (char)0x4e; break; // LATIN CAPITAL LETTER N
case (char)0x4f: output[i] = (char)0x4f; break; // LATIN CAPITAL LETTER O
case (char)0x50: output[i] = (char)0x50; break; // LATIN CAPITAL LETTER P
case (char)0x51: output[i] = (char)0x51; break; // LATIN CAPITAL LETTER Q
case (char)0x52: output[i] = (char)0x52; break; // LATIN CAPITAL LETTER R
case (char)0x53: output[i] = (char)0x53; break; // LATIN CAPITAL LETTER S
case (char)0x54: output[i] = (char)0x54; break; // LATIN CAPITAL LETTER T
case (char)0x55: output[i] = (char)0x55; break; // LATIN CAPITAL LETTER U
case (char)0x56: output[i] = (char)0x56; break; // LATIN CAPITAL LETTER V
case (char)0x57: output[i] = (char)0x57; break; // LATIN CAPITAL LETTER W
case (char)0x58: output[i] = (char)0x58; break; // LATIN CAPITAL LETTER X
case (char)0x59: output[i] = (char)0x59; break; // LATIN CAPITAL LETTER Y
case (char)0x5a: output[i] = (char)0x5a; break; // LATIN CAPITAL LETTER Z
case (char)0x5b: output[i] = (char)0x5b; break; // LEFT SQUARE BRACKET
case (char)0x5c: output[i] = (char)0x5c; break; // REVERSE SOLIDUS
case (char)0x5d: output[i] = (char)0x5d; break; // RIGHT SQUARE BRACKET
case (char)0xe2:
str++;
switch(*str) {
case (char)0x80:
str++;
switch(*str) {
case (char)0x95: new_str[i] = (char)0x5e; break; // HORIZONTAL BAR
case (char)0x96: new_str[i] = (char)0x60; break; // DOUBLE VERTICAL LINE
case (char)0xbe: new_str[i] = (char)0x7e; break; // OVERLINE
case (char)0xb0: new_str[i] = (char)0xa3; break; // PER MILLE SIGN
default: new_str[i] = (char)0x3f; break; // QUESTION MARK
case (char)0x95: output[i] = (char)0x5e; break; // HORIZONTAL BAR
case (char)0x96: output[i] = (char)0x60; break; // DOUBLE VERTICAL LINE
case (char)0xbe: output[i] = (char)0x7e; break; // OVERLINE
case (char)0xb0: output[i] = (char)0xa3; break; // PER MILLE SIGN
default: output[i] = (char)0x3f; break; // QUESTION MARK
}
break;
case (char)0x82:
str++;
switch(*str) {
case (char)0xac: new_str[i] = (char)0xa9; break; // EURO SIGN
default: new_str[i] = (char)0x3f; break; // QUESTION MARK
case (char)0xac: output[i] = (char)0xa9; break; // EURO SIGN
default: output[i] = (char)0x3f; break; // QUESTION MARK
}
break;
case (char)0x86:
str++;
switch(*str) {
case (char)0x90: new_str[i] = (char)0xac; break; // LEFTWARDS ARROW
case (char)0x91: new_str[i] = (char)0xad; break; // UPWARDS ARROW
case (char)0x92: new_str[i] = (char)0xae; break; // RIGHTWARDS ARROW
case (char)0x93: new_str[i] = (char)0xaf; break; // DOWNWARDS ARROW
default: new_str[i] = (char)0x3f; break; // QUESTION MARK
case (char)0x90: output[i] = (char)0xac; break; // LEFTWARDS ARROW
case (char)0x91: output[i] = (char)0xad; break; // UPWARDS ARROW
case (char)0x92: output[i] = (char)0xae; break; // RIGHTWARDS ARROW
case (char)0x93: output[i] = (char)0xaf; break; // DOWNWARDS ARROW
default: output[i] = (char)0x3f; break; // QUESTION MARK
}
break;
default: new_str[i] = (char)0x3f; break; // QUESTION MARK
default: output[i] = (char)0x3f; break; // QUESTION MARK
}
break;
case (char)0x5f: output[i] = (char)0x5f; break; // LOW LINE
case (char)0x61: output[i] = (char)0x61; break; // LATIN SMALL LETTER A
case (char)0x62: output[i] = (char)0x62; break; // LATIN SMALL LETTER B
case (char)0x63: output[i] = (char)0x63; break; // LATIN SMALL LETTER C
case (char)0x64: output[i] = (char)0x64; break; // LATIN SMALL LETTER D
case (char)0x65: output[i] = (char)0x65; break; // LATIN SMALL LETTER E
case (char)0x66: output[i] = (char)0x66; break; // LATIN SMALL LETTER F
case (char)0x67: output[i] = (char)0x67; break; // LATIN SMALL LETTER G
case (char)0x68: output[i] = (char)0x68; break; // LATIN SMALL LETTER H
case (char)0x69: output[i] = (char)0x69; break; // LATIN SMALL LETTER I
case (char)0x6a: output[i] = (char)0x6a; break; // LATIN SMALL LETTER J
case (char)0x6b: output[i] = (char)0x6b; break; // LATIN SMALL LETTER K
case (char)0x6c: output[i] = (char)0x6c; break; // LATIN SMALL LETTER L
case (char)0x6d: output[i] = (char)0x6d; break; // LATIN SMALL LETTER M
case (char)0x6e: output[i] = (char)0x6e; break; // LATIN SMALL LETTER N
case (char)0x6f: output[i] = (char)0x6f; break; // LATIN SMALL LETTER O
case (char)0x70: output[i] = (char)0x70; break; // LATIN SMALL LETTER P
case (char)0x71: output[i] = (char)0x71; break; // LATIN SMALL LETTER Q
case (char)0x72: output[i] = (char)0x72; break; // LATIN SMALL LETTER R
case (char)0x73: output[i] = (char)0x73; break; // LATIN SMALL LETTER S
case (char)0x74: output[i] = (char)0x74; break; // LATIN SMALL LETTER T
case (char)0x75: output[i] = (char)0x75; break; // LATIN SMALL LETTER U
case (char)0x76: output[i] = (char)0x76; break; // LATIN SMALL LETTER V
case (char)0x77: output[i] = (char)0x77; break; // LATIN SMALL LETTER W
case (char)0x78: output[i] = (char)0x78; break; // LATIN SMALL LETTER X
case (char)0x79: output[i] = (char)0x79; break; // LATIN SMALL LETTER Y
case (char)0x7a: output[i] = (char)0x7a; break; // LATIN SMALL LETTER Z
case (char)0x7b: output[i] = (char)0x7b; break; // LEFT CURLY BRACKET
case (char)0x7c: output[i] = (char)0x7c; break; // VERTICAL LINE
case (char)0x7d: output[i] = (char)0x7d; break; // RIGHT CURLY BRACKET
case (char)0xc3:
str++;
switch(*str) {
case (char)0xa1: new_str[i] = (char)0x80; break; // LATIN SMALL LETTER A WITH ACUTE
case (char)0xa0: new_str[i] = (char)0x81; break; // LATIN SMALL LETTER A WITH GRAVE
case (char)0xa9: new_str[i] = (char)0x82; break; // LATIN SMALL LETTER E WITH ACUTE
case (char)0xa8: new_str[i] = (char)0x83; break; // LATIN SMALL LETTER E WITH GRAVE
case (char)0xad: new_str[i] = (char)0x84; break; // LATIN SMALL LETTER I WITH ACUTE
case (char)0xac: new_str[i] = (char)0x85; break; // LATIN SMALL LETTER I WITH GRAVE
case (char)0xb3: new_str[i] = (char)0x86; break; // LATIN SMALL LETTER O WITH ACUTE
case (char)0xb2: new_str[i] = (char)0x87; break; // LATIN SMALL LETTER O WITH GRAVE
case (char)0xba: new_str[i] = (char)0x88; break; // LATIN SMALL LETTER U WITH ACUTE
case (char)0xb9: new_str[i] = (char)0x89; break; // LATIN SMALL LETTER U WITH GRAVE
case (char)0x91: new_str[i] = (char)0x8a; break; // LATIN CAPITAL LETTER N WITH TILDE
case (char)0x87: new_str[i] = (char)0x8b; break; // LATIN CAPITAL LETTER C WITH CEDILLA
case (char)0x9f: new_str[i] = (char)0x8d; break; // LATIN SMALL LETTER SHARP S
case (char)0xa2: new_str[i] = (char)0x90; break; // LATIN SMALL LETTER A WITH CIRCUMFLEX
case (char)0xa4: new_str[i] = (char)0x91; break; // LATIN SMALL LETTER A WITH DIAERESIS
case (char)0xaa: new_str[i] = (char)0x92; break; // LATIN SMALL LETTER E WITH CIRCUMFLEX
case (char)0xab: new_str[i] = (char)0x93; break; // LATIN SMALL LETTER E WITH DIAERESIS
case (char)0xae: new_str[i] = (char)0x94; break; // LATIN SMALL LETTER I WITH CIRCUMFLEX
case (char)0xaf: new_str[i] = (char)0x95; break; // LATIN SMALL LETTER I WITH DIAERESIS
case (char)0xb4: new_str[i] = (char)0x96; break; // LATIN SMALL LETTER O WITH CIRCUMFLEX
case (char)0xb6: new_str[i] = (char)0x97; break; // LATIN SMALL LETTER O WITH DIAERESIS
case (char)0xbb: new_str[i] = (char)0x98; break; // LATIN SMALL LETTER U WITH CIRCUMFLEX
case (char)0xbc: new_str[i] = (char)0x99; break; // LATIN SMALL LETTER U WITH DIAERESIS
case (char)0xb1: new_str[i] = (char)0x9a; break; // LATIN SMALL LETTER N WITH TILDE
case (char)0xa7: new_str[i] = (char)0x9b; break; // LATIN SMALL LETTER C WITH CEDILLA
case (char)0xb7: new_str[i] = (char)0xba; break; // DIVISION SIGN
case (char)0x81: new_str[i] = (char)0xc0; break; // LATIN CAPITAL LETTER A WITH ACUTE
case (char)0x80: new_str[i] = (char)0xc1; break; // LATIN CAPITAL LETTER A WITH GRAVE
case (char)0x89: new_str[i] = (char)0xc2; break; // LATIN CAPITAL LETTER E WITH ACUTE
case (char)0x88: new_str[i] = (char)0xc3; break; // LATIN CAPITAL LETTER E WITH GRAVE
case (char)0x8d: new_str[i] = (char)0xc4; break; // LATIN CAPITAL LETTER I WITH ACUTE
case (char)0x8c: new_str[i] = (char)0xc5; break; // LATIN CAPITAL LETTER I WITH GRAVE
case (char)0x93: new_str[i] = (char)0xc6; break; // LATIN CAPITAL LETTER O WITH ACUTE
case (char)0x92: new_str[i] = (char)0xc7; break; // LATIN CAPITAL LETTER O WITH GRAVE
case (char)0x9a: new_str[i] = (char)0xc8; break; // LATIN CAPITAL LETTER U WITH ACUTE
case (char)0x99: new_str[i] = (char)0xc9; break; // LATIN CAPITAL LETTER U WITH GRAVE
case (char)0x90: new_str[i] = (char)0xce; break; // LATIN CAPITAL LETTER ETH
case (char)0x82: new_str[i] = (char)0xd0; break; // LATIN CAPITAL LETTER A WITH CIRCUMFLEX
case (char)0x84: new_str[i] = (char)0xd1; break; // LATIN CAPITAL LETTER A WITH DIAERESIS
case (char)0x8a: new_str[i] = (char)0xd2; break; // LATIN CAPITAL LETTER E WITH CIRCUMFLEX
case (char)0x8b: new_str[i] = (char)0xd3; break; // LATIN CAPITAL LETTER E WITH DIAERESIS
case (char)0x8e: new_str[i] = (char)0xd4; break; // LATIN CAPITAL LETTER I WITH CIRCUMFLEX
case (char)0x8f: new_str[i] = (char)0xd5; break; // LATIN CAPITAL LETTER I WITH DIAERESIS
case (char)0x94: new_str[i] = (char)0xd6; break; // LATIN CAPITAL LETTER O WITH CIRCUMFLEX
case (char)0x96: new_str[i] = (char)0xd7; break; // LATIN CAPITAL LETTER O WITH DIAERESIS
case (char)0x9b: new_str[i] = (char)0xd8; break; // LATIN CAPITAL LETTER U WITH CIRCUMFLEX
case (char)0x9c: new_str[i] = (char)0xd9; break; // LATIN CAPITAL LETTER U WITH DIAERESIS
case (char)0x83: new_str[i] = (char)0xe0; break; // LATIN CAPITAL LETTER A WITH TILDE
case (char)0x85: new_str[i] = (char)0xe1; break; // LATIN CAPITAL LETTER A WITH RING ABOVE
case (char)0x86: new_str[i] = (char)0xe2; break; // LATIN CAPITAL LETTER AE
case (char)0x9d: new_str[i] = (char)0xe5; break; // LATIN CAPITAL LETTER Y WITH ACUTE
case (char)0x95: new_str[i] = (char)0xe6; break; // LATIN CAPITAL LETTER O WITH TILDE
case (char)0x98: new_str[i] = (char)0xe7; break; // LATIN CAPITAL LETTER O WITH STROKE
case (char)0x9e: new_str[i] = (char)0xe8; break; // LATIN CAPITAL LETTER THORN
case (char)0xb0: new_str[i] = (char)0xef; break; // LATIN SMALL LETTER ETH
case (char)0xa3: new_str[i] = (char)0xf0; break; // LATIN SMALL LETTER A WITH TILDE
case (char)0xa5: new_str[i] = (char)0xf1; break; // LATIN SMALL LETTER A WITH RING ABOVE
case (char)0xa6: new_str[i] = (char)0xf2; break; // LATIN SMALL LETTER AE
case (char)0xbd: new_str[i] = (char)0xf5; break; // LATIN SMALL LETTER Y WITH ACUTE
case (char)0xb5: new_str[i] = (char)0xf6; break; // LATIN SMALL LETTER O WITH TILDE
case (char)0xb8: new_str[i] = (char)0xf7; break; // LATIN SMALL LETTER O WITH STROKE
case (char)0xbe: new_str[i] = (char)0xf8; break; // LATIN SMALL LETTER THORN
default: new_str[i] = (char)0x3f; break; // QUESTION MARK
case (char)0xa1: output[i] = (char)0x80; break; // LATIN SMALL LETTER A WITH ACUTE
case (char)0xa0: output[i] = (char)0x81; break; // LATIN SMALL LETTER A WITH GRAVE
case (char)0xa9: output[i] = (char)0x82; break; // LATIN SMALL LETTER E WITH ACUTE
case (char)0xa8: output[i] = (char)0x83; break; // LATIN SMALL LETTER E WITH GRAVE
case (char)0xad: output[i] = (char)0x84; break; // LATIN SMALL LETTER I WITH ACUTE
case (char)0xac: output[i] = (char)0x85; break; // LATIN SMALL LETTER I WITH GRAVE
case (char)0xb3: output[i] = (char)0x86; break; // LATIN SMALL LETTER O WITH ACUTE
case (char)0xb2: output[i] = (char)0x87; break; // LATIN SMALL LETTER O WITH GRAVE
case (char)0xba: output[i] = (char)0x88; break; // LATIN SMALL LETTER U WITH ACUTE
case (char)0xb9: output[i] = (char)0x89; break; // LATIN SMALL LETTER U WITH GRAVE
case (char)0x91: output[i] = (char)0x8a; break; // LATIN CAPITAL LETTER N WITH TILDE
case (char)0x87: output[i] = (char)0x8b; break; // LATIN CAPITAL LETTER C WITH CEDILLA
case (char)0x9f: output[i] = (char)0x8d; break; // LATIN SMALL LETTER SHARP S
case (char)0xa2: output[i] = (char)0x90; break; // LATIN SMALL LETTER A WITH CIRCUMFLEX
case (char)0xa4: output[i] = (char)0x91; break; // LATIN SMALL LETTER A WITH DIAERESIS
case (char)0xaa: output[i] = (char)0x92; break; // LATIN SMALL LETTER E WITH CIRCUMFLEX
case (char)0xab: output[i] = (char)0x93; break; // LATIN SMALL LETTER E WITH DIAERESIS
case (char)0xae: output[i] = (char)0x94; break; // LATIN SMALL LETTER I WITH CIRCUMFLEX
case (char)0xaf: output[i] = (char)0x95; break; // LATIN SMALL LETTER I WITH DIAERESIS
case (char)0xb4: output[i] = (char)0x96; break; // LATIN SMALL LETTER O WITH CIRCUMFLEX
case (char)0xb6: output[i] = (char)0x97; break; // LATIN SMALL LETTER O WITH DIAERESIS
case (char)0xbb: output[i] = (char)0x98; break; // LATIN SMALL LETTER U WITH CIRCUMFLEX
case (char)0xbc: output[i] = (char)0x99; break; // LATIN SMALL LETTER U WITH DIAERESIS
case (char)0xb1: output[i] = (char)0x9a; break; // LATIN SMALL LETTER N WITH TILDE
case (char)0xa7: output[i] = (char)0x9b; break; // LATIN SMALL LETTER C WITH CEDILLA
case (char)0xb7: output[i] = (char)0xba; break; // DIVISION SIGN
case (char)0x81: output[i] = (char)0xc0; break; // LATIN CAPITAL LETTER A WITH ACUTE
case (char)0x80: output[i] = (char)0xc1; break; // LATIN CAPITAL LETTER A WITH GRAVE
case (char)0x89: output[i] = (char)0xc2; break; // LATIN CAPITAL LETTER E WITH ACUTE
case (char)0x88: output[i] = (char)0xc3; break; // LATIN CAPITAL LETTER E WITH GRAVE
case (char)0x8d: output[i] = (char)0xc4; break; // LATIN CAPITAL LETTER I WITH ACUTE
case (char)0x8c: output[i] = (char)0xc5; break; // LATIN CAPITAL LETTER I WITH GRAVE
case (char)0x93: output[i] = (char)0xc6; break; // LATIN CAPITAL LETTER O WITH ACUTE
case (char)0x92: output[i] = (char)0xc7; break; // LATIN CAPITAL LETTER O WITH GRAVE
case (char)0x9a: output[i] = (char)0xc8; break; // LATIN CAPITAL LETTER U WITH ACUTE
case (char)0x99: output[i] = (char)0xc9; break; // LATIN CAPITAL LETTER U WITH GRAVE
case (char)0x90: output[i] = (char)0xce; break; // LATIN CAPITAL LETTER ETH
case (char)0x82: output[i] = (char)0xd0; break; // LATIN CAPITAL LETTER A WITH CIRCUMFLEX
case (char)0x84: output[i] = (char)0xd1; break; // LATIN CAPITAL LETTER A WITH DIAERESIS
case (char)0x8a: output[i] = (char)0xd2; break; // LATIN CAPITAL LETTER E WITH CIRCUMFLEX
case (char)0x8b: output[i] = (char)0xd3; break; // LATIN CAPITAL LETTER E WITH DIAERESIS
case (char)0x8e: output[i] = (char)0xd4; break; // LATIN CAPITAL LETTER I WITH CIRCUMFLEX
case (char)0x8f: output[i] = (char)0xd5; break; // LATIN CAPITAL LETTER I WITH DIAERESIS
case (char)0x94: output[i] = (char)0xd6; break; // LATIN CAPITAL LETTER O WITH CIRCUMFLEX
case (char)0x96: output[i] = (char)0xd7; break; // LATIN CAPITAL LETTER O WITH DIAERESIS
case (char)0x9b: output[i] = (char)0xd8; break; // LATIN CAPITAL LETTER U WITH CIRCUMFLEX
case (char)0x9c: output[i] = (char)0xd9; break; // LATIN CAPITAL LETTER U WITH DIAERESIS
case (char)0x83: output[i] = (char)0xe0; break; // LATIN CAPITAL LETTER A WITH TILDE
case (char)0x85: output[i] = (char)0xe1; break; // LATIN CAPITAL LETTER A WITH RING ABOVE
case (char)0x86: output[i] = (char)0xe2; break; // LATIN CAPITAL LETTER AE
case (char)0x9d: output[i] = (char)0xe5; break; // LATIN CAPITAL LETTER Y WITH ACUTE
case (char)0x95: output[i] = (char)0xe6; break; // LATIN CAPITAL LETTER O WITH TILDE
case (char)0x98: output[i] = (char)0xe7; break; // LATIN CAPITAL LETTER O WITH STROKE
case (char)0x9e: output[i] = (char)0xe8; break; // LATIN CAPITAL LETTER THORN
case (char)0xb0: output[i] = (char)0xef; break; // LATIN SMALL LETTER ETH
case (char)0xa3: output[i] = (char)0xf0; break; // LATIN SMALL LETTER A WITH TILDE
case (char)0xa5: output[i] = (char)0xf1; break; // LATIN SMALL LETTER A WITH RING ABOVE
case (char)0xa6: output[i] = (char)0xf2; break; // LATIN SMALL LETTER AE
case (char)0xbd: output[i] = (char)0xf5; break; // LATIN SMALL LETTER Y WITH ACUTE
case (char)0xb5: output[i] = (char)0xf6; break; // LATIN SMALL LETTER O WITH TILDE
case (char)0xb8: output[i] = (char)0xf7; break; // LATIN SMALL LETTER O WITH STROKE
case (char)0xbe: output[i] = (char)0xf8; break; // LATIN SMALL LETTER THORN
default: output[i] = (char)0x3f; break; // QUESTION MARK
}
break;
case (char)0xc5:
str++;
switch(*str) {
case (char)0x9e: new_str[i] = (char)0x8c; break; // LATIN CAPITAL LETTER S WITH CEDILLA
case (char)0x9f: new_str[i] = (char)0x9c; break; // LATIN SMALL LETTER S WITH CEDILLA
case (char)0x88: new_str[i] = (char)0xa6; break; // LATIN SMALL LETTER N WITH CARON
case (char)0x91: new_str[i] = (char)0xa7; break; // LATIN SMALL LETTER O WITH DOUBLE ACUTE
case (char)0x84: new_str[i] = (char)0xb6; break; // LATIN SMALL LETTER N WITH ACUTE
case (char)0xb1: new_str[i] = (char)0xb7; break; // LATIN SMALL LETTER U WITH DOUBLE ACUTE
case (char)0x98: new_str[i] = (char)0xca; break; // LATIN CAPITAL LETTER R WITH CARON
case (char)0xa0: new_str[i] = (char)0xcc; break; // LATIN CAPITAL LETTER S WITH CARON
case (char)0xbd: new_str[i] = (char)0xcd; break; // LATIN CAPITAL LETTER Z WITH CARON
case (char)0x99: new_str[i] = (char)0xda; break; // LATIN SMALL LETTER R WITH CARON
case (char)0xa1: new_str[i] = (char)0xdc; break; // LATIN SMALL LETTER S WITH CARON
case (char)0xbe: new_str[i] = (char)0xdd; break; // LATIN SMALL LETTER Z WITH CARON
case (char)0x80: new_str[i] = (char)0xdf; break; // LATIN SMALL LETTER L WITH MIDDLE DOT
case (char)0x92: new_str[i] = (char)0xe3; break; // LATIN CAPITAL LIGATURE OE
case (char)0xb7: new_str[i] = (char)0xe4; break; // LATIN SMALL LETTER Y WITH CIRCUMFLEX
case (char)0x8a: new_str[i] = (char)0xe9; break; // LATIN CAPITAL LETTER ENG
case (char)0x94: new_str[i] = (char)0xea; break; // LATIN CAPITAL LETTER R WITH ACUTE
case (char)0x9a: new_str[i] = (char)0xec; break; // LATIN CAPITAL LETTER S WITH ACUTE
case (char)0xb9: new_str[i] = (char)0xed; break; // LATIN CAPITAL LETTER Z WITH ACUTE
case (char)0xa6: new_str[i] = (char)0xee; break; // LATIN CAPITAL LETTER T WITH STROKE
case (char)0x93: new_str[i] = (char)0xf3; break; // LATIN SMALL LIGATURE OE
case (char)0xb5: new_str[i] = (char)0xf4; break; // LATIN SMALL LETTER W WITH CIRCUMFLEX
case (char)0x8b: new_str[i] = (char)0xf9; break; // LATIN SMALL LETTER ENG
case (char)0x95: new_str[i] = (char)0xfa; break; // LATIN SMALL LETTER R WITH ACUTE
case (char)0x9b: new_str[i] = (char)0xfc; break; // LATIN SMALL LETTER S WITH ACUTE
case (char)0xba: new_str[i] = (char)0xfd; break; // LATIN SMALL LETTER Z WITH ACUTE
case (char)0xa7: new_str[i] = (char)0xfe; break; // LATIN SMALL LETTER T WITH STROKE
default: new_str[i] = (char)0x3f; break; // QUESTION MARK
case (char)0x9e: output[i] = (char)0x8c; break; // LATIN CAPITAL LETTER S WITH CEDILLA
case (char)0x9f: output[i] = (char)0x9c; break; // LATIN SMALL LETTER S WITH CEDILLA
case (char)0x88: output[i] = (char)0xa6; break; // LATIN SMALL LETTER N WITH CARON
case (char)0x91: output[i] = (char)0xa7; break; // LATIN SMALL LETTER O WITH DOUBLE ACUTE
case (char)0x84: output[i] = (char)0xb6; break; // LATIN SMALL LETTER N WITH ACUTE
case (char)0xb1: output[i] = (char)0xb7; break; // LATIN SMALL LETTER U WITH DOUBLE ACUTE
case (char)0x98: output[i] = (char)0xca; break; // LATIN CAPITAL LETTER R WITH CARON
case (char)0xa0: output[i] = (char)0xcc; break; // LATIN CAPITAL LETTER S WITH CARON
case (char)0xbd: output[i] = (char)0xcd; break; // LATIN CAPITAL LETTER Z WITH CARON
case (char)0x99: output[i] = (char)0xda; break; // LATIN SMALL LETTER R WITH CARON
case (char)0xa1: output[i] = (char)0xdc; break; // LATIN SMALL LETTER S WITH CARON
case (char)0xbe: output[i] = (char)0xdd; break; // LATIN SMALL LETTER Z WITH CARON
case (char)0x80: output[i] = (char)0xdf; break; // LATIN SMALL LETTER L WITH MIDDLE DOT
case (char)0x92: output[i] = (char)0xe3; break; // LATIN CAPITAL LIGATURE OE
case (char)0xb7: output[i] = (char)0xe4; break; // LATIN SMALL LETTER Y WITH CIRCUMFLEX
case (char)0x8a: output[i] = (char)0xe9; break; // LATIN CAPITAL LETTER ENG
case (char)0x94: output[i] = (char)0xea; break; // LATIN CAPITAL LETTER R WITH ACUTE
case (char)0x9a: output[i] = (char)0xec; break; // LATIN CAPITAL LETTER S WITH ACUTE
case (char)0xb9: output[i] = (char)0xed; break; // LATIN CAPITAL LETTER Z WITH ACUTE
case (char)0xa6: output[i] = (char)0xee; break; // LATIN CAPITAL LETTER T WITH STROKE
case (char)0x93: output[i] = (char)0xf3; break; // LATIN SMALL LIGATURE OE
case (char)0xb5: output[i] = (char)0xf4; break; // LATIN SMALL LETTER W WITH CIRCUMFLEX
case (char)0x8b: output[i] = (char)0xf9; break; // LATIN SMALL LETTER ENG
case (char)0x95: output[i] = (char)0xfa; break; // LATIN SMALL LETTER R WITH ACUTE
case (char)0x9b: output[i] = (char)0xfc; break; // LATIN SMALL LETTER S WITH ACUTE
case (char)0xba: output[i] = (char)0xfd; break; // LATIN SMALL LETTER Z WITH ACUTE
case (char)0xa7: output[i] = (char)0xfe; break; // LATIN SMALL LETTER T WITH STROKE
default: output[i] = (char)0x3f; break; // QUESTION MARK
}
break;
case (char)0xc4:
str++;
switch(*str) {
case (char)0xb2: new_str[i] = (char)0x8f; break; // LATIN CAPITAL LIGATURE IJ
case (char)0x9f: new_str[i] = (char)0x9d; break; // LATIN SMALL LETTER G WITH BREVE
case (char)0xb1: new_str[i] = (char)0x9e; break; // LATIN SMALL LETTER DOTLESS I
case (char)0xb3: new_str[i] = (char)0x9f; break; // LATIN SMALL LIGATURE IJ
case (char)0x9e: new_str[i] = (char)0xa4; break; // LATIN CAPITAL LETTER G WITH BREVE
case (char)0x9b: new_str[i] = (char)0xa5; break; // LATIN SMALL LETTER E WITH CARON
case (char)0xb0: new_str[i] = (char)0xb5; break; // LATIN CAPITAL LETTER I WITH DOT ABOVE
case (char)0x8c: new_str[i] = (char)0xcb; break; // LATIN CAPITAL LETTER C WITH CARON
case (char)0xbf: new_str[i] = (char)0xcf; break; // LATIN CAPITAL LETTER L WITH MIDDLE DOT
case (char)0x8d: new_str[i] = (char)0xdb; break; // LATIN SMALL LETTER C WITH CARON
case (char)0x91: new_str[i] = (char)0xde; break; // LATIN SMALL LETTER D WITH STROKE
case (char)0x86: new_str[i] = (char)0xeb; break; // LATIN CAPITAL LETTER C WITH ACUTE
case (char)0x87: new_str[i] = (char)0xfb; break; // LATIN SMALL LETTER C WITH ACUTE
default: new_str[i] = (char)0x3f; break; // QUESTION MARK
case (char)0xb2: output[i] = (char)0x8f; break; // LATIN CAPITAL LIGATURE IJ
case (char)0x9f: output[i] = (char)0x9d; break; // LATIN SMALL LETTER G WITH BREVE
case (char)0xb1: output[i] = (char)0x9e; break; // LATIN SMALL LETTER DOTLESS I
case (char)0xb3: output[i] = (char)0x9f; break; // LATIN SMALL LIGATURE IJ
case (char)0x9e: output[i] = (char)0xa4; break; // LATIN CAPITAL LETTER G WITH BREVE
case (char)0x9b: output[i] = (char)0xa5; break; // LATIN SMALL LETTER E WITH CARON
case (char)0xb0: output[i] = (char)0xb5; break; // LATIN CAPITAL LETTER I WITH DOT ABOVE
case (char)0x8c: output[i] = (char)0xcb; break; // LATIN CAPITAL LETTER C WITH CARON
case (char)0xbf: output[i] = (char)0xcf; break; // LATIN CAPITAL LETTER L WITH MIDDLE DOT
case (char)0x8d: output[i] = (char)0xdb; break; // LATIN SMALL LETTER C WITH CARON
case (char)0x91: output[i] = (char)0xde; break; // LATIN SMALL LETTER D WITH STROKE
case (char)0x86: output[i] = (char)0xeb; break; // LATIN CAPITAL LETTER C WITH ACUTE
case (char)0x87: output[i] = (char)0xfb; break; // LATIN SMALL LETTER C WITH ACUTE
default: output[i] = (char)0x3f; break; // QUESTION MARK
}
break;
case (char)0xce:
str++;
switch(*str) {
case (char)0xb1: new_str[i] = (char)0xa1; break; // GREEK SMALL LETTER ALPHA
default: new_str[i] = (char)0x3f; break; // QUESTION MARK
case (char)0xb1: output[i] = (char)0xa1; break; // GREEK SMALL LETTER ALPHA
default: output[i] = (char)0x3f; break; // QUESTION MARK
}
break;
case (char)0xcf:
str++;
switch(*str) {
case (char)0x80: new_str[i] = (char)0xa8; break; // GREEK SMALL LETTER PI
default: new_str[i] = (char)0x3f; break; // QUESTION MARK
case (char)0x80: output[i] = (char)0xa8; break; // GREEK SMALL LETTER PI
default: output[i] = (char)0x3f; break; // QUESTION MARK
}
break;
case (char)0x24: new_str[i] = (char)0xab; break; // DOLLAR SIGN
default: new_str[i] = *str; break;
case (char)0x24: output[i] = (char)0xab; break; // DOLLAR SIGN
default: output[i] = (char)0x3f; break; // QUESTION MARK
}
// CHARSET END
@@ -278,6 +376,5 @@ char *convert_to_rdscharset(const char *str) {
str++;
}
new_str[i] = 0;
return new_str;
output[i] = 0;
}
+1 -1
View File
@@ -13,4 +13,4 @@ uint16_t crc16_ccitt(const char *data, uint16_t len);
uint16_t get_block_from_group(RDSGroup *group, uint8_t block);
uint8_t add_rds_af(RDSAFs *af_list, float freq);
char *convert_to_rdscharset(const char *str);
void convert_to_rdscharset(const char *str, char *output, size_t buffer_size);
+25 -79
View File
@@ -81,10 +81,12 @@ int lua_set_rds_##name(lua_State *localL) { \
enc->data[writing_program].name = luaL_checkinteger(localL, 1); \
return 0; \
}
#define STR_SETTER(name, function) \
#define STR_SETTER(name, function, buffer_size) \
int lua_set_rds_##name(lua_State *localL) { \
const char* str = luaL_checklstring(localL, 1, NULL); \
function(enc, convert_to_rdscharset(str), writing_program); \
const char* str = luaL_checklstring(localL, 1, NULL); \
char converted[buffer_size+1]; \
convert_to_rdscharset(str, converted, buffer_size+1); \
function(enc, converted, writing_program); \
return 0; \
}
#define STR_RAW_SETTER(name, function) \
@@ -244,10 +246,15 @@ int lua_put_rds2_custom_group(lua_State *localL) {
return 0;
}
STR_SETTER(ptyn, set_rds_ptyn)
STR_SETTER(ps, set_rds_ps)
STR_SETTER(tps, set_rds_tps)
STR_SETTER(rt, set_rds_rt)
STR_SETTER(ptyn, set_rds_ptyn, PTYN_LENGTH)
STR_SETTER(ps, set_rds_ps, PS_LENGTH)
STR_SETTER(tps, set_rds_tps, PS_LENGTH)
STR_SETTER(rt, set_rds_rt, RT_LENGTH)
STR_RAW_SETTER(ptyn_raw, set_rds_ptyn)
STR_RAW_SETTER(ps_raw, set_rds_ps)
STR_RAW_SETTER(tps_raw, set_rds_tps)
STR_RAW_SETTER(rt_raw, set_rds_rt)
STR_RAW_SETTER(lps, set_rds_lps)
STR_RAW_GETTER(lps, LPS_LENGTH)
@@ -374,81 +381,20 @@ int lua_get_rds_eon(lua_State *localL) {
return 1;
}
int lua_set_rds_udg(lua_State *localL) {
if (!lua_isboolean(localL, 1)) return luaL_error(localL, "boolean expected, got %s", luaL_typename(localL, 1));
int xy = lua_toboolean(localL, 1);
luaL_checktype(localL, 2, LUA_TTABLE);
int n = lua_rawlen(localL, 2);
if(n > 8) return luaL_error(localL, "table length over 8");
uint16_t blocks[8][3] = {0};
for (int i = 1; i <= n; i++) {
lua_rawgeti(localL, 2, i);
if(lua_istable(localL, -1)) {
int n2 = lua_rawlen(localL, -1);
if(n2 > 3) return luaL_error(localL, "table length over 3");
for(int j = 1; j <= n2; j++) {
lua_rawgeti(localL, -1, j);
if (lua_isinteger(localL, -1)) blocks[i-1][j-1] = lua_tointeger(localL, -1);
else return luaL_error(localL, "integer expected, got %s", luaL_typename(localL, -1));
lua_pop(localL, 1);
}
}
else return luaL_error(localL, "table expected, got %s", luaL_typename(localL, -1));
lua_pop(localL, 1);
}
if(xy) {
memcpy(&(enc->data[writing_program].udg2), blocks, n * sizeof(uint16_t[3]));
enc->data[writing_program].udg2_len = n;
} else {
memcpy(&(enc->data[writing_program].udg1), blocks, n * sizeof(uint16_t[3]));
enc->data[writing_program].udg1_len = n;
}
return 0;
}
int lua_set_rds_udg2(lua_State *localL) {
if (!lua_isboolean(localL, 1)) return luaL_error(localL, "boolean expected, got %s", luaL_typename(localL, 1));
int xy = lua_toboolean(localL, 1);
luaL_checktype(localL, 2, LUA_TTABLE);
int n = lua_rawlen(localL, 2);
if(n > 8) return luaL_error(localL, "table length over 8");
uint16_t blocks[8][4] = {0};
for (int i = 1; i <= n; i++) {
lua_rawgeti(localL, 2, i);
if(lua_istable(localL, -1)) {
int n2 = lua_rawlen(localL, -1);
if(n2 > 4) return luaL_error(localL, "table length over 4");
for(int j = 1; j <= n2; j++) {
lua_rawgeti(localL, -1, j);
if (lua_isinteger(localL, -1)) blocks[i-1][j-1] = lua_tointeger(localL, -1);
else return luaL_error(localL, "integer expected, got %s", luaL_typename(localL, -1));
lua_pop(localL, 1);
}
}
else return luaL_error(localL, "table expected, got %s", luaL_typename(localL, -1));
lua_pop(localL, 1);
}
if(xy) {
memcpy(&(enc->data[writing_program].udg2_rds2), blocks, n * sizeof(uint16_t[4]));
enc->data[writing_program].udg2_len_rds2 = n;
} else {
memcpy(&(enc->data[writing_program].udg1_rds2), blocks, n * sizeof(uint16_t[4]));
enc->data[writing_program].udg1_len_rds2 = n;
}
return 0;
}
int lua_crc16(lua_State *localL) {
size_t len;
const char* data = luaL_checklstring(localL, 1, &len);
lua_pushinteger(localL, crc16_ccitt(data, len));
return 1;
}
int lua_convert_to_rdscharset(lua_State *localL) {
size_t len;
const char *input = luaL_checklstring(localL, 1, &len);
char output[len + 1];
convert_to_rdscharset(input, output, len + 1);
lua_pushstring(localL, output);
return 1;
}
+7 -3
View File
@@ -72,16 +72,20 @@ int lua_set_rds_lps(lua_State *localL);
int lua_get_rds_lps(lua_State *localL);
int lua_set_rds_af_group0(lua_State *localL);
int lua_set_rds_rt(lua_State *localL);
int lua_set_rds_rt_raw(lua_State *localL);
int lua_set_rds_tps(lua_State *localL);
int lua_set_rds_tps_raw(lua_State *localL);
int lua_set_rds_ps(lua_State *localL);
int lua_set_rds_ps_raw(lua_State *localL);
int lua_set_rds_ptyn(lua_State *localL);
int lua_set_rds_ptyn_raw(lua_State *localL);
int lua_set_rds_grp_sqc(lua_State *localL);
int lua_toggle_rt_ab(lua_State *localL);
int lua_set_rds_eon(lua_State *localL);
int lua_get_rds_eon(lua_State *localL);
int lua_set_rds_udg(lua_State *localL);
int lua_set_rds_udg2(lua_State *localL);
int lua_crc16(lua_State *localL);
int lua_crc16(lua_State *localL);
int lua_convert_to_rdscharset(lua_State *localL);
+30 -22
View File
@@ -22,9 +22,6 @@ void init_lua(RDSEncoder* _enc) {
luaL_requiref(L, LUA_IOLIBNAME, luaopen_io, 1);
lua_pop(L, 6);
lua_pushstring(L, VERSION);
lua_setglobal(L, "core_version");
lua_newtable(L);
lua_setglobal(L, "ext");
@@ -53,10 +50,13 @@ void init_lua(RDSEncoder* _enc) {
lua_registertotable(L, "set_program_defaults", lua_set_rds_program_defaults);
lua_pushinteger(L, PROGRAMS);
lua_setfield(L, -2, "max_programs");
lua_pushstring(L, VERSION);
lua_setfield(L, -2, "core_version");
lua_registertotable(L, "set_output_program", lua_set_rds_program);
lua_registertotable(L, "get_output_program", lua_get_rds_program);
lua_registertotable(L, "set_writing_program", lua_set_rds_writing_program);
lua_registertotable(L, "get_writing_program", lua_get_rds_writing_program);
lua_registertotable(L, "encode_charset", lua_convert_to_rdscharset);
lua_setglobal(L, "dp");
lua_newtable(L);
@@ -69,7 +69,11 @@ void init_lua(RDSEncoder* _enc) {
lua_newtable(L);
lua_setfield(L, -2, "tick");
lua_newtable(L);
lua_setfield(L, -2, "minute_tick");
lua_newtable(L);
lua_setfield(L, -2, "rt_transmission");
lua_newtable(L);
lua_setfield(L, -2, "ps_transmission");
lua_setglobal(L, "hooks");
lua_newtable(L);
@@ -117,9 +121,13 @@ void init_lua(RDSEncoder* _enc) {
lua_registertotable(L, "get_link", lua_get_rds_link);
lua_registertotable(L, "set_ptyn", lua_set_rds_ptyn);
lua_registertotable(L, "set_ptyn_raw", lua_set_rds_ptyn_raw);
lua_registertotable(L, "set_ps", lua_set_rds_ps);
lua_registertotable(L, "set_ps_raw", lua_set_rds_ps_raw);
lua_registertotable(L, "set_tps", lua_set_rds_tps);
lua_registertotable(L, "set_tps_raw", lua_set_rds_tps_raw);
lua_registertotable(L, "set_rt", lua_set_rds_rt);
lua_registertotable(L, "set_rt_raw", lua_set_rds_rt_raw);
lua_registertotable(L, "toggle_rt_ab", lua_toggle_rt_ab);
lua_registertotable(L, "set_lps", lua_set_rds_lps);
@@ -139,9 +147,6 @@ void init_lua(RDSEncoder* _enc) {
lua_registertotable(L, "set_eon", lua_set_rds_eon);
lua_registertotable(L, "get_eon", lua_get_rds_eon);
lua_registertotable(L, "set_udg", lua_set_rds_udg);
lua_registertotable(L, "set_udg2", lua_set_rds_udg2);
lua_registertotable(L, "set_streams", lua_set_rds_streams);
lua_registertotable(L, "get_streams", lua_get_rds_streams);
@@ -166,7 +171,8 @@ void init_lua(RDSEncoder* _enc) {
void run_lua(char *str, size_t str_len, char *cmd_output, size_t *out_len) {
pthread_mutex_lock(&lua_mutex);
lua_getglobal(L, "data_handle");
lua_getglobal(L, "hooks");
lua_getfield(L, -1, "data_handle");
if (lua_isfunction(L, -1)) {
lua_pushlstring(L, str, str_len);
@@ -180,16 +186,17 @@ void run_lua(char *str, size_t str_len, char *cmd_output, size_t *out_len) {
} else fprintf(stderr, "Lua error: %s at 'data_handle'\n", lua_tostring(L, -1));
} else fprintf(stderr, "'data_handle' is not a function\n");
lua_pop(L, 1);
lua_pop(L, 2);
pthread_mutex_unlock(&lua_mutex);
}
int lua_group(RDSGroup* group, const char grp) {
pthread_mutex_lock(&lua_mutex);
lua_getglobal(L, "group");
lua_getglobal(L, "hooks");
lua_getfield(L, -1, "group");
if (!lua_isfunction(L, -1)) {
lua_pop(L, 1);
lua_pop(L, 2);
pthread_mutex_unlock(&lua_mutex);
return 0;
}
@@ -198,7 +205,7 @@ int lua_group(RDSGroup* group, const char grp) {
if (lua_pcall(L, 1, 4, 0) != LUA_OK) {
fprintf(stderr, "Lua error: %s\n", lua_tostring(L, -1));
lua_pop(L, 1);
lua_pop(L, 2);
pthread_mutex_unlock(&lua_mutex);
return 0;
}
@@ -213,46 +220,47 @@ int lua_group(RDSGroup* group, const char grp) {
success = 1;
}
lua_pop(L, 4);
lua_pop(L, 5);
pthread_mutex_unlock(&lua_mutex);
return success;
}
int lua_rds2_group(RDSGroup* group, int stream) {
pthread_mutex_lock(&lua_mutex);
lua_getglobal(L, "rds2_group");
lua_getglobal(L, "hooks");
lua_getfield(L, -1, "rds2_group");
if (lua_isfunction(L, -1)) {
lua_pushinteger(L, stream);
if (lua_pcall(L, 1, 5, 0) == LUA_OK) {
if (!lua_isboolean(L, -5)) {
lua_pop(L, 5);
lua_pop(L, 6);
pthread_mutex_unlock(&lua_mutex);
return 0;
}
if (!lua_isinteger(L, -4)) {
lua_pop(L, 5);
lua_pop(L, 6);
pthread_mutex_unlock(&lua_mutex);
return 0;
}
if (!lua_isinteger(L, -3)) {
lua_pop(L, 5);
lua_pop(L, 6);
pthread_mutex_unlock(&lua_mutex);
return 0;
}
if (!lua_isinteger(L, -2)) {
lua_pop(L, 5);
lua_pop(L, 6);
pthread_mutex_unlock(&lua_mutex);
return 0;
}
if (!lua_isinteger(L, -1)) {
lua_pop(L, 5);
lua_pop(L, 6);
pthread_mutex_unlock(&lua_mutex);
return 0;
}
if(lua_toboolean(L, -5) == 0) {
lua_pop(L, 5);
lua_pop(L, 6);
pthread_mutex_unlock(&lua_mutex);
return 0;
}
@@ -261,12 +269,12 @@ int lua_rds2_group(RDSGroup* group, int stream) {
group->b = lua_tointeger(L, -3);
group->c = lua_tointeger(L, -2);
group->d = lua_tointeger(L, -1);
lua_pop(L, 5);
lua_pop(L, 6);
} else {
fprintf(stderr, "Lua error: %s at 'rds2_group'\n", lua_tostring(L, -1));
lua_pop(L, 1);
lua_pop(L, 2);
}
} else lua_pop(L, 1);
} else lua_pop(L, 2);
pthread_mutex_unlock(&lua_mutex);
return 1;
+1 -1
View File
@@ -41,7 +41,7 @@ float get_rds_sample(RDSModulator* rdsMod, uint8_t stream) {
rdsMod->data[stream].cur_bit = rdsMod->data[stream].bit_buffer[rdsMod->data[stream].bit_pos++];
rdsMod->data[stream].prev_output = rdsMod->data[stream].cur_output;
rdsMod->data[stream].cur_output = rdsMod->data[stream].prev_output ^ rdsMod->data[stream].cur_bit;
rdsMod->data[stream].cur_output = rdsMod->data[stream].prev_output ^ rdsMod->data[stream].cur_bit; // Something with differential encoding? Instead of encoding the data, encode if the bit of data changes
}
float sample = sinf(M_2PI * rdsMod->data[stream].phase + rdsMod->data[stream].symbol_shift);
+5 -50
View File
@@ -21,32 +21,7 @@ uint8_t get_rds_custom_groups(RDSEncoder* enc, RDSGroup *group);
uint8_t get_rds_custom_groups2(RDSEncoder* enc, RDSGroup *group);
int get_rdsp_lua_group(RDSGroup *group, const char grp);
#define HANDLE_UDG_STREAM(chan_idx, udg_prefix) \
do { \
if (stream != 0) { \
udg_idx = enc->state[enc->program].udg_idxs_rds2[chan_idx]; \
group->a = enc->data[enc->program].udg_prefix##_rds2[udg_idx][0]; \
group->b = enc->data[enc->program].udg_prefix##_rds2[udg_idx][1]; \
group->c = enc->data[enc->program].udg_prefix##_rds2[udg_idx][2]; \
group->d = enc->data[enc->program].udg_prefix##_rds2[udg_idx][3]; \
enc->state[enc->program].udg_idxs_rds2[chan_idx]++; \
if (enc->state[enc->program].udg_idxs_rds2[chan_idx] == enc->data[enc->program].udg_prefix##_len_rds2) \
enc->state[enc->program].udg_idxs_rds2[chan_idx] = 0; \
group->is_type_b = (group->a == 0 && IS_TYPE_B(group->b)); \
} else { \
udg_idx = enc->state[enc->program].udg_idxs[chan_idx]; \
group->b = enc->data[enc->program].udg_prefix[udg_idx][0]; \
group->c = enc->data[enc->program].udg_prefix[udg_idx][1]; \
group->d = enc->data[enc->program].udg_prefix[udg_idx][2]; \
enc->state[enc->program].udg_idxs[chan_idx]++; \
if (enc->state[enc->program].udg_idxs[chan_idx] == enc->data[enc->program].udg_prefix##_len) \
enc->state[enc->program].udg_idxs[chan_idx] = 0; \
group->is_type_b = (IS_TYPE_B(group->b) != 0); \
} \
} while(0)
static void get_rds_sequence_group(RDSEncoder* enc, RDSGroup *group, char* grp, uint8_t stream) {
uint8_t udg_idx;
uint8_t ps_seq_idx = (stream == 0) ? 1 : 3;
uint8_t grp_seq_idx = (stream == 0) ? 0 : 2;
switch (*grp)
@@ -73,12 +48,6 @@ static void get_rds_sequence_group(RDSEncoder* enc, RDSGroup *group, char* grp,
case 'E':
get_rds_eon_group(enc, group);
break;
case 'X':
HANDLE_UDG_STREAM(0, udg1);
break;
case 'Y':
HANDLE_UDG_STREAM(1, udg2);
break;
case 'F':
get_rds_lps_group(enc, group);
break;
@@ -92,6 +61,8 @@ static void get_rds_sequence_group(RDSEncoder* enc, RDSGroup *group, char* grp,
case 'O':
case 'K':
case 'U':
case 'X':
case 'Y':
if(get_rdsp_lua_group(group, *grp) == 0) get_rds_ps_group(enc, group);
break;
}
@@ -111,11 +82,9 @@ static uint8_t check_rds_good_group(RDSEncoder* enc, char* grp) {
}
}
}
if(*grp == 'X' && enc->data[enc->program].udg1_len != 0) good_group = 1;
if(*grp == 'Y' && enc->data[enc->program].udg2_len != 0) good_group = 1;
if(*grp == 'F' && enc->data[enc->program].lps[0] != '\0') good_group = 1;
if(*grp == 'T') good_group = 1;
if(*grp == 'L' || *grp == 'R' || *grp == 'P' || *grp == 'S' || *grp == 'O' || *grp == 'K' || *grp == 'U') good_group = 1;
if(*grp == 'L' || *grp == 'R' || *grp == 'P' || *grp == 'S' || *grp == 'O' || *grp == 'K' || *grp == 'U' || *grp == 'X' || *grp == 'Y') good_group = 1;
return good_group;
}
@@ -138,21 +107,7 @@ void get_rds_group(RDSEncoder* enc, RDSGroup *group, uint8_t stream) {
if (utc->tm_min != enc->state[enc->program].last_minute) {
enc->state[enc->program].last_minute = utc->tm_min;
uint8_t eon_has_ta = 0;
for (int i = 0; i < EONs; i++) {
if (enc->data[enc->program].eon[i].enabled && enc->data[enc->program].eon[i].ta) {
eon_has_ta = 1;
break;
}
}
if(enc->data[enc->program].tp && enc->data[enc->program].ta && enc->state[enc->program].ta_timeout && !eon_has_ta) {
enc->state[enc->program].ta_timeout--;
if(enc->state[enc->program].ta_timeout == 0) {
enc->data[enc->program].ta = 0;
enc->state[enc->program].ta_timeout_state = enc->state[enc->program].ta_timeout;
};
}
lua_call_tfunction("minute_tick");
if(enc->data[enc->program].ct && stream == 0) {
get_rdsp_ct_group(group, now);
@@ -228,7 +183,7 @@ void get_rds_group(RDSEncoder* enc, RDSGroup *group, uint8_t stream) {
if(!good_group) cant_find_group++;
else cant_find_group = 0;
if(!good_group && cant_find_group == 23) {
if(!good_group && cant_find_group >= 23) {
cant_find_group = 0;
break;
}
-17
View File
@@ -72,17 +72,6 @@ typedef struct {
char grp_sqc[32];
char grp_sqc_rds2[32];
uint8_t udg1_len : 4;
uint8_t udg2_len : 4;
uint8_t udg1_len_rds2 : 4;
uint8_t udg2_len_rds2 : 4;
uint16_t udg1[8][3];
uint16_t udg2[8][3];
uint16_t udg1_rds2[8][4];
uint16_t udg2_rds2[8][4];
RDSEON eon[EONs];
uint8_t lua_data[LUA_USER_DATA];
@@ -119,17 +108,12 @@ typedef struct {
uint8_t data_ecc : 1;
uint8_t grp_seq_idx[4];
uint8_t udg_idxs[2];
uint8_t udg_idxs_rds2[2];
uint8_t fasttuning_state : 3;
uint8_t last_minute : 6;
uint8_t last_second : 6;
uint8_t ta_timeout : 7;
uint8_t ta_timeout_state : 7;
uint8_t eon_index : 3;
uint8_t eon_state : 4;
RDSEONState eon_states[4];
@@ -144,7 +128,6 @@ typedef struct {
typedef struct {
uint8_t rds2_mode : 2;
// uint8_t rds2_buffer[16384];
} RDSEncoderData;
typedef struct {
RDSEncoderData encoder_data;
+6 -2
View File
@@ -61,7 +61,8 @@ void get_rds_ps_group(RDSEncoder* enc, RDSGroup *group) {
if(enc->data[enc->program].af.num_afs) group->c = get_next_af(enc);
else {
group->b |= 1 << 11; // set to b
// Set type to B, just makes it easier for a receiver to catch the PI
group->b |= 1 << 11;
group->is_type_b = 1;
}
@@ -69,7 +70,10 @@ void get_rds_ps_group(RDSEncoder* enc, RDSGroup *group) {
else group->d = enc->state[enc->program].ps_text[enc->state[enc->program].ps_csegment * 2] << 8 | enc->state[enc->program].ps_text[enc->state[enc->program].ps_csegment * 2 + 1];
enc->state[enc->program].ps_csegment++;
if (enc->state[enc->program].ps_csegment == 4) enc->state[enc->program].ps_csegment = 0;
if (enc->state[enc->program].ps_csegment == 4) {
lua_call_tfunction("ps_transmission");
enc->state[enc->program].ps_csegment = 0;
}
}
void get_rds_fasttuning_group(RDSEncoder* enc, RDSGroup *group) {