diff options
Diffstat (limited to 'radiotools.c')
-rw-r--r-- | radiotools.c | 1882 |
1 files changed, 1882 insertions, 0 deletions
diff --git a/radiotools.c b/radiotools.c new file mode 100644 index 0000000..8ca9c19 --- /dev/null +++ b/radiotools.c @@ -0,0 +1,1882 @@ +/* + * radiotools.c - part of radio.c, a plugin for the Video Disk Recorder + * + * See the README file for copyright information and how to reach the author. + * + */ + +#include <string.h> +#include <stdio.h> +#include <math.h> +#include <sys/stat.h> +#include <vdr/tools.h> +#include "radiotools.h" +#include "radioaudio.h" + + +/* ----------------------------------------------------------------------------------------------------------- */ + +bool file_exists(const char *filename) +{ + struct stat file_stat; + + return ((stat(filename, &file_stat) == 0) ? true : false); +} + +bool enforce_directory(const char *path) +{ + struct stat sbuf; + + if (stat(path, &sbuf) != 0) { + dsyslog("radio: creating directory %s", path); + if (mkdir(path, ACCESSPERMS)) { + esyslog("radio: ERROR failed to create directory %s", path); + return false; + } + } + else { + if (!S_ISDIR(sbuf.st_mode)) { + esyslog("radio: ERROR failed to create directory %s: file exists but is not a directory", path); + return false; + } + } + + return true; +} + +/* ----------------------------------------------------------------------------------------------------------- */ + +#define crc_timetest 0 +#if crc_timetest + #include <time.h> + #include <sys/time.h> +#endif + +unsigned short crc16_ccitt(unsigned char *daten, int len, bool skipfirst) +{ +#if crc_timetest + struct timeval t; + unsigned long long tstart = 0; + if (gettimeofday(&t, NULL) == 0) + tstart = t.tv_sec*1000000 + t.tv_usec; +#endif + + // CRC16-CCITT: x^16 + x^12 + x^5 + 1 + // with start 0xffff and result invers + register unsigned short crc = 0xffff; + + if (skipfirst) *daten++; + while (len--) { + crc = (crc >> 8) | (crc << 8); + crc ^= *daten++; + crc ^= (crc & 0xff) >> 4; + crc ^= (crc << 8) << 4; + crc ^= ((crc & 0xff) << 4) << 1; + } + +#if crc_timetest + if (tstart > 0 && gettimeofday(&t, NULL) == 0) + printf("vdr-radio: crc-calctime = %d usec\n", (int)((t.tv_sec*1000000 + t.tv_usec) - tstart)); +#endif + + return ~(crc); +} + +/* ----------------------------------------------------------------------------------------------------------- */ + +#define EntityChars 56 +const char *entitystr[EntityChars] = { "'", "&", """, ">", "<", "©", "×", " ", + "Ä", "ä", "Ö", "ö", "Ü", "ü", "ß", "°", + "À", "Á", "Â", "Ã", "à", "á", "â", "ã", + "È", "É", "Ê", "Ë", "è", "é", "ê", "ë", + "Ì", "Í", "Î", "Ï", "ì", "í", "î", "ï", + "Ò", "Ó", "Ô", "Õ", "ò", "ó", "ô", "õ", + "Ù", "Ú", "Û", "Ñ", "ù", "ú", "û", "ñ" }; +const char *entitychar[EntityChars] = { "'", "&", "\"", ">", "<", "c", "*", " ", + "Ä", "ä", "Ö", "ö", "Ü", "ü", "ß", "°", + "À", "Á", "Â", "Ã", "à", "á", "â", "ã", + "È", "É", "Ê", "Ë", "è", "é", "ê", "ë", + "Ì", "Í", "Î", "Ï", "ì", "í", "î", "ï", + "Ò", "Ó", "Ô", "Õ", "ò", "ó", "ô", "õ", + "Ù", "Ú", "Û", "Ñ", "ù", "ú", "û", "ñ" }; + +char *rds_entitychar(char *text) +{ + int i = 0, l, lof, lre, space; + char *temp; + + while (i < EntityChars) { + if ((temp = strstr(text, entitystr[i])) != NULL) { + if ((S_Verbose & 0x0f) >= 2) + printf("RText-Entity: %s\n", text); + l = strlen(entitystr[i]); + lof = (temp-text); + if (strlen(text) < RT_MEL) { + lre = strlen(text) - lof - l; + space = 1; + } + else { + lre = RT_MEL - 1 - lof - l; + space = 0; + } + memmove(text+lof, entitychar[i], 1); + memmove(text+lof+1, temp+l, lre); + if (space != 0) + memmove(text+lof+1+lre, " ", l-1); + } + else i++; + } + + return text; +} + +/* ----------------------------------------------------------------------------------------------------------- */ + +#define XhtmlChars 56 +const char *xhtmlstr[XhtmlChars] = { "'", "&", """, ">", "<", "©", "*", " ", + "Ä", "ä", "Ö", "ö", "Ü", "ü", "ß", "°", + "À", "Á", "Â", "Ã", "à", "á", "â", "ã", + "È", "É", "Ê", "Ë", "è", "é", "ê", "ë", + "Ì", "Í", "Î", "Ï", "ì", "í", "î", "ï", + "Ò", "Ó", "Ô", "Õ", "ò", "ó", "ô", "õ", + "Ù", "Ú", "Û", "Ñ", "ù", "ú", "û", "ñ" }; +/* hex todo: "'", "&", */ +/* see *entitychar[] +const char *xhtmlychar[EntityChars] = { "'", "&", "\"", ">", "<", "c", "*", " ", + "Ä", "ä", "Ö", "ö", "Ü", "ü", "ß", "°", + "À", "Á", "Â", "Ã", "à", "á", "â", "ã", + "È", "É", "Ê", "Ë", "è", "é", "ê", "ë", + "Ì", "Í", "Î", "Ï", "ì", "í", "î", "ï", + "Ò", "Ó", "Ô", "Õ", "ò", "ó", "ô", "õ", + "Ù", "Ú", "Û", "Ñ", "ù", "ú", "û", "ñ" }; +*/ + +char *xhtml2text(char *text) +{ + int i = 0, l, lof, lre, space; + char *temp; + + while (i < XhtmlChars) { + if ((temp = strstr(text, xhtmlstr[i])) != NULL) { + if ((S_Verbose & 0x0f) >= 2) + printf("XHTML-Char: %s\n", text); + l = strlen(xhtmlstr[i]); + lof = (temp-text); + if (strlen(text) < RT_MEL) { + lre = strlen(text) - lof - l; + space = 1; + } + else { + lre = RT_MEL - 1 - lof - l; + space = 0; + } + memmove(text+lof, entitychar[i], 1); + memmove(text+lof+1, temp+l, lre); + if (space != 0) + memmove(text+lof+1+lre, " ", l-1); + } + else i++; + } + + rds_entitychar(text); + return text; +} + +/* ----------------------------------------------------------------------------------------------------------- */ + +char *rtrim(char *text) +{ + char *s = text + strlen(text) - 1; + while (s >= text && (*s == ' ' || *s == '\t' || *s == '\n' || *s == '\r')) + *s-- = 0; + + return text; +} + +/* ----------------------------------------------------------------------------------------------------------- */ + +const char *bitrates[5][16] = { + // MPEG 1, Layer 1-3 + { "free", "32k", "64k", "96k", "128k", "160k", "192k", "224k", "256k", "288k", "320k", "352k", "384k", "416k", "448k", "bad" }, + { "free", "32k", "48k", "56k", "64k", "80k", "96k", "112k", "128k", "160k", "192k", "224k", "256k", "320k", "384k", "bad" }, + { "free", "32k", "40k", "48k", "56k", "64k", "80k", "96k", "112k", "128k", "160k", "192k", "224k", "256k", "320k", "bad" } +/* MPEG 2/2.5, Layer 1+2/3 + { "free", "32k", "48k", "56k", "64k", "80k", "96k", "112k", "128k", "144k", "160k", "176k", "192k", "224k", "256k", "bad" }, + { "free", "8k", "16k", "24k", "32k", "40k", "48k", "56k", "64k", "80k", "96k", "112k", "128k", "144k", "160k", "bad" } +*/ +}; + +char *audiobitrate(const unsigned char *data) +{ + int hl = (data[8] > 0) ? 9 + data[8] : 9; + //printf("vdr-radio: audioheader = <%02x %02x %02x %02x>\n", data[hl], data[hl+1], data[hl+2], data[hl+3]); + + char *temp; + if (data[hl] == 0xff && (data[hl+1] & 0xe0) == 0xe0) { // syncword o.k. + int layer = (data[hl+1] & 0x06) >> 1; // Layer description + if (layer > 0) { + switch ((data[hl+1] & 0x18) >> 3) { // Audio Version ID + case 0x00: asprintf(&temp, "V2.5"); + break; + case 0x01: asprintf(&temp, "Vres"); + break; + case 0x02: asprintf(&temp, "V2"); + break; + case 0x03: asprintf(&temp, "%s", bitrates[3-layer][data[hl+2] >> 4]); + break; + } + } + else + asprintf(&temp, "Lres"); + } + else + asprintf(&temp, "???"); + + return temp; +} + +/* ----------------------------------------------------------------------------------------------------------- */ + +const char *tmc_duration[8] = { + "none", + "15 minutes", + "30 minutes", + "1 hour", + "2 hours", + "3 hours", + "4 hours", + "all day", +}; + +const char *tmc_direction[2] = { "+", "-" }; + +const char *tmc_event[2048] = { + "---", // 0 + "traffic problem", + "queuing traffic (with average speeds Q). Danger of stationary traffic", + "..", "..", "..", "..", "..", "..", "..", "..", // 10 + "overheight warning system triggered", + "(Q) accident(s), traffic being directed around accident area", + "..", "..", "..", + "closed, rescue and recovery work in progress", + "..", "..", "..", + "service area overcrowded, drive to another service area", // 20 + "..", + "service area, fuel station closed", + "service area, restaurant closed", + "bridge closed", + "tunnel closed", + "bridge blocked", + "tunnel blocked", + "road closed intermittently", + "..", "..", // 30 + "..", "..", "..", "..", "..", + "fuel station reopened", + "restaurant reopened", + "..", "..", + "smog alert ended", // 40 + "(Q) overtaking lane(s) closed", + "(Q) overtaking lane(s) blocked", + "..", "..", "..", "..", "..", "..", "..", "..", // 50 + "roadworks, (Q) overtaking lane(s) closed", + "(Q sets of) roadworks on the hard shoulder", + "(Q sets of) roadworks in the emergency lane", + "..", + "traffic problem expected", + "traffic congestion expected", + "normal traffic expected", + "..", "..", "..", // 60 + "(Q) object(s) on roadway {something that does not neccessarily block the road}", + "(Q) burst pipe(s)", + "(Q) object(s) on the road. Danger", + "burst pipe. Danger", + "..", "..", "..", "..", "..", + "traffic congestion, average speed of ?? km/h", // 70 + "traffic congestion, average speed of ?? km/h", + "traffic congestion, average speed of ?? km/h", + "traffic congestion, average speed of ?? km/h", + "traffic congestion, average speed of ?? km/h", + "traffic congestion, average speed of ?? km/h", + "traffic congestion, average speed of ?? km/h", + "..", "..", "..", "..", // 80 + "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", // 90 + "delays (Q) for cars", + "..", "..", "..", "..", "..", "..", "..", "..", "..", // 100 + "stationary traffic", + "stationary traffic for 1 km", + "stationary traffic for 2 km", + "stationary traffic for 4 km", + "stationary traffic for 6 km", + "stationary traffic for 10 km", + "stationary traffic expected", + "queuing traffic (with average speeds Q)", + "queuing traffic for 1 km (with average speeds Q)", + "queuing traffic for 2 km (with average speeds Q)", // 110 + "queuing traffic for 4 km (with average speeds Q)", + "queuing traffic for 6 km (with average speeds Q)", + "queuing traffic for 10 km (with average speeds Q)", + "queuing traffic expected", + "slow traffic (with average speeds Q)", + "slow traffic for 1 km (with average speeds Q)", + "slow traffic for 2 km (with average speeds Q)", + "slow traffic for 4 km (with average speeds Q)", + "slow traffic for 6 km (with average speeds Q)", + "slow traffic for 10 km (with average speeds Q)", // 120 + "slow traffic expected", + "heavy traffic (with average speeds Q)", + "heavy traffic expected", + "traffic flowing freely (with average speeds Q)", + "traffic building up (with average speeds Q)", + "no problems to report", + "traffic congestion cleared", + "message cancelled", + "stationary traffic for 3 km", + "danger of stationary traffic", // 130 + "queuing traffic for 3 km (with average speeds Q)", + "danger of queuing traffic (with average speeds Q)", + "long queues (with average speeds Q)", + "slow traffic for 3 km (with average speeds Q)", + "traffic easing", + "traffic congestion (with average speeds Q)", + "traffic lighter than normal (with average speeds Q)", + "queuing traffic (with average speeds Q). Approach with care", + "queuing traffic around a bend in the road", + "queuing traffic over the crest of a hill", // 140 + "all accidents cleared, no problems to report", + "traffic heavier than normal (with average speeds Q)", + "traffic very much heavier than normal (with average speeds Q)", + "..", "..", "..", "..", "..", "..", "..", // 150 + "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", // 160 + "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", // 170 + "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", // 180 + "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", // 190 + "..", "..", "..", "..", "..", "..", "..", "..", "..", + "multi vehicle pile up. Delays (Q)", // 200 + "(Q) accident(s)", + "(Q) serious accident(s)", + "multi-vehicle accident (involving Q vehicles)", + "accident involving (a/Q) heavy lorr(y/ies)", + "(Q) accident(s) involving hazardous materials", + "(Q) fuel spillage accident(s)", + "(Q) chemical spillage accident(s)", + "vehicles slowing to look at (Q) accident(s)", + "(Q) accident(s) in the opposing lanes", + "(Q) shed load(s)", // 210 + "(Q) broken down vehicle(s)", + "(Q) broken down heavy lorr(y/ies)", + "(Q) vehicle fire(s)", + "(Q) incident(s)", + "(Q) accident(s). Stationary traffic", + "(Q) accident(s). Stationary traffic for 1 km", + "(Q) accident(s). Stationary traffic for 2 km", + "(Q) accident(s). Stationary traffic for 4 km", + "(Q) accident(s). Stationary traffic for 6 km", + "(Q) accident(s). Stationary traffic for 10 km", // 220 + "(Q) accident(s). Danger of stationary traffic", + "(Q) accident(s). Queuing traffic", + "(Q) accident(s). Queuing traffic for 1 km", + "(Q) accident(s). Queuing traffic for 2 km", + "(Q) accident(s). Queuing traffic for 4 km", + "(Q) accident(s). Queuing traffic for 6 km", + "(Q) accident(s). Queuing traffic for 10 km", + "(Q) accident(s). Danger of queuing traffic", + "(Q) accident(s). Slow traffic", + "(Q) accident(s). Slow traffic for 1 km", // 230 + "(Q) accident(s). Slow traffic for 2 km", + "(Q) accident(s). Slow traffic for 4 km", + "(Q) accident(s). Slow traffic for 6 km", + "(Q) accident(s). Slow traffic for 10 km", + "(Q) accident(s). Slow traffic expected", + "(Q) accident(s). Heavy traffic", + "(Q) accident(s). Heavy traffic expected", + "(Q) accident(s). Traffic flowing freely", + "(Q) accident(s). Traffic building up", + "road closed due to (Q) accident(s)", // 240 + "(Q) accident(s). Right lane blocked", + "(Q) accident(s). Centre lane blocked", + "(Q) accident(s). Left lane blocked", + "(Q) accident(s). Hard shoulder blocked", + "(Q) accident(s). Two lanes blocked", + "(Q) accident(s). Three lanes blocked", + "accident. Delays (Q)", + "accident. Delays (Q) expected", + "accident. Long delays (Q)", + "vehicles slowing to look at (Q) accident(s). Stationary traffic", // 250 + "vehicles slowing to look at (Q) accident(s). Stationary traffic for 1 km", + "vehicles slowing to look at (Q) accident(s). Stationary traffic for 2 km", + "vehicles slowing to look at (Q) accident(s). Stationary traffic for 4 km", + "vehicles slowing to look at (Q) accident(s). Stationary traffic for 6 km", + "vehicles slowing to look at (Q) accident(s). Stationary traffic for 10 km", + "vehicles slowing to look at (Q) accident(s). Danger of stationary traffic", + "vehicles slowing to look at (Q) accident(s). Queuing traffic", + "vehicles slowing to look at (Q) accident(s). Queuing traffic for 1 km", + "vehicles slowing to look at (Q) accident(s). Queuing traffic for 2 km", + "vehicles slowing to look at (Q) accident(s). Queuing traffic for 4 km", // 260 + "vehicles slowing to look at (Q) accident(s). Queuing traffic for 6 km", + "vehicles slowing to look at (Q) accident(s). Queuing traffic for 10 km", + "vehicles slowing to look at (Q) accident(s). Danger of queuing traffic", + "vehicles slowing to look at (Q) accident(s). Slow traffic", + "vehicles slowing to look at (Q) accident(s). Slow traffic for 1 km", + "vehicles slowing to look at (Q) accident(s). Slow traffic for 2 km", + "vehicles slowing to look at (Q) accident(s). Slow traffic for 4 km", + "vehicles slowing to look at (Q) accident(s). Slow traffic for 6 km", + "vehicles slowing to look at (Q) accident(s). Slow traffic for 10 km", + "vehicles slowing to look at (Q) accident(s). Slow traffic expected", // 270 + "vehicles slowing to look at (Q) accident(s). Heavy traffic", + "vehicles slowing to look at (Q) accident(s). Heavy traffic expected", + "..", + "vehicles slowing to look at (Q) accident(s). Traffic building up", + "vehicles slowing to look at accident. Delays (Q)", + "vehicles slowing to look at accident. Delays (Q) expected", + "vehicles slowing to look at accident. Long delays (Q)", + "(Q) shed load(s). Stationary traffic", + "(Q) shed load(s). Stationary traffic for 1 km", + "(Q) shed load(s). Stationary traffic for 2 km", // 280 + "(Q) shed load(s). Stationary traffic for 4 km", + "(Q) shed load(s). Stationary traffic for 6 km", + "(Q) shed load(s). Stationary traffic for 10 km", + "(Q) shed load(s). Danger of stationary traffic", + "(Q) shed load(s). Queuing traffic", + "(Q) shed load(s). Queuing traffic for 1 km", + "(Q) shed load(s). Queuing traffic for 2 km", + "(Q) shed load(s). Queuing traffic for 4 km", + "(Q) shed load(s). Queuing traffic for 6 km", + "(Q) shed load(s). Queuing traffic for 10 km", // 290 + "(Q) shed load(s). Danger of queuing traffic", + "(Q) shed load(s). Slow traffic", + "(Q) shed load(s). Slow traffic for 1 km", + "(Q) shed load(s). Slow traffic for 2 km", + "(Q) shed load(s). Slow traffic for 4 km", + "(Q) shed load(s). Slow traffic for 6 km", + "(Q) shed load(s). Slow traffic for 10 km", + "(Q) shed load(s). Slow traffic expected", + "(Q) shed load(s). Heavy traffic", + "(Q) shed load(s). Heavy traffic expected", // 300 + "(Q) shed load(s). Traffic flowing freely", + "(Q) shed load(s). Traffic building up", + "blocked by (Q) shed load(s)", + "(Q) shed load(s). Right lane blocked", + "(Q) shed load(s). Centre lane blocked", + "(Q) shed load(s). Left lane blocked", + "(Q) shed load(s). Hard shoulder blocked", + "(Q) shed load(s). Two lanes blocked", + "(Q) shed load(s). Three lanes blocked", + "shed load. Delays (Q)", // 310 + "shed load. Delays (Q) expected", + "shed load. Long delays (Q)", + "(Q) broken down vehicle(s). Stationary traffic", + "(Q) broken down vehicle(s). Danger of stationary traffic", + "(Q) broken down vehicle(s). Queuing traffic", + "(Q) broken down vehicle(s). Danger of queuing traffic", + "(Q) broken down vehicle(s). Slow traffic", + "(Q) broken down vehicle(s). Slow traffic expected", + "(Q) broken down vehicle(s). Heavy traffic", + "(Q) broken down vehicle(s). Heavy traffic expected", // 320 + "(Q) broken down vehicle(s). Traffic flowing freely", + "(Q) broken down vehicle(s).Traffic building up", + "blocked by (Q) broken down vehicle(s).", + "(Q) broken down vehicle(s). Right lane blocked", + "(Q) broken down vehicle(s). Centre lane blocked", + "(Q) broken down vehicle(s). Left lane blocked", + "(Q) broken down vehicle(s). Hard shoulder blocked", + "(Q) broken down vehicle(s). Two lanes blocked", + "(Q) broken down vehicle(s). Three lanes blocked", + "broken down vehicle. Delays (Q)", // 330 + "broken down vehicle. Delays (Q) expected", + "broken down vehicle. Long delays (Q)", + "accident cleared", + "message cancelled", + "accident involving (a/Q) bus(es)", + "(Q) oil spillage accident(s)", + "(Q) overturned vehicle(s)", + "(Q) overturned heavy lorr(y/ies)", + "(Q) jackknifed trailer(s)", + "(Q) jackknifed caravan(s)", // 340 + "(Q) jackknifed articulated lorr(y/ies)", + "(Q) vehicle(s) spun around", + "(Q) earlier accident(s)", + "accident investigation work", + "(Q) secondary accident(s)", + "(Q) broken down bus(es)", + "(Q) overheight vehicle(s)", + "(Q) accident(s). Stationary traffic for 3 km", + "(Q) accident(s). Queuing traffic for 3 km", + "(Q) accident(s). Slow traffic for 3 km", // 350 + "(Q) accident(s) in roadworks area", + "vehicles slowing to look at (Q) accident(s). Stationary traffic for 3 km", + "vehicles slowing to look at (Q) accident(s). Queuing traffic for 3 km", + "vehicles slowing to look at (Q) accident(s). Slow traffic for 3 km", + "vehicles slowing to look at (Q) accident(s). Danger", + "(Q) shed load(s). Stationary traffic for 3 km", + "(Q) shed load(s). Queuing traffic for 3 km", + "(Q) shed load(s). Slow traffic for 3 km", + "(Q) shed load(s). Danger", + "(Q) overturned vehicle(s). Stationary traffic", // 360 + "(Q) overturned vehicle(s). Danger of stationary traffic", + "(Q) overturned vehicle(s). Queuing traffic", + "(Q) overturned vehicle(s). Danger of queuing traffic", + "(Q) overturned vehicle(s). Slow traffic", + "(Q) overturned vehicle(s). Slow traffic expected", + "(Q) overturned vehicle(s). Heavy traffic", + "(Q) overturned vehicle(s). Heavy traffic expected", + "(Q) overturned vehicle(s). Traffic building up", + "blocked by (Q) overturned vehicle(s)", + "(Q) overturned vehicle(s). Right lane blocked", // 370 + "(Q) overturned vehicle(s). Centre lane blocked", + "(Q) overturned vehicle(s). Left lane blocked", + "(Q) overturned vehicle(s). Two lanes blocked", + "(Q) overturned vehicle(s). Three lanes blocked", + "overturned vehicle. Delays (Q)", + "overturned vehicle. Delays (Q) expected", + "overturned vehicle. Long delays (Q)", + "(Q) overturned vehicle(s). Danger", + "Stationary traffic due to (Q) earlier accident(s)", + "Danger of stationary traffic due to (Q) earlier accident(s)", // 380 + "Queuing traffic due to (Q) earlier accident(s)", + "Danger of queuing traffic due to (Q) earlier accident(s)", + "Slow traffic due to (Q) earlier accident(s)", + "..", + "Heavy traffic due to (Q) earlier accident(s)", + "..", + "Traffic building up due to (Q) earlier accident(s)", + "Delays (Q) due to earlier accident", + "..", + "Long delays (Q) due to earlier accident", // 390 + "accident investigation work. Danger", + "(Q) secondary accident(s). Danger", + "(Q) broken down vehicle(s). Danger", + "(Q) broken down heavy lorr(y/ies). Danger", + "road cleared", + "incident cleared", + "rescue and recovery work in progress", + "..", + "message cancelled", + "..", // 400 + "closed", + "blocked", + "closed for heavy vehicles (over Q)", + "no through traffic for heavy lorries (over Q)", + "no through traffic", + "(Q th) entry slip road closed", + "(Q th) exit slip road closed", + "slip roads closed", + "slip road restrictions", + "closed ahead. Stationary traffic", // 410 + "closed ahead. Stationary traffic for 1 km", + "closed ahead. Stationary traffic for 2 km", + "closed ahead. Stationary traffic for 4 km", + "closed ahead. Stationary traffic for 6 km", + "closed ahead. Stationary traffic for 10 km", + "closed ahead. Danger of stationary traffic", + "closed ahead. Queuing traffic", + "closed ahead. Queuing traffic for 1 km", + "closed ahead. Queuing traffic for 2 km", + "closed ahead. Queuing traffic for 4 km", // 420 + "closed ahead. Queuing traffic for 6 km", + "closed ahead. Queuing traffic for 10 km", + "closed ahead. Danger of queuing traffic", + "closed ahead. Slow traffic", + "closed ahead. Slow traffic for 1 km", + "closed ahead. Slow traffic for 2 km", + "closed ahead. Slow traffic for 4 km", + "closed ahead. Slow traffic for 6 km", + "closed ahead. Slow traffic for 10 km", + "closed ahead. Slow traffic expected", // 430 + "closed ahead. Heavy traffic", + "closed ahead. Heavy traffic expected", + "closed ahead. Traffic flowing freely", + "closed ahead. Traffic building up", + "closed ahead. Delays (Q)", + "closed ahead. Delays (Q) expected", + "closed ahead. Long delays (Q)", + "blocked ahead. Stationary traffic", + "blocked ahead. Stationary traffic for 1 km", + "blocked ahead. Stationary traffic for 2 km", // 440 + "blocked ahead. Stationary traffic for 4 km", + "blocked ahead. Stationary traffic for 6 km", + "blocked ahead. Stationary traffic for 10 km", + "blocked ahead. Danger of stationary traffic", + "blocked ahead. Queuing traffic", + "blocked ahead. Queuing traffic for 1 km", + "blocked ahead. Queuing traffic for 2 km", + "blocked ahead. Queuing traffic for 4 km", + "blocked ahead. Queuing traffic for 6 km", + "blocked ahead. Queuing traffic for 10 km", // 450 + "blocked ahead. Danger of queuing traffic", + "blocked ahead. Slow traffic", + "blocked ahead. Slow traffic for 1 km", + "blocked ahead. Slow traffic for 2 km", + "blocked ahead. Slow traffic for 4 km", + "blocked ahead. Slow traffic for 6 km", + "blocked ahead. Slow traffic for 10 km", + "blocked ahead. Slow traffic expected", + "blocked ahead. Heavy traffic", + "blocked ahead. Heavy traffic expected", // 460 + "blocked ahead. Traffic flowing freely", + "blocked ahead. Traffic building up", + "blocked ahead. Delays (Q)", + "blocked ahead. Delays (Q) expected", + "blocked ahead. Long delays (Q)", + "slip roads reopened", + "reopened", + "message cancelled", + "closed ahead", + "blocked ahead", // 470 + "(Q) entry slip road(s) closed", + "(Q th) entry slip road blocked", + "entry blocked", + "(Q) exit slip road(s) closed", + "(Q th) exit slip road blocked", + "exit blocked", + "slip roads blocked", + "connecting carriageway closed", + "parallel carriageway closed", + "right-hand parallel carriageway closed", // 480 + "left-hand parallel carriageway closed", + "express lanes closed", + "through traffic lanes closed", + "local lanes closed", + "connecting carriageway blocked", + "parallel carriageway blocked", + "right-hand parallel carriageway blocked", + "left-hand parallel carriageway blocked", + "express lanes blocked", + "through traffic lanes blocked", // 490 + "local lanes blocked", + "no motor vehicles", + "restrictions", + "closed for heavy lorries (over Q)", + "closed ahead. Stationary traffic for 3 km", + "closed ahead. Queuing traffic for 3 km", + "closed ahead. Slow traffic for 3 km", + "blocked ahead. Stationary traffic for 3 km", + "blocked ahead. Queuing traffic for 3 km", + "(Q) lane(s) closed", // 500 + "(Q) right lane(s) closed", + "(Q) centre lane(s) closed", + "(Q) left lane(s) closed", + "hard shoulder closed", + "two lanes closed", + "three lanes closed", + "(Q) right lane(s) blocked", + "(Q) centre lane(s) blocked", + "(Q) left lane(s) blocked", + "hard shoulder blocked", // 510 + "two lanes blocked", + "three lanes blocked", + "single alternate line traffic", + "carriageway reduced (from Q lanes) to one lane", + "carriageway reduced (from Q lanes) to two lanes", + "carriageway reduced (from Q lanes) to three lanes", + "contraflow", + "narrow lanes", + "contraflow with narrow lanes", + "(Q) lane(s) blocked", // 520 + "(Q) lanes closed. Stationary traffic", + "(Q) lanes closed. Stationary traffic for 1 km", + "(Q) lanes closed. Stationary traffic for 2 km", + "(Q) lanes closed. Stationary traffic for 4 km", + "(Q) lanes closed. Stationary traffic for 6 km", + "(Q) lanes closed. Stationary traffic for 10 km", + "(Q) lanes closed. Danger of stationary traffic", + "(Q) lanes closed. Queuing traffic", + "(Q) lanes closed. Queuing traffic for 1 km", + "(Q) lanes closed. Queuing traffic for 2 km", // 530 + "(Q) lanes closed. Queuing traffic for 4 km", + "(Q) lanes closed. Queuing traffic for 6 km", + "(Q) lanes closed. Queuing traffic for 10 km", + "(Q) lanes closed. Danger of queuing traffic", + "(Q) lanes closed. Slow traffic", + "(Q) lanes closed. Slow traffic for 1 km", + "(Q) lanes closed. Slow traffic for 2 km", + "(Q) lanes closed. Slow traffic for 4 km", + "(Q) lanes closed. Slow traffic for 6 km", + "(Q) lanes closed. Slow traffic for 10 km", // 540 + "(Q) lanes closed. Slow traffic expected", + "(Q) lanes closed. Heavy traffic", + "(Q) lanes closed. Heavy traffic expected", + "(Q)lanes closed. Traffic flowing freely", + "(Q)lanes closed. Traffic building up", + "carriageway reduced (from Q lanes) to one lane. Stationary traffic", + "carriageway reduced (from Q lanes) to one lane. Danger of stationary traffic", + "carriageway reduced (from Q lanes) to one lane. Queuing traffic", + "carriageway reduced (from Q lanes) to one lane. Danger of queuing traffic", + "carriageway reduced (from Q lanes) to one lane. Slow traffic", // 550 + "carriageway reduced (from Q lanes) to one lane. Slow traffic expected", + "carriageway reduced (from Q lanes) to one lane. Heavy traffic", + "carriageway reduced (from Q lanes) to one lane. Heavy traffic expected", + "carriageway reduced (from Q lanes) to one lane. Traffic flowing freely", + "carriageway reduced (from Q lanes) to one lane. Traffic building up", + "carriageway reduced (from Q lanes) to two lanes. Stationary traffic", + "carriageway reduced (from Q lanes) to two lanes. Danger of stationary traffic", + "carriageway reduced (from Q lanes) to two lanes. Queuing traffic", + "carriageway reduced (from Q lanes) to two lanes. Danger of queuing traffic", + "carriageway reduced (from Q lanes) to two lanes. Slow traffic", // 560 + "carriageway reduced (from Q lanes) to two lanes. Slow traffic expected", + "carriageway reduced (from Q lanes) to two lanes. Heavy traffic", + "carriageway reduced (from Q lanes) to two lanes. Heavy traffic expected", + "carriageway reduced (from Q lanes) to two lanes. Traffic flowing freely", + "carriageway reduced (from Q lanes) to two lanes. Traffic building up", + "carriageway reduced (from Q lanes) to three lanes. Stationary traffic", + "carriageway reduced (from Q lanes) to three lanes. Danger of stationary traffic", + "carriageway reduced (from Q lanes) to three lanes. Queuing traffic", + "carriageway reduced (from Q lanes) to three lanes. Danger of queuing traffic", + "carriageway reduced (from Q lanes) to three lanes. Slow traffic", // 570 + "carriageway reduced (from Q lanes) to three lanes. Slow traffic expected", + "carriageway reduced (from Q lanes) to three lanes. Heavy traffic", + "carriageway reduced (from Q lanes) to three lanes. Heavy traffic expected", + "carriageway reduced (from Q lanes) to three lanes. Traffic flowing freely", + "carriageway reduced (from Q lanes) to three lanes. Traffic building up", + "contraflow. Stationary traffic", + "contraflow. Stationary traffic for 1 km", + "contraflow. Stationary traffic for 2 km", + "contraflow. Stationary traffic for 4 km", + "contraflow. Stationary traffic for 6 km", // 580 + "contraflow. Stationary traffic for 10 km", + "contraflow. Danger of stationary traffic", + "contraflow. Queuing traffic", + "contraflow. Queuing traffic for 1 km", + "contraflow. Queuing traffic for 2 km", + "contraflow. Queuing traffic for 4 km", + "contraflow. Queuing traffic for 6 km", + "contraflow. Queuing traffic for 10 km", + "contraflow. Danger of queuing traffic", + "contraflow. Slow traffic", // 590 + "contraflow. Slow traffic for 1 km", + "contraflow. Slow traffic for 2 km", + "contraflow. Slow traffic for 4 km", + "contraflow. Slow traffic for 6 km", + "contraflow. Slow traffic for 10 km", + "contraflow. Slow traffic expected", + "contraflow. Heavy traffic", + "contraflow. Heavy traffic expected", + "contraflow. Traffic flowing freely", + "contraflow. Traffic building up", // 600 + "contraflow. Carriageway reduced (from Q lanes) to one lane", + "contraflow. Carriageway reduced (from Q lanes) to two lanes", + "contraflow. Carriageway reduced (from Q lanes) to three lanes", + "narrow lanes. Stationary traffic", + "narrow lanes. Danger of stationary traffic", + "narrow lanes. Queuing traffic", + "narrow lanes. Danger of queuing traffic", + "narrow lanes. Slow traffic", + "narrow lanes. Slow traffic expected", + "narrow lanes. Heavy traffic", // 610 + "narrow lanes. Heavy traffic expected", + "narrow lanes. Traffic flowing freely", + "narrow lanes. Traffic building up", + "contraflow with narrow lanes. Stationary traffic", + "contraflow with narrow lanes. Stationary traffic. Danger of stationary traffic", + "contraflow with narrow lanes. Queuing traffic", + "contraflow with narrow lanes. Danger of queuing traffic", + "contraflow with narrow lanes. Slow traffic", + "contraflow with narrow lanes. Slow traffic expected", + "contraflow with narrow lanes. Heavy traffic", // 620 + "contraflow with narrow lanes. Heavy traffic expected", + "contraflow with narrow lanes. Traffic flowing freely", + "contraflow with narrow lanes. Traffic building up", + "lane closures removed", + "message cancelled", + "blocked ahead. Slow traffic for 3 km", + "no motor vehicles without catalytic converters", + "no motor vehicles with even-numbered registration plates", + "no motor vehicles with odd-numbered registration plates", + "open", // 630 + "road cleared", + "entry reopened", + "exit reopened", + "all carriageways reopened", + "motor vehicle restrictions lifted", + "traffic restrictions lifted {reopened for all traffic}", + "emergency lane closed", + "turning lane closed", + "crawler lane closed", + "slow vehicle lane closed", // 640 + "one lane closed", + "emergency lane blocked", + "turning lane blocked", + "crawler lane blocked", + "slow vehicle lane blocked", + "one lane blocked", + "(Q person) carpool lane in operation", + "(Q person) carpool lane closed", + "(Q person) carpool lane blocked", + "carpool restrictions changed (to Q persons per vehicle)", // 650 + "(Q) lanes closed. Stationary traffic for 3 km", + "(Q) lanes closed. Queuing traffic for 3 km", + "(Q) lanes closed. Slow traffic for 3 km", + "contraflow. Stationary traffic for 3 km", + "contraflow. Queuing traffic for 3 km", + "contraflow. Slow traffic for 3 km", + "lane blockages cleared", + "contraflow removed", + "(Q person) carpool restrictions lifted", + "lane restrictions lifted", // 660 + "use of hard shoulder allowed", + "normal lane regulations restored", + "all carriageways cleared", + "..", "..", "..", "..", "..", "..", "..", // 670 + "bus lane available for carpools (with at least Q occupants)", + "message cancelled", + "message cancelled", + "..", "..", + "bus lane blocked", + "..", + "heavy vehicle lane closed", + "heavy vehicle lane blocked", + "reopened for through traffic", // 680 + "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", // 690 + "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", // 700 + "(Q sets of) roadworks", + "(Q sets of) major roadworks", + "(Q sets of) maintenance work", + "(Q sections of) resurfacing work", + "(Q sets of) central reservation work", + "(Q sets of) road marking work", + "bridge maintenance work (at Q bridges)", + "(Q sets of) temporary traffic lights", + "(Q sections of) blasting work", + "(Q sets of) roadworks. Stationary traffic", // 710 + "(Q sets of) roadworks. Stationary traffic for 1 km", + "(Q sets of) roadworks. Stationary traffic for 2 km", + "(Q sets of) roadworks. Stationary traffic for 4 km", + "(Q sets of) roadworks. Stationary traffic for 6 km", + "(Q sets of) roadworks. Stationary traffic for 10 km", + "(Q sets of) roadworks. Danger of stationary traffic", + "(Q sets of) roadworks. Queuing traffic", + "(Q sets of) roadworks. Queuing traffic for 1 km", + "(Q sets of) roadworks. Queuing traffic for 2 km", + "(Q sets of) roadworks. Queuing traffic for 4 km", // 720 + "(Q sets of) roadworks. Queuing traffic for 6 km", + "(Q sets of) roadworks. Queuing traffic for 10 km", + "(Q sets of) roadworks. Danger of queuing traffic", + "(Q sets of) roadworks. Slow traffic", + "(Q sets of) roadworks. Slow traffic for 1 km", + "(Q sets of) roadworks. Slow traffic for 2 km", + "(Q sets of) roadworks. Slow traffic for 4 km", + "(Q sets of) roadworks. Slow traffic for 6 km", + "(Q sets of) roadworks. Slow traffic for 10 km", + "(Q sets of) roadworks. Slow traffic expected", // 730 + "(Q sets of) roadworks. Heavy traffic", + "(Q sets of) roadworks. Heavy traffic expected", + "(Q sets of) roadworks. Traffic flowing freely", + "(Q sets of) roadworks. Traffic building up", + "closed due to (Q sets of) roadworks", + "(Q sets of) roadworks. Right lane closed", + "(Q sets of) roadworks. Centre lane closed", + "(Q sets of) roadworks. Left lane closed", + "(Q sets of) roadworks. Hard shoulder closed", + "(Q sets of) roadworks. Two lanes closed", // 740 + "(Q sets of) roadworks. Three lanes closed", + "(Q sets of) roadworks. Single alternate line traffic", + "roadworks. Carriageway reduced (from Q lanes) to one lane", + "roadworks. Carriageway reduced (from Q lanes) to two lanes", + "roadworks. Carriageway reduced (from Q lanes) to three lanes", + "(Q sets of) roadworks. Contraflow", + "roadworks. Delays (Q)", + "roadworks. Delays (Q) expected", + "roadworks. Long delays (Q)", + "(Q sections of) resurfacing work. Stationary traffic", // 750 + "(Q sections of) resurfacing work. Stationary traffic for 1 km", + "(Q sections of) resurfacing work. Stationary traffic for 2 km", + "(Q sections of) resurfacing work. Stationary traffic for 4 km", + "(Q sections of) resurfacing work. Stationary traffic for 6 km", + "(Q sections of) resurfacing work. Stationary traffic for 10 km", + "(Q sections of) resurfacing work. Danger of stationary traffic", + "(Q sections of) resurfacing work. Queuing traffic", + "(Q sections of) resurfacing work. Queuing traffic for 1 km", + "(Q sections of) resurfacing work. Queuing traffic for 2 km", + "(Q sections of) resurfacing work. Queuing traffic for 4 km", // 760 + "(Q sections of) resurfacing work. Queuing traffic for 6 km", + "(Q sections of) resurfacing work. Queuing traffic for 10 km", + "(Q sections of) resurfacing work. Danger of queuing traffic", + "(Q sections of) resurfacing work. Slow traffic", + "(Q sections of) resurfacing work. Slow traffic for 1 km", + "(Q sections of) resurfacing work. Slow traffic for 2 km", + "(Q sections of) resurfacing work. Slow traffic for 4 km", + "(Q sections of) resurfacing work. Slow traffic for 6 km", + "(Q sections of) resurfacing work. Slow traffic for 10 km", + "(Q sections of) resurfacing work. Slow traffic expected", // 770 + "(Q sections of) resurfacing work. Heavy traffic", + "(Q sections of) resurfacing work. Heavy traffic expected", + "(Q sections of) resurfacing work. Traffic flowing freely", + "(Q sections of) resurfacing work. Traffic building up", + "(Q sections of) resurfacing work. Single alternate line traffic", + "resurfacing work. Carriageway reduced (from Q lanes) to one lane", + "resurfacing work. Carriageway reduced (from Q lanes) to two lanes", + "resurfacing work. Carriageway reduced (from Q lanes) to three lanes", + "(Q sections of) resurfacing work. Contraflow", + "resurfacing work. Delays (Q)", // 780 + "resurfacing work. Delays (Q) expected", + "resurfacing work. Long delays (Q)", + "(Q sets of) road marking work. Stationary traffic", + "(Q sets of) road marking work. Danger of stationary traffic", + "(Q sets of) road marking work. Queuing traffic", + "(Q sets of) road marking work. Danger of queuing traffic", + "(Q sets of) road marking work. Slow traffic", + "(Q sets of) road marking work. Slow traffic expected", + "(Q sets of) road marking work. Heavy traffic", + "(Q sets of) road marking work. Heavy traffic expected", // 790 + "(Q sets of) road marking work. Traffic flowing freely", + "(Q sets of) road marking work. Traffic building up", + "(Q sets of) road marking work. Right lane closed", + "(Q sets of) road marking work. Centre lane closed", + "(Q sets of) road marking work. Left lane closed", + "(Q sets of) road marking work. Hard shoulder closed", + "(Q sets of) road marking work. Two lanes closed", + "(Q sets of) road marking work. Three lanes closed", + "closed for bridge demolition work (at Q bridges)", + "roadworks cleared", // 800 + "message cancelled", + "(Q sets of) long-term roadworks", + "(Q sets of) construction work", + "(Q sets of) slow moving maintenance vehicles", + "bridge demolition work (at Q bridges)", + "(Q sets of) water main work", + "(Q sets of) gas main work", + "(Q sets of) work on buried cables", + "(Q sets of) work on buried services", + "new roadworks layout", // 810 + "new road layout", + "(Q sets of) roadworks. Stationary traffic for 3 km", + "(Q sets of) roadworks. Queuing traffic for 3 km", + "(Q sets of) roadworks. Slow traffic for 3 km", + "(Q sets of) roadworks during the day time", + "(Q sets of) roadworks during off-peak periods", + "(Q sets of) roadworks during the night", + "(Q sections of) resurfacing work. Stationary traffic for 3 km", + "(Q sections of) resurfacing work. Queuing traffic for 3 km", + "(Q sections of) resurfacing work. Slow traffic for 3 km", // 820 + "(Q sets of) resurfacing work during the day time", + "(Q sets of) resurfacing work during off-peak periods", + "(Q sets of) resurfacing work during the night", + "(Q sets of) road marking work. Danger", + "(Q sets of) slow moving maintenance vehicles. Stationary traffic", + "(Q sets of) slow moving maintenance vehicles. Danger of stationary traffic", + "(Q sets of) slow moving maintenance vehicles. Queuing traffic", + "(Q sets of) slow moving maintenance vehicles. Danger of queuing traffic", + "(Q sets of) slow moving maintenance vehicles. Slow traffic", + "(Q sets of) slow moving maintenance vehicles. Slow traffic expected", // 830 + "(Q sets of) slow moving maintenance vehicles. Heavy traffic", + "(Q sets of) slow moving maintenance vehicles. Heavy traffic expected", + "(Q sets of) slow moving maintenance vehicles. Traffic flowing freely", + "(Q sets of) slow moving maintenance vehicles. Traffic building up", + "(Q sets of) slow moving maintenance vehicles. Right lane closed", + "(Q sets of) slow moving maintenance vehicles. Centre lane closed", + "(Q sets of) slow moving maintenance vehicles. Left lane closed", + "(Q sets of) slow moving maintenance vehicles. Two lanes closed", + "(Q sets of) slow moving maintenance vehicles. Three lanes closed", + "water main work. Delays (Q)", // 840 + "water main work. Delays (Q) expected", + "water main work. Long delays (Q)", + "gas main work. Delays (Q)", + "gas main work. Delays (Q) expected", + "gas main work. Long delays (Q)", + "work on buried cables. Delays (Q)", + "work on buried cables. Delays (Q) expected", + "work on buried cables. Long delays (Q)", + "work on buried services. Delays (Q)", + "work on buried services. Delays (Q) expected", // 850 + "work on buried services. Long delays (Q)", + "construction traffic merging", + "roadwork clearance in progress", + "maintenance work cleared", + "road layout unchanged", + "construction traffic merging. Danger", + "..", "..", "..", "..", // 860 + "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", // 870 + "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", // 880 + "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", // 890 + "..", "..", "..", "..", "..", "..", "..", + "obstruction warning withdrawn", + "clearance work in progress, road free again", + "flooding expected", // 900 + "(Q) obstruction(s) on roadway {something that does block the road or part of", + "(Q) obstructions on the road. Danger", + "spillage on the road", + "storm damage", + "(Q) fallen trees", + "(Q) fallen trees. Danger", + "flooding", + "flooding. Danger", + "flash floods", + "danger of flash floods", // 910 + "avalanches", + "avalanche risk", + "rockfalls", + "landslips", + "earthquake damage", + "road surface in poor condition", + "subsidence", + "(Q) collapsed sewer(s)", + "burst water main", + "gas leak", // 920 + "serious fire", + "animals on roadway", + "animals on the road. Danger", + "clearance work", + "blocked by storm damage", + "blocked by (Q) fallen trees", + "(Q) fallen tree(s). Passable with care", + "flooding. Stationary traffic", + "flooding. Danger of stationary traffic", + "flooding. Queuing traffic", // 930 + "flooding. Danger of queuing traffic", + "flooding. Slow traffic", + "flooding. Slow traffic expected", + "flooding. Heavy traffic", + "flooding. Heavy traffic expected", + "flooding. Traffic flowing freely", + "flooding. Traffic building up", + "closed due to flooding", + "flooding. Delays (Q)", + "flooding. Delays (Q) expected", // 940 + "flooding. Long delays (Q)", + "flooding. Passable with care", + "closed due to avalanches", + "avalanches. Passable with care (above Q hundred metres)", + "closed due to rockfalls", + "rockfalls. Passable with care", + "road closed due to landslips", + "landslips. Passable with care", + "closed due to subsidence", + "subsidence. Single alternate line traffic", // 950 + "subsidence. Carriageway reduced (from Q lanes) to one lane", + "subsidence. Carriageway reduced (from Q lanes) to two lanes", + "subsidence. Carriageway reduced (from Q lanes) to three lanes", + "subsidence. Contraflow in operation", + "subsidence. Passable with care", + "closed due to sewer collapse", + "road closed due to burst water main", + "burst water main. Delays (Q)", + "burst water main. Delays (Q) expected", + "burst water main. Long delays (Q)", // 960 + "closed due to gas leak", + "gas leak. Delays (Q)", + "gas leak. Delays (Q) expected", + "gas leak. Long delays (Q)", + "closed due to serious fire", + "serious fire. Delays (Q)", + "serious fire. Delays (Q) expected", + "serious fire. Long delays (Q)", + "closed for clearance work", + "road free again", // 970 + "message cancelled", + "storm damage expected", + "fallen power cables", + "sewer overflow", + "ice build-up", + "mud slide", + "grass fire", + "air crash", + "rail crash", + "blocked by (Q) obstruction(s) on the road", // 980 + "(Q) obstructions on the road. Passable with care", + "blocked due to spillage on roadway", + "spillage on the road. Passable with care", + "spillage on the road. Danger", + "storm damage. Passable with care", + "storm damage. Danger", + "blocked by fallen power cables", + "fallen power cables. Passable with care", + "fallen power cables. Danger", + "sewer overflow. Danger", // 990 + "flash floods. Danger", + "avalanches. Danger", + "closed due to avalanche risk", + "avalanche risk. Danger", + "closed due to ice build-up", + "ice build-up. Passable with care (above Q hundred metres)", + "ice build-up. Single alternate traffic", + "rockfalls. Danger", + "landslips. Danger", + "earthquake damage. Danger", // 1000 + "hazardous driving conditions (above Q hundred metres)", + "danger of aquaplaning", + "slippery road (above Q hundred metres)", + "mud on road", + "leaves on road", + "ice (above Q hundred metres)", + "danger of ice (above Q hundred metres)", + "black ice (above Q hundred metres)", + "freezing rain (above Q hundred metres)", + "wet and icy roads (above Q hundred metres)", // 1010 + "slush (above Q hundred metres)", + "snow on the road (above Q hundred metres)", + "packed snow (above Q hundred metres)", + "fresh snow (above Q hundred metres)", + "deep snow (above Q hundred metres)", + "snow drifts (above Q hundred metres)", + "slippery due to spillage on roadway", + "slippery road (above Q hundred metres) due to snow", + "slippery road (above Q hundred metres) due to frost", + "road blocked by snow (above Q hundred metres)", // 1020 + "snow on the road. Carriageway reduced (from Q lanes) to one lane", + "snow on the road. Carriageway reduced (from Q lanes) to two lanes", + "snow on the road. Carriageway reduced (from Q lanes) to three lanes", + "conditions of road surface improved", + "message cancelled", + "subsidence. Danger", + "sewer collapse. Delays (Q)", + "sewer collapse. Delays (Q) expected", + "sewer collapse. Long delays (Q)", + "sewer collapse. Danger", // 1030 + "burst water main. Danger", + "gas leak. Danger", + "serious fire. Danger", + "clearance work. Danger", + "impassable (above Q hundred metres)", + "almost impassable (above Q hundred metres)", + "extremely hazardous driving conditions (above Q hundred metres)", + "difficult driving conditions (above Q hundred metres)", + "passable with care (up to Q hundred metres)", + "passable (up to Q hundred metres)", // 1040 + "surface water hazard", + "loose sand on road", + "loose chippings", + "oil on road", + "petrol on road", + "icy patches (above Q hundred metres)", + "danger of icy patches (above Q hundred metres)", + "danger of black ice (above Q hundred metres)", + "..", "..", // 1050 + "..", "..", "..", + "slippery due to loose sand on roadway", + "mud on road. Danger", + "loose chippings. Danger", + "oil on road. Danger", + "petrol on road. Danger", + "road surface in poor condition. Danger", + "icy patches (above Q hundred metres) on bridges", // 1060 + "danger of icy patches (above Q hundred metres) on bridges", + "icy patches (above Q hundred metres) on bridges, in shaded areas and on s", + "impassable for heavy vehicles (over Q)", + "impassable (above Q hundred metres) for vehicles with trailers", + "driving conditions improved", + "rescue and recovery work in progress. Danger", + "large animals on roadway", + "herds of animals on roadway", + "skid hazard reduced", + "snow cleared", // 1070 + "..", "..", + "extremely hazardous driving conditions expected (above Q hundred meters", + "freezing rain expected (above Q hundred metres)", + "danger of road being blocked by snow (above Q hundred metres)", + "..", "..", "..", + "temperature falling rapidly (to Q)", + "extreme heat (up to Q)", // 1080 + "extreme cold (of Q)", + "less extreme temperatures", + "current temperature (Q)", + "..", "..", "..", "..", "..", "..", "..", // 1090 + "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", // 1100 + "heavy snowfall (Q)", + "heavy snowfall (Q). Visibility reduced to < ?? m", + "heavy snowfall (Q). Visibility reduced to < ?? m", + "snowfall (Q)", + "snowfall (Q). Visibility reduced to < ?? m", + "hail (visibility reduced to Q)", + "sleet (visibility reduced to Q)", + "thunderstorms (visibility reduced to Q)", + "heavy rain (Q)", + "heavy rain (Q). Visibility reduced to < ?? m", // 1110 + "heavy rain (Q). Visibility reduced to < ?? m", + "rain (Q)", + "rain (Q). Visibility reduced to < ?? m", + "showers (visibility reduced to Q)", + "heavy frost", + "frost", + "..", "..", "..", "..", // 1120 + "..", "..", "..", "..", "..", + "weather situation improved", + "message cancelled", + "winter storm (visibility reduced to Q)", + "..", + "blizzard (visibility reduced to Q)", // 1130 + "..", + "damaging hail (visibility reduced to Q)", + "..", + "heavy snowfall. Visibility reduced (to Q)", + "snowfall. Visibility reduced (to Q)", + "heavy rain. Visibility reduced (to Q)", + "rain. Visibility reduced (to Q)", + "..", "..", "..", // 1140 + "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", // 1150 + "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", // 1160 + "..", "..", "..", "..", "..", "..", "..", "..", "..", + "heavy snowfall (Q) expected", // 1170 + "heavy rain (Q) expected", + "weather expected to improve", + "blizzard (with visibility reduced to Q) expected", + "damaging hail (with visibility reduced to Q) expected", + "reduced visibility (to Q) expected", + "freezing fog expected (with visibility reduced to Q). Danger of slippery roads", + "dense fog (with visibility reduced to Q) expected", + "patchy fog (with visibility reduced to Q) expected", + "visibility expected to improve", + "adverse weather warning withdrawn", // 1180 + "..", "..", "..", "..", "..", "..", "..", "..", "..", + "severe smog", // 1190 + "severe exhaust pollution", + "..", "..", "..", "..", "..", "..", "..", "..", "..", // 1200 + "tornadoes", + "hurricane force winds (Q)", + "gales (Q)", + "storm force winds (Q)", + "strong winds (Q)", + "..", "..", "..", + "gusty winds (Q)", + "crosswinds (Q)", // 1210 + "strong winds (Q) affecting high-sided vehicles", + "closed for high-sided vehicles due to strong winds (Q)", + "strong winds easing", + "message cancelled", + "restrictions for high-sided vehicles lifted", + "..", + "tornado warning ended", + "..", "..", "..", // 1220 + "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", // 1230 + "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", // 1240 + "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", // 1250 + "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", // 1260 + "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", // 1270 + "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", // 1280 + "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", // 1290 + "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", // 1300 + "dense fog (visibility reduced to Q)", + "dense fog. Visibility reduced to < ?? m", + "dense fog. Visibility reduced to < ?? m", + "fog (visibility reduced to Q)", + "fog. Visibility reduced to < ?? m", + "..", + "patchy fog (visibility reduced to Q)", + "freezing fog (visibility reduced to Q)", + "smoke hazard (visibility reduced to Q)", + "blowing dust (visibility reduced to Q)", // 1310 + "..", + "snowfall and fog (visibility reduced to Q)", + "visibility improved", + "message cancelled", + "..", "..", "..", + "visibility reduced (to Q)", + "visibility reduced to < ?? m", + "visibility reduced to < ?? m", // 1320 + "visibility reduced to < ?? m", + "white out (visibility reduced to Q)", + "blowing snow (visibility reduced to Q)", + "spray hazard (visibility reduced to Q)", + "low sun glare", + "sandstorms (visibility reduced to Q)", + "..", "..", "..", "..", // 1330 + "..", + "smog alert", + "..", "..", "..", "..", + "freezing fog (visibility reduced to Q). Slippery roads", + "no motor vehicles due to smog alert", + "..", + "swarms of insects (visibility reduced to Q)", // 1340 + "..", "..", "..", "..", + "fog clearing", + "fog forecast withdrawn", + "..", "..", "..", "..", // 1350 + "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", // 1360 + "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", // 1370 + "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", // 1380 + "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", // 1390 + "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", // 1400 + "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", // 1410 + "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", // 1420 + "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", // 1430 + "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", // 1440 + "..", "..", "..", "..", "..", "..", "..", "..", "..", + "international sports meeting", // 1450 + "match", + "tournament", + "athletics meeting", + "ball game", + "boxing tournament", + "bull fight", + "cricket match", + "cycle race", + "football match", + "golf tournament", // 1460 + "marathon", + "race meeting", + "rugby match", + "show jumping", + "tennis tournament", + "water sports meeting", + "winter sports meeting", + "funfair", + "trade fair", + "procession", // 1470 + "sightseers obstructing access", + "people on roadway", + "children on roadway", + "cyclists on roadway", + "strike", + "security incident", + "police checkpoint", + "terrorist incident", + "gunfire on roadway, danger", + "civil emergency", // 1480 + "air raid, danger", + "people on roadway. Danger", + "children on roadway. Danger", + "cyclists on roadway. Danger", + "closed due to security incident", + "security incident. Delays (Q)", + "security incident. Delays (Q) expected", + "security incident. Long delays (Q)", + "police checkpoint. Delays (Q)", + "police checkpoint. Delays (Q) expected", // 1490 + "police checkpoint. Long delays (Q)", + "security alert withdrawn", + "sports traffic cleared", + "evacuation", + "evacuation. Heavy traffic", + "traffic disruption cleared", + "..", "..", "..", "..", // 1500 + "major event", + "sports event meeting", + "show", + "festival", + "exhibition", + "fair", + "market", + "ceremonial event", + "state occasion", + "parade", // 1510 + "crowd", + "march", + "demonstration", + "public disturbance", + "security alert", + "bomb alert", + "major event. Stationary traffic", + "major event. Danger of stationary traffic", + "major event. Queuing traffic", + "major event. Danger of queuing traffic", // 1520 + "major event. Slow traffic", + "major event. Slow traffic expected", + "major event. Heavy traffic", + "major event. Heavy traffic expected", + "major event. Traffic flowing freely", + "major event. Traffic building up", + "closed due to major event", + "major event. Delays (Q)", + "major event. Delays (Q) expected", + "major event. Long delays (Q)", // 1530 + "sports meeting. Stationary traffic", + "sports meeting. Danger of stationary traffic", + "sports meeting. Queuing traffic", + "sports meeting. Danger of queuing traffic", + "sports meeting. Slow traffic", + "sports meeting. Slow traffic expected", + "sports meeting. Heavy traffic", + "sports meeting. Heavy traffic expected", + "sports meeting. Traffic flowing freely", + "sports meeting. Traffic building up", // 1540 + "closed due to sports meeting", + "sports meeting. Delays (Q)", + "sports meeting. Delays (Q) expected", + "sports meeting. Long delays (Q)", + "fair. Stationary traffic", + "fair. Danger of stationary traffic", + "fair. Queuing traffic", + "fair. Danger of queuing traffic", + "fair. Slow traffic", + "fair. Slow traffic expected", // 1550 + "fair. Heavy traffic", + "fair. Heavy traffic expected", + "fair. Traffic flowing freely", + "fair. Traffic building up", + "closed due to fair", + "fair. Delays (Q)", + "fair. Delays (Q) expected", + "fair. Long delays (Q)", + "closed due to parade", + "parade. Delays (Q)", // 1560 + "parade. Delays (Q) expected", + "parade. Long delays (Q)", + "closed due to strike", + "strike. Delays (Q)", + "strike. Delays (Q) expected", + "strike. Long delays (Q)", + "closed due to demonstration", + "demonstration. Delays (Q)", + "demonstration. Delays (Q) expected", + "demonstration. Long delays (Q)", // 1570 + "security alert. Stationary traffic", + "security alert. Danger of stationary traffic", + "security alert. Queuing traffic", + "security alert. Danger of queuing traffic", + "security alert. Slow traffic", + "security alert. Slow traffic expected", + "security alert. Heavy traffic", + "security alert. Heavy traffic expected", + "security alert. Traffic building up", + "closed due to security alert", // 1580 + "security alert. Delays (Q)", + "security alert. Delays (Q) expected", + "security alert. Long delays (Q)", + "traffic has returned to normal", + "message cancelled", + "security alert. Traffic flowing freely", + "air raid warning cancelled", + "civil emergency cancelled", + "message cancelled", + "several major events", // 1590 + "information about major event no longer valid", + "..", "..", "..", "..", "..", "..", "..", "..", "..", // 1600 + "delays (Q)", + "delays up to ?? minutes", + "delays up to ?? minutes", + "delays up to one hour", + "delays up to two hours", + "delays of several hours", + "delays (Q) expected", + "long delays (Q)", + "delays (Q) for heavy vehicles", + "delays up to ?? minutes for heavy lorr(y/ies)", // 1610 + "delays up to ?? minutes for heavy lorr(y/ies)", + "delays up to one hour for heavy lorr(y/ies)", + "delays up to two hours for heavy lorr(y/ies)", + "delays of several hours for heavy lorr(y/ies)", + "service suspended (until Q)", + "(Q) service withdrawn", + "(Q) service(s) fully booked", + "(Q) service(s) fully booked for heavy vehicles", + "normal services resumed", + "message cancelled", // 1620 + "delays up to ?? minutes", + "delays up to ?? minutes", + "delays up to ?? minutes", + "delays up to ?? minutes", + "delays up to ?? minutes", + "delays up to ?? minutes", + "delays up to ?? minutes", + "delays up to three hours", + "delays up to four hours", + "delays up to five hours", // 1630 + "very long delays (Q)", + "delays of uncertain duration", + "delayed until further notice", + "cancellations", + "park and ride service not operating (until Q)", + "special public transport services operating (until Q)", + "normal services not operating (until Q)", + "rail services not operating (until Q)", + "bus services not operating (until Q)", + "shuttle service operating (until Q)", // 1640 + "free shuttle service operating (until Q)", + "delays (Q) for heavy lorr(y/ies)", + "delays (Q) for buses", + "(Q) service(s) fully booked for heavy lorr(y/ies)", + "(Q) service(s) fully booked for buses", + "next departure (Q) for heavy lorr(y/ies)", + "next departure (Q) for buses", + "delays cleared", + "rapid transit service not operating (until Q)", + "delays (Q) possible", // 1650 + "underground service not operating (until Q)", + "cancellations expected", + "long delays expected", + "very long delays expected", + "all services fully booked (until Q)", + "next arrival (Q)", + "rail services irregular. Delays (Q)", + "bus services irregular. Delays (Q)", + "underground services irregular", + "normal public transport services resumed", // 1660 + "ferry service not operating (until Q)", + "park and ride trip time (Q)", + "delay expected to be cleared", + "..", "..", "..", "..", "..", "..", "..", // 1670 + "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", // 1680 + "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", // 1690 + "..", "..", "..", "..", + "current trip time (Q)", + "expected trip time (Q)", + "..", "..", "..", + "(Q) slow moving maintenance vehicle(s)", // 1700 + "(Q) vehicle(s) on wrong carriageway", + "dangerous vehicle warning cleared", + "message cancelled", + "(Q) reckless driver(s)", + "(Q) prohibited vehicle(s) on the roadway", + "(Q) emergency vehicles", + "(Q) high-speed emergency vehicles", + "high-speed chase (involving Q vehicles)", + "spillage occurring from moving vehicle", + "objects falling from moving vehicle", // 1710 + "emergency vehicle warning cleared", + "road cleared", + "..", "..", "..", "..", "..", "..", "..", + "rail services irregular", // 1720 + "public transport services not operating", + "..", "..", "..", "..", "..", "..", "..", "..", "..", // 1730 + "(Q) abnormal load(s), danger", + "(Q) wide load(s), danger", + "(Q) long load(s), danger", + "(Q) slow vehicle(s), danger", + "(Q) track-laying vehicle(s), danger", + "(Q) vehicle(s) carrying hazardous materials. Danger", + "(Q) convoy(s), danger", + "(Q) military convoy(s), danger", + "(Q) overheight load(s), danger", + "abnormal load causing slow traffic. Delays (Q)", // 1740 + "convoy causing slow traffic. Delays (Q)", + "..", "..", "..", "..", "..", "..", "..", "..", "..", // 1750 + "(Q) abnormal load(s)", + "(Q) wide load(s)", + "(Q) long load(s)", + "(Q) slow vehicle(s)", + "(Q) convoy(s)", + "abnormal load. Delays (Q)", + "abnormal load. Delays (Q) expected", + "abnormal load. Long delays (Q)", + "convoy causing delays (Q)", + "convoy. Delays (Q) expected", // 1760 + "convoy causing long delays (Q)", + "exceptional load warning cleared", + "message cancelled", + "(Q) track-laying vehicle(s)", + "(Q) vehicle(s) carrying hazardous materials", + "(Q) military convoy(s)", + "(Q) abnormal load(s). No overtaking", + "Vehicles carrying hazardous materials have to stop at next safe place!", + "hazardous load warning cleared", + "convoy cleared", // 1770 + "warning cleared", + "..", "..", "..", "..", "..", "..", "..", "..", "..", // 1780 + "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", // 1790 + "..", "..", "..", "..", "..", "..", "..", "..", "..", "..", // 1800 + "lane control signs not working", + "emergency telephones not working", + "emergency telephone number not working", + "(Q sets of) traffic lights not working", + "(Q sets of) traffic lights working incorrectly", + "level crossing failure", + "(Q sets of) traffic lights not working. Stationary traffic", + "(Q sets of) traffic lights not working. Danger of stationary traffic", + "(Q sets of) traffic lights not working. Queuing traffic", + "(Q sets of) traffic lights not working. Danger of queuing traffic", // 1810 + "(Q sets of) traffic lights not working. Slow traffic", + "(Q sets of) traffic lights not working. Slow traffic expected", + "(Q sets of) traffic lights not working. Heavy traffic", + "(Q sets of) traffic lights not working. Heavy traffic expected", + "(Q sets of) traffic lights not working. Traffic flowing freely", + "(Q sets of) traffic lights not working. Traffic building up", + "traffic lights not working. Delays (Q)", + "traffic lights not working. Delays (Q) expected", + "traffic lights not working. Long delays (Q)", + "level crossing failure. Stationary traffic", // 1820 + "level crossing failure. Danger of stationary traffic", + "level crossing failure. Queuing traffic", + "level crossing failure. Danger of queuing traffic", + "level crossing failure. Slow traffic", + "level crossing failure. Slow traffic expected", + "level crossing failure. Heavy traffic", + "level crossing failure. Heavy traffic expected", + "level crossing failure. Traffic flowing freely", + "level crossing failure. Traffic building up", + "level crossing failure. Delays (Q)", // 1830 + "level crossing failure. Delays (Q) expected", + "level crossing failure. Long delays (Q)", + "electronic signs repaired", + "emergency call facilities restored", + "traffic signals repaired", + "level crossing now working normally", + "message cancelled", + "lane control signs working incorrectly", + "lane control signs operating", + "variable message signs not working", // 1840 + "variable message signs working incorrectly", + "variable message signs operating", + "(Q sets of) ramp control signals not working", + "(Q sets of) ramp control signals working incorrectly", + "(Q sets of) temporary traffic lights not working", + "(Q sets of) temporary traffic lights working incorrectly", + "traffic signal control computer not working", + "traffic signal timings changed", + "tunnel ventilation not working", + "lane control signs not working. Danger", // 1850 + "temporary width limit (Q)", + "temporary width limit lifted", + "..", + "traffic regulations have been changed", + "less than parking spaces available", + "no parking information available (until Q)", + "message cancelled", + "..", "..", "..", // 1860 + "temporary height limit (Q)", + "temporary height limit lifted", + "..", + "lane control signs working incorrectly. Danger", + "emergency telephones out of order. Extra police patrols in operation", + "emergency telephones out of order. In emergency, wait for police patrol", + "(Q sets of) traffic lights not working. Danger", + "traffic lights working incorrectly. Delays (Q)", + "traffic lights working incorrectly. Delays (Q) expected", + "traffic lights working incorrectly. Long delays (Q)", // 1870 + "temporary axle load limit (Q)", + "temporary gross weight limit (Q)", + "temporary gross weight limit lifted", + "temporary axle weight limit lifted", + "(Q sets of) traffic lights working incorrectly. Danger", + "temporary traffic lights not working. Delays (Q)", + "temporary traffic lights not working. Delays (Q) expected", + "temporary traffic lights not working. Long delays (Q)", + "(Q sets of) temporary traffic lights not working. Danger", + "traffic signal control computer not working. Delays (Q)", // 1880 + "temporary length limit (Q)", + "temporary length limit lifted", + "message cancelled", + "traffic signal control computer not working. Delays (Q) expected", + "traffic signal control computer not working. Long delays (Q)", + "normal parking restrictions lifted", + "special parking restrictions in force", + "10% full", + "20% full", + "30% full", // 1890 + "40% full", + "50% full", + "60% full", + "70% full", + "80% full", + "90% full", + "less than ?? parking spaces available", + "less than ?? parking spaces available", + "less than ?? parking spaces available", + "less than ?? parking spaces available", // 1900 + "next departure (Q)", + "next departure (Q) for heavy vehicles", + "car park (Q) full", + "all car parks (Q) full", + "less than (Q) car parking spaces available", + "park and ride service operating (until Q)", + "(null event)", + "switch your car radio (to Q)", + "alarm call: important new information on this frequency follows now in normal", + "alarm set: new information will be broadcast between these times in normal", // 1910 + "message cancelled", + "..", + "switch your car radio (to Q)", + "no information available (until Q)", + "this message is for test purposes only (number Q), please ignore", + "no information available (until Q) due to technical problems", + "..", + "full", + "..", + "only a few parking spaces available", // 1920 + "(Q) parking spaces available", + "expect car park to be full", + "expect no parking spaces available", + "multi story car parks full", + "no problems to report with park and ride services", + "no parking spaces available", + "no parking (until Q)", + "special parking restrictions lifted", + "urgent information will be given (at Q) on normal programme broadcasts", + "this TMC-service is not active (until Q)", // 1930 + "detailed information will be given (at Q) on normal programme broadcasts", + "detailed information is provided by another TMC service", + "..", + "no park and ride information available (until Q)", + "..", "..", "..", + "park and ride information service resumed", + "..", + "additional regional information is provided by another TMC service", // 1940 + "additional local information is provided by another TMC service", + "additional public transport information is provided by another TMC service", + "national traffic information is provided by another TMC service", + "this service provides major road information", + "this service provides regional travel information", + "this service provides local travel information", + "no detailed regional information provided by this service", + "no detailed local information provided by this service", + "no cross-border information provided by this service", + "information restricted to this area", // 1950 + "no new traffic information available (until Q)", + "no public transport information available", + "this TMC-service is being suspended (at Q)", + "active TMC-service will resume (at Q)", + "reference to audio programmes no longer valid", + "reference to other TMC services no longer valid", + "previous announcement about this or other TMC services no longer valid", + "..", "..", "..", // 1960 + "allow emergency vehicles to pass in the carpool lane", + "carpool lane available for all vehicles", + "police directing traffic via the carpool lane", + "..", "..", "..", "..", "..", "..", "..", // 1970 + "police directing traffic", + "buslane available for all vehicles", + "police directing traffic via the buslane", + "allow emergency vehicles to pass", + "..", "..", + "allow emergency vehicles to pass in the heavy vehicle lane", + "heavy vehicle lane available for all vehicles", + "police directing traffic via the heavy vehicle lane", + "..", // 1980 + "..", + "buslane closed", + "..", "..", "..", "..", "..", "..", "..", "..", // 1990 + "..", "..", "..", "..", "..", "..", "..", "..", "..", + "closed due to smog alert (until Q)", // 2000 + "..", "..", "..", "..", "..", + "closed for vehicles with less than three occupants {not valid for lorries}", + "closed for vehicles with only one occupant {not valid for lorries}", + "..", "..", "..", // 2010 + "..", "..", + "service area busy", + "..", "..", "..", "..", "..", "..", "..", // 2020 + "service not operating, substitute service available", + "public transport strike", + "..", "..", "..", "..", "..", + "message cancelled", + "message cancelled", + "message cancelled", // 2030 + "..", "..", + "message cancelled", + "message cancelled", + "message cancelled", + "..", "..", + "message cancelled", + "message cancelled", + "message cancelled", // 2040 + "..", "..", "..", "..", "..", "..", + "(null message)", // last = 2047 +}; + +const char *tmc_mglabel[16] = { + "Duration", + "Control code", + "Length", + "Speed limit", + "Quantifier", + "Quantifier", + "Info code", + "Start time", + "Stop time", + "Event", + "Diversion", + "Location", + "unknown", + "Location", + "NOP", + "unknown", +}; +int tmc_mgsize[16] = { 3, 3, 5, 5, 5, 8, 8, 8, 8, 11, 16, 16, 16, 16, 0, 0 }; + +// TMC, Alert-C Coding +void tmc_parser(unsigned char *data, int len) +{ + static char lastdata[6]; + + if (len < 6) { + printf("TMC Length only '%d' bytes (<6).\n", len); + return; + } + + if (memcmp(data, lastdata, 6) == 0) { + printf("TMC Repeating.\n"); + return; + } + memcpy(lastdata, data, 6); + + // Buffer = data[0], todo or not :D + + // check Encrypted-Service, TMC Pro ? + if ((data[1] & 0x1f) == 0x00) { // Type+DP = '00000' + printf("TMC Encrypted Service detected, TMC-Pro?\n"); + return; + } + + int type = (data[1] & 0x18)>>3; // Type = User-,TuningInformation & Multi-,Singlegroup Message + int dp = data[1] & 0x07; // Duration+Persistance or Continuity Index + int da = (data[2] & 0x80)>>7; // DiversionAdvice or GroupIndicator + int di = (data[2] & 0x40)>>6; // Direction (-/+) or 2.GroupIndicator + int ex = (data[2] & 0x38)>>3; // Extent + int ev = (data[2] & 0x07)<<8 | data[3]; // Event + int lo = data[4]<<8 | data[5]; // Location + + switch (type) { + case 0: // Multigroup-Message + printf("TMC Multi-Group Message, "); + if (da == 1) { + printf("First:\n"); + printf(" CI: '%d', Direction: %s, Extent: '%d'\n", dp, tmc_direction[di], ex); + printf(" Event: '%d' = %s\n", ev, tmc_event[ev]); + printf(" Location: '%d' > LT not available yet :-(\n", lo); + } + else { + int gsi = (data[2] & 0x30)>>4; // GroupSequenceIdentifier + printf("Subsequent:\n"); + printf(" CI: '%d', 2.GI: '%d', GSI: '%d', Block_0x: '%02x%02x%02x%02x'\n", dp, di, gsi, data[2]&0xf, data[3], data[4], data[5]); + if (di == 0) { + printf(" SecondGroupIndicator = 0 -> todo, exit here.\n\n"); + return; + } + unsigned int block = (data[2]&0x0f)<<24 | data[3]<<16 | data[4]<<8 | data[5]; + int lc = 1; + int rbits = 28; + while (rbits > 0) { + int lb = block>>(rbits-4); + rbits -= 4; + if (lb <= 0) + return; + block = block & ((unsigned long int)(pow(2,rbits)) - 1); + rbits -= tmc_mgsize[lb]; + int val = block>>(rbits); + printf(" #%d: Label '%02d' = %s", lc, lb, tmc_mglabel[lb]); + if (val > 0) { + switch (lb) { + case 0: printf(", Value '%d' min.?\n", val); + break; + case 2: printf(", Value '%d' km?\n", val); + break; + case 3: printf(", Value '%d' km/h?\n", val); + break; + case 9: printf(", Value '%d' = %s\n", val, tmc_event[val]); + break; + case 11: + case 13: printf(", Value '%d' > LT not available yet :-(\n", val); + break; + case 14: + case 15: printf(" ---\n"); + break; + default: printf(", Value '%d'\n", val); + } + } + else { + if (block > 0) + printf(", rest block_0x '%04x'\n", (int)block); + else + printf(", ...\n"); + } + block = block & ((unsigned int)(pow(2,rbits)) - 1); + lc++; + } + } + break; + case 1: // Singlegroup-Message + printf("TMC Single-Group Message:\n"); + printf(" Duration: %s, Diversion: '%d', Direction: %s, Extent: '%d'\n", tmc_duration[dp], da, tmc_direction[di], ex); + printf(" Event: '%d' = %s\n", ev, tmc_event[ev]); + printf(" Location: '%d' > LT not available yet :-(\n", lo); + break; + case 2: + case 3: // System,Tuning + printf("TMC Tuning/System Information:\n"); + switch (data[1] & 0x0f) { + case 9: printf(" LTN: '%d', MGS: '%d', SID: '%d' %04x.\n", data[2]>>2, (data[2] & 0x03)<<2 | data[3]>>6, data[3] & 0x3f, lo); + break; + default: printf(" todo, exit.\n"); + } + } + +} + + +//--------------- End ----------------------------------------------------------------- |