first commit
145242
DMRIds.dat
Executable file
16
MMDVMCal/.gitignore
vendored
Executable file
|
@ -0,0 +1,16 @@
|
||||||
|
Debug
|
||||||
|
Release
|
||||||
|
x64
|
||||||
|
MMDVMCal
|
||||||
|
*.o
|
||||||
|
*.opendb
|
||||||
|
*.bak
|
||||||
|
*.obj
|
||||||
|
*~
|
||||||
|
*.sdf
|
||||||
|
*.log
|
||||||
|
*.zip
|
||||||
|
*.exe
|
||||||
|
*.user
|
||||||
|
*.VC.db
|
||||||
|
.vs
|
1223
MMDVMCal/BERCal.cpp
Executable file
57
MMDVMCal/BERCal.h
Executable file
|
@ -0,0 +1,57 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2018 by Andy Uribe CA6JAU
|
||||||
|
* Copyright (C) 2018 by Bryan Biedenkapp N2PLL
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(BERCAL_H)
|
||||||
|
#define BERCAL_H
|
||||||
|
|
||||||
|
class CBERCal {
|
||||||
|
public:
|
||||||
|
CBERCal();
|
||||||
|
~CBERCal();
|
||||||
|
|
||||||
|
void DSTARFEC(const unsigned char* buffer, const unsigned char m_tag);
|
||||||
|
void DMRFEC(const unsigned char* buffer, const unsigned char m_seq);
|
||||||
|
void DMR1K(const unsigned char *buffer, const unsigned char m_seq);
|
||||||
|
void YSFFEC(const unsigned char* buffer);
|
||||||
|
void P25FEC(const unsigned char* buffer);
|
||||||
|
void NXDNFEC(const unsigned char* buffer, const unsigned char m_tag);
|
||||||
|
|
||||||
|
void clock();
|
||||||
|
|
||||||
|
private:
|
||||||
|
unsigned int m_errors;
|
||||||
|
unsigned int m_bits;
|
||||||
|
unsigned int m_frames;
|
||||||
|
|
||||||
|
unsigned int m_timeout;
|
||||||
|
unsigned int m_timer;
|
||||||
|
|
||||||
|
void NXDNScrambler(unsigned char* data);
|
||||||
|
unsigned int regenerateDStar(unsigned int& a, unsigned int& b);
|
||||||
|
unsigned int regenerateDMR(unsigned int& a, unsigned int& b, unsigned int& c);
|
||||||
|
unsigned int regenerateIMBE(const unsigned char* bytes);
|
||||||
|
unsigned int regenerateYSFDN(unsigned char* bytes);
|
||||||
|
|
||||||
|
unsigned char countErrs(unsigned char a, unsigned char b);
|
||||||
|
|
||||||
|
void timerStart();
|
||||||
|
void timerStop();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
239
MMDVMCal/CRC.cpp
Executable file
|
@ -0,0 +1,239 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2015,2016 by Jonathan Naylor G4KLX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "CRC.h"
|
||||||
|
|
||||||
|
#include "Utils.h"
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cassert>
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
const uint8_t CRC8_TABLE[] = {
|
||||||
|
0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15, 0x38, 0x3F, 0x36, 0x31,
|
||||||
|
0x24, 0x23, 0x2A, 0x2D, 0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65,
|
||||||
|
0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D, 0xE0, 0xE7, 0xEE, 0xE9,
|
||||||
|
0xFC, 0xFB, 0xF2, 0xF5, 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD,
|
||||||
|
0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85, 0xA8, 0xAF, 0xA6, 0xA1,
|
||||||
|
0xB4, 0xB3, 0xBA, 0xBD, 0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2,
|
||||||
|
0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA, 0xB7, 0xB0, 0xB9, 0xBE,
|
||||||
|
0xAB, 0xAC, 0xA5, 0xA2, 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A,
|
||||||
|
0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32, 0x1F, 0x18, 0x11, 0x16,
|
||||||
|
0x03, 0x04, 0x0D, 0x0A, 0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42,
|
||||||
|
0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A, 0x89, 0x8E, 0x87, 0x80,
|
||||||
|
0x95, 0x92, 0x9B, 0x9C, 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4,
|
||||||
|
0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC, 0xC1, 0xC6, 0xCF, 0xC8,
|
||||||
|
0xDD, 0xDA, 0xD3, 0xD4, 0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C,
|
||||||
|
0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44, 0x19, 0x1E, 0x17, 0x10,
|
||||||
|
0x05, 0x02, 0x0B, 0x0C, 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34,
|
||||||
|
0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B, 0x76, 0x71, 0x78, 0x7F,
|
||||||
|
0x6A, 0x6D, 0x64, 0x63, 0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B,
|
||||||
|
0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13, 0xAE, 0xA9, 0xA0, 0xA7,
|
||||||
|
0xB2, 0xB5, 0xBC, 0xBB, 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83,
|
||||||
|
0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB, 0xE6, 0xE1, 0xE8, 0xEF,
|
||||||
|
0xFA, 0xFD, 0xF4, 0xF3, 0x01 };
|
||||||
|
|
||||||
|
const uint16_t CCITT16_TABLE1[] = {
|
||||||
|
0x0000U, 0x1189U, 0x2312U, 0x329bU, 0x4624U, 0x57adU, 0x6536U, 0x74bfU,
|
||||||
|
0x8c48U, 0x9dc1U, 0xaf5aU, 0xbed3U, 0xca6cU, 0xdbe5U, 0xe97eU, 0xf8f7U,
|
||||||
|
0x1081U, 0x0108U, 0x3393U, 0x221aU, 0x56a5U, 0x472cU, 0x75b7U, 0x643eU,
|
||||||
|
0x9cc9U, 0x8d40U, 0xbfdbU, 0xae52U, 0xdaedU, 0xcb64U, 0xf9ffU, 0xe876U,
|
||||||
|
0x2102U, 0x308bU, 0x0210U, 0x1399U, 0x6726U, 0x76afU, 0x4434U, 0x55bdU,
|
||||||
|
0xad4aU, 0xbcc3U, 0x8e58U, 0x9fd1U, 0xeb6eU, 0xfae7U, 0xc87cU, 0xd9f5U,
|
||||||
|
0x3183U, 0x200aU, 0x1291U, 0x0318U, 0x77a7U, 0x662eU, 0x54b5U, 0x453cU,
|
||||||
|
0xbdcbU, 0xac42U, 0x9ed9U, 0x8f50U, 0xfbefU, 0xea66U, 0xd8fdU, 0xc974U,
|
||||||
|
0x4204U, 0x538dU, 0x6116U, 0x709fU, 0x0420U, 0x15a9U, 0x2732U, 0x36bbU,
|
||||||
|
0xce4cU, 0xdfc5U, 0xed5eU, 0xfcd7U, 0x8868U, 0x99e1U, 0xab7aU, 0xbaf3U,
|
||||||
|
0x5285U, 0x430cU, 0x7197U, 0x601eU, 0x14a1U, 0x0528U, 0x37b3U, 0x263aU,
|
||||||
|
0xdecdU, 0xcf44U, 0xfddfU, 0xec56U, 0x98e9U, 0x8960U, 0xbbfbU, 0xaa72U,
|
||||||
|
0x6306U, 0x728fU, 0x4014U, 0x519dU, 0x2522U, 0x34abU, 0x0630U, 0x17b9U,
|
||||||
|
0xef4eU, 0xfec7U, 0xcc5cU, 0xddd5U, 0xa96aU, 0xb8e3U, 0x8a78U, 0x9bf1U,
|
||||||
|
0x7387U, 0x620eU, 0x5095U, 0x411cU, 0x35a3U, 0x242aU, 0x16b1U, 0x0738U,
|
||||||
|
0xffcfU, 0xee46U, 0xdcddU, 0xcd54U, 0xb9ebU, 0xa862U, 0x9af9U, 0x8b70U,
|
||||||
|
0x8408U, 0x9581U, 0xa71aU, 0xb693U, 0xc22cU, 0xd3a5U, 0xe13eU, 0xf0b7U,
|
||||||
|
0x0840U, 0x19c9U, 0x2b52U, 0x3adbU, 0x4e64U, 0x5fedU, 0x6d76U, 0x7cffU,
|
||||||
|
0x9489U, 0x8500U, 0xb79bU, 0xa612U, 0xd2adU, 0xc324U, 0xf1bfU, 0xe036U,
|
||||||
|
0x18c1U, 0x0948U, 0x3bd3U, 0x2a5aU, 0x5ee5U, 0x4f6cU, 0x7df7U, 0x6c7eU,
|
||||||
|
0xa50aU, 0xb483U, 0x8618U, 0x9791U, 0xe32eU, 0xf2a7U, 0xc03cU, 0xd1b5U,
|
||||||
|
0x2942U, 0x38cbU, 0x0a50U, 0x1bd9U, 0x6f66U, 0x7eefU, 0x4c74U, 0x5dfdU,
|
||||||
|
0xb58bU, 0xa402U, 0x9699U, 0x8710U, 0xf3afU, 0xe226U, 0xd0bdU, 0xc134U,
|
||||||
|
0x39c3U, 0x284aU, 0x1ad1U, 0x0b58U, 0x7fe7U, 0x6e6eU, 0x5cf5U, 0x4d7cU,
|
||||||
|
0xc60cU, 0xd785U, 0xe51eU, 0xf497U, 0x8028U, 0x91a1U, 0xa33aU, 0xb2b3U,
|
||||||
|
0x4a44U, 0x5bcdU, 0x6956U, 0x78dfU, 0x0c60U, 0x1de9U, 0x2f72U, 0x3efbU,
|
||||||
|
0xd68dU, 0xc704U, 0xf59fU, 0xe416U, 0x90a9U, 0x8120U, 0xb3bbU, 0xa232U,
|
||||||
|
0x5ac5U, 0x4b4cU, 0x79d7U, 0x685eU, 0x1ce1U, 0x0d68U, 0x3ff3U, 0x2e7aU,
|
||||||
|
0xe70eU, 0xf687U, 0xc41cU, 0xd595U, 0xa12aU, 0xb0a3U, 0x8238U, 0x93b1U,
|
||||||
|
0x6b46U, 0x7acfU, 0x4854U, 0x59ddU, 0x2d62U, 0x3cebU, 0x0e70U, 0x1ff9U,
|
||||||
|
0xf78fU, 0xe606U, 0xd49dU, 0xc514U, 0xb1abU, 0xa022U, 0x92b9U, 0x8330U,
|
||||||
|
0x7bc7U, 0x6a4eU, 0x58d5U, 0x495cU, 0x3de3U, 0x2c6aU, 0x1ef1U, 0x0f78U };
|
||||||
|
|
||||||
|
const uint16_t CCITT16_TABLE2[] = {
|
||||||
|
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
|
||||||
|
0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
|
||||||
|
0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
|
||||||
|
0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
|
||||||
|
0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
|
||||||
|
0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
|
||||||
|
0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
|
||||||
|
0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
|
||||||
|
0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
|
||||||
|
0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
|
||||||
|
0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
|
||||||
|
0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
|
||||||
|
0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
|
||||||
|
0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
|
||||||
|
0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
|
||||||
|
0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
|
||||||
|
0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
|
||||||
|
0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
|
||||||
|
0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
|
||||||
|
0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
|
||||||
|
0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
|
||||||
|
0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
|
||||||
|
0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
|
||||||
|
0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
|
||||||
|
0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
|
||||||
|
0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
|
||||||
|
0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
|
||||||
|
0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
|
||||||
|
0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
|
||||||
|
0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
|
||||||
|
0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
|
||||||
|
0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0 };
|
||||||
|
|
||||||
|
|
||||||
|
bool CCRC::checkFiveBit(bool* in, unsigned int tcrc)
|
||||||
|
{
|
||||||
|
assert(in != NULL);
|
||||||
|
|
||||||
|
unsigned int crc;
|
||||||
|
encodeFiveBit(in, crc);
|
||||||
|
|
||||||
|
return crc == tcrc;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CCRC::encodeFiveBit(const bool* in, unsigned int& tcrc)
|
||||||
|
{
|
||||||
|
assert(in != NULL);
|
||||||
|
|
||||||
|
unsigned short total = 0U;
|
||||||
|
for (unsigned int i = 0U; i < 72U; i += 8U) {
|
||||||
|
unsigned char c;
|
||||||
|
CUtils::bitsToByteBE(in + i, c);
|
||||||
|
total += c;
|
||||||
|
}
|
||||||
|
|
||||||
|
total %= 31U;
|
||||||
|
|
||||||
|
tcrc = total;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CCRC::addCCITT162(unsigned char *in, unsigned int length)
|
||||||
|
{
|
||||||
|
assert(in != NULL);
|
||||||
|
assert(length > 2U);
|
||||||
|
|
||||||
|
union {
|
||||||
|
uint16_t crc16;
|
||||||
|
uint8_t crc8[2U];
|
||||||
|
};
|
||||||
|
|
||||||
|
crc16 = 0U;
|
||||||
|
|
||||||
|
for (unsigned i = 0U; i < (length - 2U); i++)
|
||||||
|
crc16 = (uint16_t(crc8[0U]) << 8) ^ CCITT16_TABLE2[crc8[1U] ^ in[i]];
|
||||||
|
|
||||||
|
crc16 = ~crc16;
|
||||||
|
|
||||||
|
in[length - 1U] = crc8[0U];
|
||||||
|
in[length - 2U] = crc8[1U];
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CCRC::checkCCITT162(const unsigned char *in, unsigned int length)
|
||||||
|
{
|
||||||
|
assert(in != NULL);
|
||||||
|
assert(length > 2U);
|
||||||
|
|
||||||
|
union {
|
||||||
|
uint16_t crc16;
|
||||||
|
uint8_t crc8[2U];
|
||||||
|
};
|
||||||
|
|
||||||
|
crc16 = 0U;
|
||||||
|
|
||||||
|
for (unsigned i = 0U; i < (length - 2U); i++)
|
||||||
|
crc16 = (uint16_t(crc8[0U]) << 8) ^ CCITT16_TABLE2[crc8[1U] ^ in[i]];
|
||||||
|
|
||||||
|
crc16 = ~crc16;
|
||||||
|
|
||||||
|
return crc8[0U] == in[length - 1U] && crc8[1U] == in[length - 2U];
|
||||||
|
}
|
||||||
|
|
||||||
|
void CCRC::addCCITT161(unsigned char *in, unsigned int length)
|
||||||
|
{
|
||||||
|
assert(in != NULL);
|
||||||
|
assert(length > 2U);
|
||||||
|
|
||||||
|
union {
|
||||||
|
uint16_t crc16;
|
||||||
|
uint8_t crc8[2U];
|
||||||
|
};
|
||||||
|
|
||||||
|
crc16 = 0xFFFFU;
|
||||||
|
|
||||||
|
for (unsigned int i = 0U; i < (length - 2U); i++)
|
||||||
|
crc16 = uint16_t(crc8[1U]) ^ CCITT16_TABLE1[crc8[0U] ^ in[i]];
|
||||||
|
|
||||||
|
crc16 = ~crc16;
|
||||||
|
|
||||||
|
in[length - 2U] = crc8[0U];
|
||||||
|
in[length - 1U] = crc8[1U];
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CCRC::checkCCITT161(const unsigned char *in, unsigned int length)
|
||||||
|
{
|
||||||
|
assert(in != NULL);
|
||||||
|
assert(length > 2U);
|
||||||
|
|
||||||
|
union {
|
||||||
|
uint16_t crc16;
|
||||||
|
uint8_t crc8[2U];
|
||||||
|
};
|
||||||
|
|
||||||
|
crc16 = 0xFFFFU;
|
||||||
|
|
||||||
|
for (unsigned int i = 0U; i < (length - 2U); i++)
|
||||||
|
crc16 = uint16_t(crc8[1U]) ^ CCITT16_TABLE1[crc8[0U] ^ in[i]];
|
||||||
|
|
||||||
|
crc16 = ~crc16;
|
||||||
|
|
||||||
|
return crc8[0U] == in[length - 2U] && crc8[1U] == in[length - 1U];
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char CCRC::crc8(const unsigned char *in, unsigned int length)
|
||||||
|
{
|
||||||
|
assert(in != NULL);
|
||||||
|
|
||||||
|
uint8_t crc = 0U;
|
||||||
|
|
||||||
|
for (unsigned int i = 0U; i < length; i++)
|
||||||
|
crc = CRC8_TABLE[crc ^ in[i]];
|
||||||
|
|
||||||
|
return crc;
|
||||||
|
}
|
37
MMDVMCal/CRC.h
Executable file
|
@ -0,0 +1,37 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2015,2016 by Jonathan Naylor G4KLX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(CRC_H)
|
||||||
|
#define CRC_H
|
||||||
|
|
||||||
|
class CCRC
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static bool checkFiveBit(bool* in, unsigned int tcrc);
|
||||||
|
static void encodeFiveBit(const bool* in, unsigned int& tcrc);
|
||||||
|
|
||||||
|
static void addCCITT161(unsigned char* in, unsigned int length);
|
||||||
|
static void addCCITT162(unsigned char* in, unsigned int length);
|
||||||
|
|
||||||
|
static bool checkCCITT161(const unsigned char* in, unsigned int length);
|
||||||
|
static bool checkCCITT162(const unsigned char* in, unsigned int length);
|
||||||
|
|
||||||
|
static unsigned char crc8(const unsigned char* in, unsigned int length);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
129
MMDVMCal/Console.cpp
Executable file
|
@ -0,0 +1,129 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2015,2016 by Jonathan Naylor G4KLX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "Console.h"
|
||||||
|
|
||||||
|
#include <cstdio>
|
||||||
|
|
||||||
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
|
|
||||||
|
#include <conio.h>
|
||||||
|
|
||||||
|
CConsole::CConsole()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
CConsole::~CConsole()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CConsole::open()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CConsole::getChar()
|
||||||
|
{
|
||||||
|
if (::_kbhit() == 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return ::_getch();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CConsole::close()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
#include <termios.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <sys/select.h>
|
||||||
|
|
||||||
|
CConsole::CConsole() :
|
||||||
|
m_termios()
|
||||||
|
{
|
||||||
|
::memset(&m_termios, 0x00U, sizeof(termios));
|
||||||
|
}
|
||||||
|
|
||||||
|
CConsole::~CConsole()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CConsole::open()
|
||||||
|
{
|
||||||
|
termios tios;
|
||||||
|
|
||||||
|
int n = ::tcgetattr(STDIN_FILENO, &tios);
|
||||||
|
if (n != 0) {
|
||||||
|
::fprintf(stderr, "tcgetattr: returned %d\r\n", n);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
m_termios = tios;
|
||||||
|
|
||||||
|
::cfmakeraw(&tios);
|
||||||
|
|
||||||
|
n = ::tcsetattr(STDIN_FILENO, TCSANOW, &tios);
|
||||||
|
if (n != 0) {
|
||||||
|
::fprintf(stderr, "tcsetattr: returned %d\r\n", n);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CConsole::getChar()
|
||||||
|
{
|
||||||
|
fd_set fds;
|
||||||
|
FD_ZERO(&fds);
|
||||||
|
FD_SET(STDIN_FILENO, &fds);
|
||||||
|
|
||||||
|
timeval tv;
|
||||||
|
tv.tv_sec = 0;
|
||||||
|
tv.tv_usec = 0;
|
||||||
|
|
||||||
|
int n = ::select(STDIN_FILENO + 1, &fds, NULL, NULL, &tv);
|
||||||
|
if (n <= 0) {
|
||||||
|
if (n < 0)
|
||||||
|
::fprintf(stderr, "select: returned %d\r\n", n);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
char c;
|
||||||
|
n = ::read(STDIN_FILENO, &c, 1);
|
||||||
|
if (n <= 0) {
|
||||||
|
if (n < 0)
|
||||||
|
::fprintf(stderr, "read: returned %d\r\n", n);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CConsole::close()
|
||||||
|
{
|
||||||
|
int n = ::tcsetattr(STDIN_FILENO, TCSANOW, &m_termios);
|
||||||
|
if (n != 0)
|
||||||
|
::fprintf(stderr, "tcsetattr: returned %d\r\n", n);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
43
MMDVMCal/Console.h
Executable file
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2015,2016 by Jonathan Naylor G4KLX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(CONSOLE_H)
|
||||||
|
#define CONSOLE_H
|
||||||
|
|
||||||
|
#if !defined(_WIN32) && !defined(_WIN64)
|
||||||
|
#include <termios.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
class CConsole {
|
||||||
|
public:
|
||||||
|
CConsole();
|
||||||
|
~CConsole();
|
||||||
|
|
||||||
|
bool open();
|
||||||
|
|
||||||
|
int getChar();
|
||||||
|
|
||||||
|
void close();
|
||||||
|
|
||||||
|
private:
|
||||||
|
#if !defined(_WIN32) && !defined(_WIN64)
|
||||||
|
termios m_termios;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
1108
MMDVMCal/Golay24128.cpp
Executable file
32
MMDVMCal/Golay24128.h
Executable file
|
@ -0,0 +1,32 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2010,2016 by Jonathan Naylor G4KLX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef Golay24128_H
|
||||||
|
#define Golay24128_H
|
||||||
|
|
||||||
|
class CGolay24128 {
|
||||||
|
public:
|
||||||
|
static unsigned int encode23127(unsigned int data);
|
||||||
|
static unsigned int encode24128(unsigned int data);
|
||||||
|
|
||||||
|
static unsigned int decode23127(unsigned int code);
|
||||||
|
static unsigned int decode24128(unsigned int code);
|
||||||
|
static unsigned int decode24128(unsigned char* bytes);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
349
MMDVMCal/Hamming.cpp
Executable file
|
@ -0,0 +1,349 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2015,2016 by Jonathan Naylor G4KLX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "Hamming.h"
|
||||||
|
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
|
// Hamming (15,11,3) check a boolean data array
|
||||||
|
bool CHamming::decode15113_1(bool* d)
|
||||||
|
{
|
||||||
|
assert(d != NULL);
|
||||||
|
|
||||||
|
// Calculate the parity it should have
|
||||||
|
bool c0 = d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[4] ^ d[5] ^ d[6];
|
||||||
|
bool c1 = d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[7] ^ d[8] ^ d[9];
|
||||||
|
bool c2 = d[0] ^ d[1] ^ d[4] ^ d[5] ^ d[7] ^ d[8] ^ d[10];
|
||||||
|
bool c3 = d[0] ^ d[2] ^ d[4] ^ d[6] ^ d[7] ^ d[9] ^ d[10];
|
||||||
|
|
||||||
|
unsigned char n = 0U;
|
||||||
|
n |= (c0 != d[11]) ? 0x01U : 0x00U;
|
||||||
|
n |= (c1 != d[12]) ? 0x02U : 0x00U;
|
||||||
|
n |= (c2 != d[13]) ? 0x04U : 0x00U;
|
||||||
|
n |= (c3 != d[14]) ? 0x08U : 0x00U;
|
||||||
|
|
||||||
|
switch (n)
|
||||||
|
{
|
||||||
|
// Parity bit errors
|
||||||
|
case 0x01U: d[11] = !d[11]; return true;
|
||||||
|
case 0x02U: d[12] = !d[12]; return true;
|
||||||
|
case 0x04U: d[13] = !d[13]; return true;
|
||||||
|
case 0x08U: d[14] = !d[14]; return true;
|
||||||
|
|
||||||
|
// Data bit errors
|
||||||
|
case 0x0FU: d[0] = !d[0]; return true;
|
||||||
|
case 0x07U: d[1] = !d[1]; return true;
|
||||||
|
case 0x0BU: d[2] = !d[2]; return true;
|
||||||
|
case 0x03U: d[3] = !d[3]; return true;
|
||||||
|
case 0x0DU: d[4] = !d[4]; return true;
|
||||||
|
case 0x05U: d[5] = !d[5]; return true;
|
||||||
|
case 0x09U: d[6] = !d[6]; return true;
|
||||||
|
case 0x0EU: d[7] = !d[7]; return true;
|
||||||
|
case 0x06U: d[8] = !d[8]; return true;
|
||||||
|
case 0x0AU: d[9] = !d[9]; return true;
|
||||||
|
case 0x0CU: d[10] = !d[10]; return true;
|
||||||
|
|
||||||
|
// No bit errors
|
||||||
|
default: return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CHamming::encode15113_1(bool* d)
|
||||||
|
{
|
||||||
|
assert(d != NULL);
|
||||||
|
|
||||||
|
// Calculate the checksum this row should have
|
||||||
|
d[11] = d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[4] ^ d[5] ^ d[6];
|
||||||
|
d[12] = d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[7] ^ d[8] ^ d[9];
|
||||||
|
d[13] = d[0] ^ d[1] ^ d[4] ^ d[5] ^ d[7] ^ d[8] ^ d[10];
|
||||||
|
d[14] = d[0] ^ d[2] ^ d[4] ^ d[6] ^ d[7] ^ d[9] ^ d[10];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hamming (15,11,3) check a boolean data array
|
||||||
|
bool CHamming::decode15113_2(bool* d)
|
||||||
|
{
|
||||||
|
assert(d != NULL);
|
||||||
|
|
||||||
|
// Calculate the checksum this row should have
|
||||||
|
bool c0 = d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[5] ^ d[7] ^ d[8];
|
||||||
|
bool c1 = d[1] ^ d[2] ^ d[3] ^ d[4] ^ d[6] ^ d[8] ^ d[9];
|
||||||
|
bool c2 = d[2] ^ d[3] ^ d[4] ^ d[5] ^ d[7] ^ d[9] ^ d[10];
|
||||||
|
bool c3 = d[0] ^ d[1] ^ d[2] ^ d[4] ^ d[6] ^ d[7] ^ d[10];
|
||||||
|
|
||||||
|
unsigned char n = 0x00U;
|
||||||
|
n |= (c0 != d[11]) ? 0x01U : 0x00U;
|
||||||
|
n |= (c1 != d[12]) ? 0x02U : 0x00U;
|
||||||
|
n |= (c2 != d[13]) ? 0x04U : 0x00U;
|
||||||
|
n |= (c3 != d[14]) ? 0x08U : 0x00U;
|
||||||
|
|
||||||
|
switch (n) {
|
||||||
|
// Parity bit errors
|
||||||
|
case 0x01U: d[11] = !d[11]; return true;
|
||||||
|
case 0x02U: d[12] = !d[12]; return true;
|
||||||
|
case 0x04U: d[13] = !d[13]; return true;
|
||||||
|
case 0x08U: d[14] = !d[14]; return true;
|
||||||
|
|
||||||
|
// Data bit errors
|
||||||
|
case 0x09U: d[0] = !d[0]; return true;
|
||||||
|
case 0x0BU: d[1] = !d[1]; return true;
|
||||||
|
case 0x0FU: d[2] = !d[2]; return true;
|
||||||
|
case 0x07U: d[3] = !d[3]; return true;
|
||||||
|
case 0x0EU: d[4] = !d[4]; return true;
|
||||||
|
case 0x05U: d[5] = !d[5]; return true;
|
||||||
|
case 0x0AU: d[6] = !d[6]; return true;
|
||||||
|
case 0x0DU: d[7] = !d[7]; return true;
|
||||||
|
case 0x03U: d[8] = !d[8]; return true;
|
||||||
|
case 0x06U: d[9] = !d[9]; return true;
|
||||||
|
case 0x0CU: d[10] = !d[10]; return true;
|
||||||
|
|
||||||
|
// No bit errors
|
||||||
|
default: return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CHamming::encode15113_2(bool* d)
|
||||||
|
{
|
||||||
|
assert(d != NULL);
|
||||||
|
|
||||||
|
// Calculate the checksum this row should have
|
||||||
|
d[11] = d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[5] ^ d[7] ^ d[8];
|
||||||
|
d[12] = d[1] ^ d[2] ^ d[3] ^ d[4] ^ d[6] ^ d[8] ^ d[9];
|
||||||
|
d[13] = d[2] ^ d[3] ^ d[4] ^ d[5] ^ d[7] ^ d[9] ^ d[10];
|
||||||
|
d[14] = d[0] ^ d[1] ^ d[2] ^ d[4] ^ d[6] ^ d[7] ^ d[10];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hamming (13,9,3) check a boolean data array
|
||||||
|
bool CHamming::decode1393(bool* d)
|
||||||
|
{
|
||||||
|
assert(d != NULL);
|
||||||
|
|
||||||
|
// Calculate the checksum this column should have
|
||||||
|
bool c0 = d[0] ^ d[1] ^ d[3] ^ d[5] ^ d[6];
|
||||||
|
bool c1 = d[0] ^ d[1] ^ d[2] ^ d[4] ^ d[6] ^ d[7];
|
||||||
|
bool c2 = d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[5] ^ d[7] ^ d[8];
|
||||||
|
bool c3 = d[0] ^ d[2] ^ d[4] ^ d[5] ^ d[8];
|
||||||
|
|
||||||
|
unsigned char n = 0x00U;
|
||||||
|
n |= (c0 != d[9]) ? 0x01U : 0x00U;
|
||||||
|
n |= (c1 != d[10]) ? 0x02U : 0x00U;
|
||||||
|
n |= (c2 != d[11]) ? 0x04U : 0x00U;
|
||||||
|
n |= (c3 != d[12]) ? 0x08U : 0x00U;
|
||||||
|
|
||||||
|
switch (n) {
|
||||||
|
// Parity bit errors
|
||||||
|
case 0x01U: d[9] = !d[9]; return true;
|
||||||
|
case 0x02U: d[10] = !d[10]; return true;
|
||||||
|
case 0x04U: d[11] = !d[11]; return true;
|
||||||
|
case 0x08U: d[12] = !d[12]; return true;
|
||||||
|
|
||||||
|
// Data bit erros
|
||||||
|
case 0x0FU: d[0] = !d[0]; return true;
|
||||||
|
case 0x07U: d[1] = !d[1]; return true;
|
||||||
|
case 0x0EU: d[2] = !d[2]; return true;
|
||||||
|
case 0x05U: d[3] = !d[3]; return true;
|
||||||
|
case 0x0AU: d[4] = !d[4]; return true;
|
||||||
|
case 0x0DU: d[5] = !d[5]; return true;
|
||||||
|
case 0x03U: d[6] = !d[6]; return true;
|
||||||
|
case 0x06U: d[7] = !d[7]; return true;
|
||||||
|
case 0x0CU: d[8] = !d[8]; return true;
|
||||||
|
|
||||||
|
// No bit errors
|
||||||
|
default: return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CHamming::encode1393(bool* d)
|
||||||
|
{
|
||||||
|
assert(d != NULL);
|
||||||
|
|
||||||
|
// Calculate the checksum this column should have
|
||||||
|
d[9] = d[0] ^ d[1] ^ d[3] ^ d[5] ^ d[6];
|
||||||
|
d[10] = d[0] ^ d[1] ^ d[2] ^ d[4] ^ d[6] ^ d[7];
|
||||||
|
d[11] = d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[5] ^ d[7] ^ d[8];
|
||||||
|
d[12] = d[0] ^ d[2] ^ d[4] ^ d[5] ^ d[8];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hamming (10,6,3) check a boolean data array
|
||||||
|
bool CHamming::decode1063(bool* d)
|
||||||
|
{
|
||||||
|
assert(d != NULL);
|
||||||
|
|
||||||
|
// Calculate the checksum this column should have
|
||||||
|
bool c0 = d[0] ^ d[1] ^ d[2] ^ d[5];
|
||||||
|
bool c1 = d[0] ^ d[1] ^ d[3] ^ d[5];
|
||||||
|
bool c2 = d[0] ^ d[2] ^ d[3] ^ d[4];
|
||||||
|
bool c3 = d[1] ^ d[2] ^ d[3] ^ d[4];
|
||||||
|
|
||||||
|
unsigned char n = 0x00U;
|
||||||
|
n |= (c0 != d[6]) ? 0x01U : 0x00U;
|
||||||
|
n |= (c1 != d[7]) ? 0x02U : 0x00U;
|
||||||
|
n |= (c2 != d[8]) ? 0x04U : 0x00U;
|
||||||
|
n |= (c3 != d[9]) ? 0x08U : 0x00U;
|
||||||
|
|
||||||
|
switch (n) {
|
||||||
|
// Parity bit errors
|
||||||
|
case 0x01U: d[6] = !d[6]; return true;
|
||||||
|
case 0x02U: d[7] = !d[7]; return true;
|
||||||
|
case 0x04U: d[8] = !d[8]; return true;
|
||||||
|
case 0x08U: d[9] = !d[9]; return true;
|
||||||
|
|
||||||
|
// Data bit erros
|
||||||
|
case 0x07U: d[0] = !d[0]; return true;
|
||||||
|
case 0x0BU: d[1] = !d[1]; return true;
|
||||||
|
case 0x0DU: d[2] = !d[2]; return true;
|
||||||
|
case 0x0EU: d[3] = !d[3]; return true;
|
||||||
|
case 0x0CU: d[4] = !d[4]; return true;
|
||||||
|
case 0x03U: d[5] = !d[5]; return true;
|
||||||
|
|
||||||
|
// No bit errors
|
||||||
|
default: return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CHamming::encode1063(bool* d)
|
||||||
|
{
|
||||||
|
assert(d != NULL);
|
||||||
|
|
||||||
|
// Calculate the checksum this column should have
|
||||||
|
d[6] = d[0] ^ d[1] ^ d[2] ^ d[5];
|
||||||
|
d[7] = d[0] ^ d[1] ^ d[3] ^ d[5];
|
||||||
|
d[8] = d[0] ^ d[2] ^ d[3] ^ d[4];
|
||||||
|
d[9] = d[1] ^ d[2] ^ d[3] ^ d[4];
|
||||||
|
}
|
||||||
|
|
||||||
|
// A Hamming (16,11,4) Check
|
||||||
|
bool CHamming::decode16114(bool* d)
|
||||||
|
{
|
||||||
|
assert(d != NULL);
|
||||||
|
|
||||||
|
// Calculate the checksum this column should have
|
||||||
|
bool c0 = d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[5] ^ d[7] ^ d[8];
|
||||||
|
bool c1 = d[1] ^ d[2] ^ d[3] ^ d[4] ^ d[6] ^ d[8] ^ d[9];
|
||||||
|
bool c2 = d[2] ^ d[3] ^ d[4] ^ d[5] ^ d[7] ^ d[9] ^ d[10];
|
||||||
|
bool c3 = d[0] ^ d[1] ^ d[2] ^ d[4] ^ d[6] ^ d[7] ^ d[10];
|
||||||
|
bool c4 = d[0] ^ d[2] ^ d[5] ^ d[6] ^ d[8] ^ d[9] ^ d[10];
|
||||||
|
|
||||||
|
// Compare these with the actual bits
|
||||||
|
unsigned char n = 0x00U;
|
||||||
|
n |= (c0 != d[11]) ? 0x01U : 0x00U;
|
||||||
|
n |= (c1 != d[12]) ? 0x02U : 0x00U;
|
||||||
|
n |= (c2 != d[13]) ? 0x04U : 0x00U;
|
||||||
|
n |= (c3 != d[14]) ? 0x08U : 0x00U;
|
||||||
|
n |= (c4 != d[15]) ? 0x10U : 0x00U;
|
||||||
|
|
||||||
|
switch (n) {
|
||||||
|
// Parity bit errors
|
||||||
|
case 0x01U: d[11] = !d[11]; return true;
|
||||||
|
case 0x02U: d[12] = !d[12]; return true;
|
||||||
|
case 0x04U: d[13] = !d[13]; return true;
|
||||||
|
case 0x08U: d[14] = !d[14]; return true;
|
||||||
|
case 0x10U: d[15] = !d[15]; return true;
|
||||||
|
|
||||||
|
// Data bit errors
|
||||||
|
case 0x19U: d[0] = !d[0]; return true;
|
||||||
|
case 0x0BU: d[1] = !d[1]; return true;
|
||||||
|
case 0x1FU: d[2] = !d[2]; return true;
|
||||||
|
case 0x07U: d[3] = !d[3]; return true;
|
||||||
|
case 0x0EU: d[4] = !d[4]; return true;
|
||||||
|
case 0x15U: d[5] = !d[5]; return true;
|
||||||
|
case 0x1AU: d[6] = !d[6]; return true;
|
||||||
|
case 0x0DU: d[7] = !d[7]; return true;
|
||||||
|
case 0x13U: d[8] = !d[8]; return true;
|
||||||
|
case 0x16U: d[9] = !d[9]; return true;
|
||||||
|
case 0x1CU: d[10] = !d[10]; return true;
|
||||||
|
|
||||||
|
// No bit errors
|
||||||
|
case 0x00U: return true;
|
||||||
|
|
||||||
|
// Unrecoverable errors
|
||||||
|
default: return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CHamming::encode16114(bool* d)
|
||||||
|
{
|
||||||
|
assert(d != NULL);
|
||||||
|
|
||||||
|
d[11] = d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[5] ^ d[7] ^ d[8];
|
||||||
|
d[12] = d[1] ^ d[2] ^ d[3] ^ d[4] ^ d[6] ^ d[8] ^ d[9];
|
||||||
|
d[13] = d[2] ^ d[3] ^ d[4] ^ d[5] ^ d[7] ^ d[9] ^ d[10];
|
||||||
|
d[14] = d[0] ^ d[1] ^ d[2] ^ d[4] ^ d[6] ^ d[7] ^ d[10];
|
||||||
|
d[15] = d[0] ^ d[2] ^ d[5] ^ d[6] ^ d[8] ^ d[9] ^ d[10];
|
||||||
|
}
|
||||||
|
|
||||||
|
// A Hamming (17,12,3) Check
|
||||||
|
bool CHamming::decode17123(bool* d)
|
||||||
|
{
|
||||||
|
assert(d != NULL);
|
||||||
|
|
||||||
|
// Calculate the checksum this column should have
|
||||||
|
bool c0 = d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[6] ^ d[7] ^ d[9];
|
||||||
|
bool c1 = d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[4] ^ d[7] ^ d[8] ^ d[10];
|
||||||
|
bool c2 = d[1] ^ d[2] ^ d[3] ^ d[4] ^ d[5] ^ d[8] ^ d[9] ^ d[11];
|
||||||
|
bool c3 = d[0] ^ d[1] ^ d[4] ^ d[5] ^ d[7] ^ d[10];
|
||||||
|
bool c4 = d[0] ^ d[1] ^ d[2] ^ d[5] ^ d[6] ^ d[8] ^ d[11];
|
||||||
|
|
||||||
|
// Compare these with the actual bits
|
||||||
|
unsigned char n = 0x00U;
|
||||||
|
n |= (c0 != d[12]) ? 0x01U : 0x00U;
|
||||||
|
n |= (c1 != d[13]) ? 0x02U : 0x00U;
|
||||||
|
n |= (c2 != d[14]) ? 0x04U : 0x00U;
|
||||||
|
n |= (c3 != d[15]) ? 0x08U : 0x00U;
|
||||||
|
n |= (c4 != d[16]) ? 0x10U : 0x00U;
|
||||||
|
|
||||||
|
switch (n) {
|
||||||
|
// Parity bit errors
|
||||||
|
case 0x01U: d[12] = !d[12]; return true;
|
||||||
|
case 0x02U: d[13] = !d[13]; return true;
|
||||||
|
case 0x04U: d[14] = !d[14]; return true;
|
||||||
|
case 0x08U: d[15] = !d[15]; return true;
|
||||||
|
case 0x10U: d[16] = !d[16]; return true;
|
||||||
|
|
||||||
|
// Data bit errors
|
||||||
|
case 0x1BU: d[0] = !d[0]; return true;
|
||||||
|
case 0x1FU: d[1] = !d[1]; return true;
|
||||||
|
case 0x17U: d[2] = !d[2]; return true;
|
||||||
|
case 0x07U: d[3] = !d[3]; return true;
|
||||||
|
case 0x0EU: d[4] = !d[4]; return true;
|
||||||
|
case 0x1CU: d[5] = !d[5]; return true;
|
||||||
|
case 0x11U: d[6] = !d[6]; return true;
|
||||||
|
case 0x0BU: d[7] = !d[7]; return true;
|
||||||
|
case 0x16U: d[8] = !d[8]; return true;
|
||||||
|
case 0x05U: d[9] = !d[9]; return true;
|
||||||
|
case 0x0AU: d[10] = !d[10]; return true;
|
||||||
|
case 0x14U: d[11] = !d[11]; return true;
|
||||||
|
|
||||||
|
// No bit errors
|
||||||
|
case 0x00U: return true;
|
||||||
|
|
||||||
|
// Unrecoverable errors
|
||||||
|
default: return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CHamming::encode17123(bool* d)
|
||||||
|
{
|
||||||
|
assert(d != NULL);
|
||||||
|
|
||||||
|
d[12] = d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[6] ^ d[7] ^ d[9];
|
||||||
|
d[13] = d[0] ^ d[1] ^ d[2] ^ d[3] ^ d[4] ^ d[7] ^ d[8] ^ d[10];
|
||||||
|
d[14] = d[1] ^ d[2] ^ d[3] ^ d[4] ^ d[5] ^ d[8] ^ d[9] ^ d[11];
|
||||||
|
d[15] = d[0] ^ d[1] ^ d[4] ^ d[5] ^ d[7] ^ d[10];
|
||||||
|
d[16] = d[0] ^ d[1] ^ d[2] ^ d[5] ^ d[6] ^ d[8] ^ d[11];
|
||||||
|
}
|
43
MMDVMCal/Hamming.h
Executable file
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2015,2016 by Jonathan Naylor G4KLX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef Hamming_H
|
||||||
|
#define Hamming_H
|
||||||
|
|
||||||
|
class CHamming {
|
||||||
|
public:
|
||||||
|
static void encode15113_1(bool* d);
|
||||||
|
static bool decode15113_1(bool* d);
|
||||||
|
|
||||||
|
static void encode15113_2(bool* d);
|
||||||
|
static bool decode15113_2(bool* d);
|
||||||
|
|
||||||
|
static void encode1393(bool* d);
|
||||||
|
static bool decode1393(bool* d);
|
||||||
|
|
||||||
|
static void encode1063(bool* d);
|
||||||
|
static bool decode1063(bool* d);
|
||||||
|
|
||||||
|
static void encode16114(bool* d);
|
||||||
|
static bool decode16114(bool* d);
|
||||||
|
|
||||||
|
static void encode17123(bool* d);
|
||||||
|
static bool decode17123(bool* d);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
340
MMDVMCal/LICENCE
Executable file
|
@ -0,0 +1,340 @@
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
Version 2, June 1991
|
||||||
|
|
||||||
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||||
|
51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The licenses for most software are designed to take away your
|
||||||
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
|
License is intended to guarantee your freedom to share and change free
|
||||||
|
software--to make sure the software is free for all its users. This
|
||||||
|
General Public License applies to most of the Free Software
|
||||||
|
Foundation's software and to any other program whose authors commit to
|
||||||
|
using it. (Some other Free Software Foundation software is covered by
|
||||||
|
the GNU Library General Public License instead.) You can apply it to
|
||||||
|
your programs, too.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
this service if you wish), that you receive source code or can get it
|
||||||
|
if you want it, that you can change the software or use pieces of it
|
||||||
|
in new free programs; and that you know you can do these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to make restrictions that forbid
|
||||||
|
anyone to deny you these rights or to ask you to surrender the rights.
|
||||||
|
These restrictions translate to certain responsibilities for you if you
|
||||||
|
distribute copies of the software, or if you modify it.
|
||||||
|
|
||||||
|
For example, if you distribute copies of such a program, whether
|
||||||
|
gratis or for a fee, you must give the recipients all the rights that
|
||||||
|
you have. You must make sure that they, too, receive or can get the
|
||||||
|
source code. And you must show them these terms so they know their
|
||||||
|
rights.
|
||||||
|
|
||||||
|
We protect your rights with two steps: (1) copyright the software, and
|
||||||
|
(2) offer you this license which gives you legal permission to copy,
|
||||||
|
distribute and/or modify the software.
|
||||||
|
|
||||||
|
Also, for each author's protection and ours, we want to make certain
|
||||||
|
that everyone understands that there is no warranty for this free
|
||||||
|
software. If the software is modified by someone else and passed on, we
|
||||||
|
want its recipients to know that what they have is not the original, so
|
||||||
|
that any problems introduced by others will not reflect on the original
|
||||||
|
authors' reputations.
|
||||||
|
|
||||||
|
Finally, any free program is threatened constantly by software
|
||||||
|
patents. We wish to avoid the danger that redistributors of a free
|
||||||
|
program will individually obtain patent licenses, in effect making the
|
||||||
|
program proprietary. To prevent this, we have made it clear that any
|
||||||
|
patent must be licensed for everyone's free use or not licensed at all.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
GNU GENERAL PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. This License applies to any program or other work which contains
|
||||||
|
a notice placed by the copyright holder saying it may be distributed
|
||||||
|
under the terms of this General Public License. The "Program", below,
|
||||||
|
refers to any such program or work, and a "work based on the Program"
|
||||||
|
means either the Program or any derivative work under copyright law:
|
||||||
|
that is to say, a work containing the Program or a portion of it,
|
||||||
|
either verbatim or with modifications and/or translated into another
|
||||||
|
language. (Hereinafter, translation is included without limitation in
|
||||||
|
the term "modification".) Each licensee is addressed as "you".
|
||||||
|
|
||||||
|
Activities other than copying, distribution and modification are not
|
||||||
|
covered by this License; they are outside its scope. The act of
|
||||||
|
running the Program is not restricted, and the output from the Program
|
||||||
|
is covered only if its contents constitute a work based on the
|
||||||
|
Program (independent of having been made by running the Program).
|
||||||
|
Whether that is true depends on what the Program does.
|
||||||
|
|
||||||
|
1. You may copy and distribute verbatim copies of the Program's
|
||||||
|
source code as you receive it, in any medium, provided that you
|
||||||
|
conspicuously and appropriately publish on each copy an appropriate
|
||||||
|
copyright notice and disclaimer of warranty; keep intact all the
|
||||||
|
notices that refer to this License and to the absence of any warranty;
|
||||||
|
and give any other recipients of the Program a copy of this License
|
||||||
|
along with the Program.
|
||||||
|
|
||||||
|
You may charge a fee for the physical act of transferring a copy, and
|
||||||
|
you may at your option offer warranty protection in exchange for a fee.
|
||||||
|
|
||||||
|
2. You may modify your copy or copies of the Program or any portion
|
||||||
|
of it, thus forming a work based on the Program, and copy and
|
||||||
|
distribute such modifications or work under the terms of Section 1
|
||||||
|
above, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) You must cause the modified files to carry prominent notices
|
||||||
|
stating that you changed the files and the date of any change.
|
||||||
|
|
||||||
|
b) You must cause any work that you distribute or publish, that in
|
||||||
|
whole or in part contains or is derived from the Program or any
|
||||||
|
part thereof, to be licensed as a whole at no charge to all third
|
||||||
|
parties under the terms of this License.
|
||||||
|
|
||||||
|
c) If the modified program normally reads commands interactively
|
||||||
|
when run, you must cause it, when started running for such
|
||||||
|
interactive use in the most ordinary way, to print or display an
|
||||||
|
announcement including an appropriate copyright notice and a
|
||||||
|
notice that there is no warranty (or else, saying that you provide
|
||||||
|
a warranty) and that users may redistribute the program under
|
||||||
|
these conditions, and telling the user how to view a copy of this
|
||||||
|
License. (Exception: if the Program itself is interactive but
|
||||||
|
does not normally print such an announcement, your work based on
|
||||||
|
the Program is not required to print an announcement.)
|
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If
|
||||||
|
identifiable sections of that work are not derived from the Program,
|
||||||
|
and can be reasonably considered independent and separate works in
|
||||||
|
themselves, then this License, and its terms, do not apply to those
|
||||||
|
sections when you distribute them as separate works. But when you
|
||||||
|
distribute the same sections as part of a whole which is a work based
|
||||||
|
on the Program, the distribution of the whole must be on the terms of
|
||||||
|
this License, whose permissions for other licensees extend to the
|
||||||
|
entire whole, and thus to each and every part regardless of who wrote it.
|
||||||
|
|
||||||
|
Thus, it is not the intent of this section to claim rights or contest
|
||||||
|
your rights to work written entirely by you; rather, the intent is to
|
||||||
|
exercise the right to control the distribution of derivative or
|
||||||
|
collective works based on the Program.
|
||||||
|
|
||||||
|
In addition, mere aggregation of another work not based on the Program
|
||||||
|
with the Program (or with a work based on the Program) on a volume of
|
||||||
|
a storage or distribution medium does not bring the other work under
|
||||||
|
the scope of this License.
|
||||||
|
|
||||||
|
3. You may copy and distribute the Program (or a work based on it,
|
||||||
|
under Section 2) in object code or executable form under the terms of
|
||||||
|
Sections 1 and 2 above provided that you also do one of the following:
|
||||||
|
|
||||||
|
a) Accompany it with the complete corresponding machine-readable
|
||||||
|
source code, which must be distributed under the terms of Sections
|
||||||
|
1 and 2 above on a medium customarily used for software interchange; or,
|
||||||
|
|
||||||
|
b) Accompany it with a written offer, valid for at least three
|
||||||
|
years, to give any third party, for a charge no more than your
|
||||||
|
cost of physically performing source distribution, a complete
|
||||||
|
machine-readable copy of the corresponding source code, to be
|
||||||
|
distributed under the terms of Sections 1 and 2 above on a medium
|
||||||
|
customarily used for software interchange; or,
|
||||||
|
|
||||||
|
c) Accompany it with the information you received as to the offer
|
||||||
|
to distribute corresponding source code. (This alternative is
|
||||||
|
allowed only for noncommercial distribution and only if you
|
||||||
|
received the program in object code or executable form with such
|
||||||
|
an offer, in accord with Subsection b above.)
|
||||||
|
|
||||||
|
The source code for a work means the preferred form of the work for
|
||||||
|
making modifications to it. For an executable work, complete source
|
||||||
|
code means all the source code for all modules it contains, plus any
|
||||||
|
associated interface definition files, plus the scripts used to
|
||||||
|
control compilation and installation of the executable. However, as a
|
||||||
|
special exception, the source code distributed need not include
|
||||||
|
anything that is normally distributed (in either source or binary
|
||||||
|
form) with the major components (compiler, kernel, and so on) of the
|
||||||
|
operating system on which the executable runs, unless that component
|
||||||
|
itself accompanies the executable.
|
||||||
|
|
||||||
|
If distribution of executable or object code is made by offering
|
||||||
|
access to copy from a designated place, then offering equivalent
|
||||||
|
access to copy the source code from the same place counts as
|
||||||
|
distribution of the source code, even though third parties are not
|
||||||
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
|
4. You may not copy, modify, sublicense, or distribute the Program
|
||||||
|
except as expressly provided under this License. Any attempt
|
||||||
|
otherwise to copy, modify, sublicense or distribute the Program is
|
||||||
|
void, and will automatically terminate your rights under this License.
|
||||||
|
However, parties who have received copies, or rights, from you under
|
||||||
|
this License will not have their licenses terminated so long as such
|
||||||
|
parties remain in full compliance.
|
||||||
|
|
||||||
|
5. You are not required to accept this License, since you have not
|
||||||
|
signed it. However, nothing else grants you permission to modify or
|
||||||
|
distribute the Program or its derivative works. These actions are
|
||||||
|
prohibited by law if you do not accept this License. Therefore, by
|
||||||
|
modifying or distributing the Program (or any work based on the
|
||||||
|
Program), you indicate your acceptance of this License to do so, and
|
||||||
|
all its terms and conditions for copying, distributing or modifying
|
||||||
|
the Program or works based on it.
|
||||||
|
|
||||||
|
6. Each time you redistribute the Program (or any work based on the
|
||||||
|
Program), the recipient automatically receives a license from the
|
||||||
|
original licensor to copy, distribute or modify the Program subject to
|
||||||
|
these terms and conditions. You may not impose any further
|
||||||
|
restrictions on the recipients' exercise of the rights granted herein.
|
||||||
|
You are not responsible for enforcing compliance by third parties to
|
||||||
|
this License.
|
||||||
|
|
||||||
|
7. If, as a consequence of a court judgment or allegation of patent
|
||||||
|
infringement or for any other reason (not limited to patent issues),
|
||||||
|
conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot
|
||||||
|
distribute so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you
|
||||||
|
may not distribute the Program at all. For example, if a patent
|
||||||
|
license would not permit royalty-free redistribution of the Program by
|
||||||
|
all those who receive copies directly or indirectly through you, then
|
||||||
|
the only way you could satisfy both it and this License would be to
|
||||||
|
refrain entirely from distribution of the Program.
|
||||||
|
|
||||||
|
If any portion of this section is held invalid or unenforceable under
|
||||||
|
any particular circumstance, the balance of the section is intended to
|
||||||
|
apply and the section as a whole is intended to apply in other
|
||||||
|
circumstances.
|
||||||
|
|
||||||
|
It is not the purpose of this section to induce you to infringe any
|
||||||
|
patents or other property right claims or to contest validity of any
|
||||||
|
such claims; this section has the sole purpose of protecting the
|
||||||
|
integrity of the free software distribution system, which is
|
||||||
|
implemented by public license practices. Many people have made
|
||||||
|
generous contributions to the wide range of software distributed
|
||||||
|
through that system in reliance on consistent application of that
|
||||||
|
system; it is up to the author/donor to decide if he or she is willing
|
||||||
|
to distribute software through any other system and a licensee cannot
|
||||||
|
impose that choice.
|
||||||
|
|
||||||
|
This section is intended to make thoroughly clear what is believed to
|
||||||
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
|
8. If the distribution and/or use of the Program is restricted in
|
||||||
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
|
original copyright holder who places the Program under this License
|
||||||
|
may add an explicit geographical distribution limitation excluding
|
||||||
|
those countries, so that distribution is permitted only in or among
|
||||||
|
countries not thus excluded. In such case, this License incorporates
|
||||||
|
the limitation as if written in the body of this License.
|
||||||
|
|
||||||
|
9. The Free Software Foundation may publish revised and/or new versions
|
||||||
|
of the General Public License from time to time. Such new versions will
|
||||||
|
be similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the Program
|
||||||
|
specifies a version number of this License which applies to it and "any
|
||||||
|
later version", you have the option of following the terms and conditions
|
||||||
|
either of that version or of any later version published by the Free
|
||||||
|
Software Foundation. If the Program does not specify a version number of
|
||||||
|
this License, you may choose any version ever published by the Free Software
|
||||||
|
Foundation.
|
||||||
|
|
||||||
|
10. If you wish to incorporate parts of the Program into other free
|
||||||
|
programs whose distribution conditions are different, write to the author
|
||||||
|
to ask for permission. For software which is copyrighted by the Free
|
||||||
|
Software Foundation, write to the Free Software Foundation; we sometimes
|
||||||
|
make exceptions for this. Our decision will be guided by the two goals
|
||||||
|
of preserving the free status of all derivatives of our free software and
|
||||||
|
of promoting the sharing and reuse of software generally.
|
||||||
|
|
||||||
|
NO WARRANTY
|
||||||
|
|
||||||
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||||
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||||
|
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||||
|
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
|
||||||
|
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||||
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
|
||||||
|
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
|
||||||
|
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
|
||||||
|
REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||||
|
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
|
||||||
|
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
|
||||||
|
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
|
||||||
|
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
|
||||||
|
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
||||||
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||||
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. It is safest
|
||||||
|
to attach them to the start of each source file to most effectively
|
||||||
|
convey the exclusion of warranty; and each file should have at least
|
||||||
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If the program is interactive, make it output a short notice like this
|
||||||
|
when it starts in an interactive mode:
|
||||||
|
|
||||||
|
Gnomovision version 69, Copyright (C) year name of author
|
||||||
|
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
|
This is free software, and you are welcome to redistribute it
|
||||||
|
under certain conditions; type `show c' for details.
|
||||||
|
|
||||||
|
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||||
|
parts of the General Public License. Of course, the commands you use may
|
||||||
|
be called something other than `show w' and `show c'; they could even be
|
||||||
|
mouse-clicks or menu items--whatever suits your program.
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or your
|
||||||
|
school, if any, to sign a "copyright disclaimer" for the program, if
|
||||||
|
necessary. Here is a sample; alter the names:
|
||||||
|
|
||||||
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||||
|
`Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||||
|
|
||||||
|
<signature of Ty Coon>, 1 April 1989
|
||||||
|
Ty Coon, President of Vice
|
||||||
|
|
||||||
|
This General Public License does not permit incorporating your program into
|
||||||
|
proprietary programs. If your program is a subroutine library, you may
|
||||||
|
consider it more useful to permit linking proprietary applications with the
|
||||||
|
library. If this is what you want to do, use the GNU Library General
|
||||||
|
Public License instead of this License.
|
1472
MMDVMCal/MMDVMCal.cpp
Executable file
154
MMDVMCal/MMDVMCal.h
Executable file
|
@ -0,0 +1,154 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2015,2016,2017,2020 by Jonathan Naylor G4KLX
|
||||||
|
* Copyright (C) 2017,2018 by Andy Uribe CA6JAU
|
||||||
|
* Copyright (C) 2018 by Bryan Biedenkapp N2PLL
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(MMDVMCAL_H)
|
||||||
|
#define MMDVMCAL_H
|
||||||
|
|
||||||
|
#include "SerialController.h"
|
||||||
|
#include "Console.h"
|
||||||
|
#include "BERCal.h"
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
#include <cstdlib>
|
||||||
|
|
||||||
|
enum RESP_TYPE_MMDVM {
|
||||||
|
RTM_OK,
|
||||||
|
RTM_TIMEOUT,
|
||||||
|
RTM_ERROR
|
||||||
|
};
|
||||||
|
|
||||||
|
enum HW_TYPE {
|
||||||
|
HWT_MMDVM,
|
||||||
|
HWT_MMDVM_HS
|
||||||
|
};
|
||||||
|
|
||||||
|
enum MMDVM_STATE {
|
||||||
|
STATE_IDLE = 0,
|
||||||
|
STATE_DSTAR = 1,
|
||||||
|
STATE_DMR = 2,
|
||||||
|
STATE_YSF = 3,
|
||||||
|
STATE_P25 = 4,
|
||||||
|
STATE_NXDN = 5,
|
||||||
|
STATE_POCSAG = 6,
|
||||||
|
STATE_NXDNCAL1K = 91,
|
||||||
|
STATE_DMRDMO1K = 92,
|
||||||
|
STATE_P25CAL1K = 93,
|
||||||
|
STATE_DMRCAL1K = 94,
|
||||||
|
STATE_LFCAL = 95,
|
||||||
|
STATE_RSSICAL = 96,
|
||||||
|
STATE_DMRCAL = 98,
|
||||||
|
STATE_DSTARCAL = 99,
|
||||||
|
STATE_INTCAL = 100,
|
||||||
|
STATE_POCSAGCAL = 101,
|
||||||
|
STATE_FMCAL10K = 102,
|
||||||
|
STATE_FMCAL12K = 103,
|
||||||
|
STATE_FMCAL15K = 104,
|
||||||
|
STATE_FMCAL20K = 105,
|
||||||
|
STATE_FMCAL25K = 106,
|
||||||
|
STATE_FMCAL30K = 107
|
||||||
|
};
|
||||||
|
|
||||||
|
class CMMDVMCal {
|
||||||
|
public:
|
||||||
|
CMMDVMCal(const std::string& port);
|
||||||
|
~CMMDVMCal();
|
||||||
|
|
||||||
|
int run();
|
||||||
|
|
||||||
|
private:
|
||||||
|
CSerialController m_serial;
|
||||||
|
CConsole m_console;
|
||||||
|
CBERCal m_ber;
|
||||||
|
bool m_transmit;
|
||||||
|
bool m_carrier;
|
||||||
|
float m_txLevel;
|
||||||
|
float m_rxLevel;
|
||||||
|
int m_txDCOffset;
|
||||||
|
int m_rxDCOffset;
|
||||||
|
bool m_txInvert;
|
||||||
|
bool m_rxInvert;
|
||||||
|
bool m_pttInvert;
|
||||||
|
unsigned int m_frequency;
|
||||||
|
unsigned int m_startfrequency;
|
||||||
|
unsigned int m_step;
|
||||||
|
float m_power;
|
||||||
|
MMDVM_STATE m_mode;
|
||||||
|
bool m_duplex;
|
||||||
|
bool m_debug;
|
||||||
|
unsigned char* m_buffer;
|
||||||
|
unsigned int m_length;
|
||||||
|
unsigned int m_offset;
|
||||||
|
HW_TYPE m_hwType;
|
||||||
|
bool m_dstarEnabled;
|
||||||
|
bool m_dmrEnabled;
|
||||||
|
bool m_dmrBERFEC;
|
||||||
|
bool m_ysfEnabled;
|
||||||
|
bool m_p25Enabled;
|
||||||
|
bool m_nxdnEnabled;
|
||||||
|
bool m_pocsagEnabled;
|
||||||
|
bool m_fmEnabled;
|
||||||
|
|
||||||
|
void displayHelp_MMDVM();
|
||||||
|
void displayHelp_MMDVM_HS();
|
||||||
|
void loop_MMDVM();
|
||||||
|
void loop_MMDVM_HS();
|
||||||
|
bool setTransmit();
|
||||||
|
bool setTXLevel(int incr);
|
||||||
|
bool setRXLevel(int incr);
|
||||||
|
bool setTXDCOffset(int incr);
|
||||||
|
bool setRXDCOffset(int incr);
|
||||||
|
bool setTXInvert();
|
||||||
|
bool setRXInvert();
|
||||||
|
bool setPTTInvert();
|
||||||
|
bool setDebug();
|
||||||
|
bool setFreq(int incr);
|
||||||
|
bool setStepFreq();
|
||||||
|
bool setPower(int incr);
|
||||||
|
bool setCarrier();
|
||||||
|
bool setEnterFreq();
|
||||||
|
bool setFMDeviation();
|
||||||
|
bool setDMRDeviation();
|
||||||
|
bool setLowFrequencyCal();
|
||||||
|
bool setDMRCal1K();
|
||||||
|
bool setDMRDMO1K();
|
||||||
|
bool setP25Cal1K();
|
||||||
|
bool setNXDNCal1K();
|
||||||
|
bool setPOCSAGCal();
|
||||||
|
bool setDSTARBER_FEC();
|
||||||
|
bool setDMRBER_FEC();
|
||||||
|
bool setDMRBER_1K();
|
||||||
|
bool setYSFBER_FEC();
|
||||||
|
bool setP25BER_FEC();
|
||||||
|
bool setNXDNBER_FEC();
|
||||||
|
bool setDSTAR();
|
||||||
|
bool setRSSI();
|
||||||
|
bool setIntCal();
|
||||||
|
|
||||||
|
bool initModem();
|
||||||
|
void displayModem(const unsigned char* buffer, unsigned int length);
|
||||||
|
bool writeConfig(float txlevel, bool debug);
|
||||||
|
void sleep(unsigned int ms);
|
||||||
|
bool setFrequency();
|
||||||
|
bool getStatus();
|
||||||
|
|
||||||
|
RESP_TYPE_MMDVM getResponse();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
28
MMDVMCal/MMDVMCal.sln
Executable file
|
@ -0,0 +1,28 @@
|
||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio 14
|
||||||
|
VisualStudioVersion = 14.0.24720.0
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MMDVMCal", "MMDVMCal.vcxproj", "{85986F1C-C8FC-4A79-B7F7-02859B4A0DA8}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|x64 = Debug|x64
|
||||||
|
Debug|x86 = Debug|x86
|
||||||
|
Release|x64 = Release|x64
|
||||||
|
Release|x86 = Release|x86
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{85986F1C-C8FC-4A79-B7F7-02859B4A0DA8}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{85986F1C-C8FC-4A79-B7F7-02859B4A0DA8}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{85986F1C-C8FC-4A79-B7F7-02859B4A0DA8}.Debug|x86.ActiveCfg = Debug|Win32
|
||||||
|
{85986F1C-C8FC-4A79-B7F7-02859B4A0DA8}.Debug|x86.Build.0 = Debug|Win32
|
||||||
|
{85986F1C-C8FC-4A79-B7F7-02859B4A0DA8}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{85986F1C-C8FC-4A79-B7F7-02859B4A0DA8}.Release|x64.Build.0 = Release|x64
|
||||||
|
{85986F1C-C8FC-4A79-B7F7-02859B4A0DA8}.Release|x86.ActiveCfg = Release|Win32
|
||||||
|
{85986F1C-C8FC-4A79-B7F7-02859B4A0DA8}.Release|x86.Build.0 = Release|Win32
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
180
MMDVMCal/MMDVMCal.vcxproj
Executable file
|
@ -0,0 +1,180 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>{85986F1C-C8FC-4A79-B7F7-02859B4A0DA8}</ProjectGuid>
|
||||||
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
<RootNamespace>MMDVMCal</RootNamespace>
|
||||||
|
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v142</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v142</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v142</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v142</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="Shared">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="BERCal.h" />
|
||||||
|
<ClInclude Include="Console.h" />
|
||||||
|
<ClInclude Include="CRC.h" />
|
||||||
|
<ClInclude Include="Golay24128.h" />
|
||||||
|
<ClInclude Include="Hamming.h" />
|
||||||
|
<ClInclude Include="MMDVMCal.h" />
|
||||||
|
<ClInclude Include="NXDNDefines.h" />
|
||||||
|
<ClInclude Include="NXDNLICH.h" />
|
||||||
|
<ClInclude Include="P25Utils.h" />
|
||||||
|
<ClInclude Include="SerialController.h" />
|
||||||
|
<ClInclude Include="SerialPort.h" />
|
||||||
|
<ClInclude Include="Utils.h" />
|
||||||
|
<ClInclude Include="Version.h" />
|
||||||
|
<ClInclude Include="YSFConvolution.h" />
|
||||||
|
<ClInclude Include="YSFDefines.h" />
|
||||||
|
<ClInclude Include="YSFFICH.h" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="BERCal.cpp" />
|
||||||
|
<ClCompile Include="Console.cpp" />
|
||||||
|
<ClCompile Include="CRC.cpp" />
|
||||||
|
<ClCompile Include="Golay24128.cpp" />
|
||||||
|
<ClCompile Include="Hamming.cpp" />
|
||||||
|
<ClCompile Include="MMDVMCal.cpp" />
|
||||||
|
<ClCompile Include="NXDNLICH.cpp" />
|
||||||
|
<ClCompile Include="P25Utils.cpp" />
|
||||||
|
<ClCompile Include="SerialController.cpp" />
|
||||||
|
<ClCompile Include="SerialPort.cpp" />
|
||||||
|
<ClCompile Include="Utils.cpp" />
|
||||||
|
<ClCompile Include="YSFConvolution.cpp" />
|
||||||
|
<ClCompile Include="YSFFICH.cpp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
104
MMDVMCal/MMDVMCal.vcxproj.filters
Executable file
|
@ -0,0 +1,104 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup>
|
||||||
|
<Filter Include="Source Files">
|
||||||
|
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||||
|
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Header Files">
|
||||||
|
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||||
|
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
|
||||||
|
</Filter>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="BERCal.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Console.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="CRC.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Golay24128.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="MMDVMCal.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="NXDNLICH.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="NXDNDefines.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="SerialController.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="SerialPort.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Utils.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Version.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Hamming.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="P25Utils.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="YSFConvolution.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="YSFDefines.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="YSFFICH.h">
|
||||||
|
<Filter>Header Files</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="BERCal.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="Console.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="CRC.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="Golay24128.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="MMDVMCal.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="NXDNLICH.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="SerialController.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="SerialPort.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="Utils.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="Hamming.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="P25Utils.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="YSFConvolution.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="YSFFICH.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
51
MMDVMCal/Makefile
Executable file
|
@ -0,0 +1,51 @@
|
||||||
|
all: MMDVMCal
|
||||||
|
|
||||||
|
LD = c++
|
||||||
|
CXX = c++
|
||||||
|
|
||||||
|
CXXFLAGS = -O2 -Wall -std=c++0x
|
||||||
|
|
||||||
|
MMDVMCal: BERCal.o CRC.o Hamming.o Golay24128.o P25Utils.o MMDVMCal.o NXDNLICH.o SerialController.o SerialPort.o Console.o Utils.o YSFConvolution.o YSFFICH.o
|
||||||
|
$(LD) $(LDFLAGS) -o MMDVMCal BERCal.o CRC.o Hamming.o Golay24128.o P25Utils.o MMDVMCal.o NXDNLICH.o SerialController.o SerialPort.o Console.o Utils.o YSFConvolution.o YSFFICH.o $(LIBS)
|
||||||
|
|
||||||
|
BERCal.o: BERCal.cpp BERCal.h Golay24128.h Utils.h
|
||||||
|
$(CXX) $(CXXFLAGS) -c BERCal.cpp
|
||||||
|
|
||||||
|
CRC.o: CRC.cpp CRC.h
|
||||||
|
$(CXX) $(CXXFLAGS) -c CRC.cpp
|
||||||
|
|
||||||
|
Hamming.o: Hamming.cpp Hamming.h
|
||||||
|
$(CXX) $(CXXFLAGS) -c Hamming.cpp
|
||||||
|
|
||||||
|
Golay24128.o: Golay24128.cpp Golay24128.h
|
||||||
|
$(CXX) $(CXXFLAGS) -c Golay24128.cpp
|
||||||
|
|
||||||
|
P25Utils.o: P25Utils.cpp P25Utils.h
|
||||||
|
$(CXX) $(CXXFLAGS) -c P25Utils.cpp
|
||||||
|
|
||||||
|
MMDVMCal.o: MMDVMCal.cpp MMDVMCal.h SerialController.h Console.h Utils.h
|
||||||
|
$(CXX) $(CXXFLAGS) -c MMDVMCal.cpp
|
||||||
|
|
||||||
|
NXDNLICH.o: NXDNLICH.cpp NXDNLICH.h NXDNDefines.h
|
||||||
|
$(CXX) $(CXXFLAGS) -c NXDNLICH.cpp
|
||||||
|
|
||||||
|
SerialController.o: SerialController.cpp SerialController.h
|
||||||
|
$(CXX) $(CXXFLAGS) -c SerialController.cpp
|
||||||
|
|
||||||
|
SerialPort.o: SerialPort.cpp SerialPort.h
|
||||||
|
$(CXX) $(CXXFLAGS) -c SerialPort.cpp
|
||||||
|
|
||||||
|
Console.o: Console.cpp Console.h
|
||||||
|
$(CXX) $(CXXFLAGS) -c Console.cpp
|
||||||
|
|
||||||
|
Utils.o: Utils.cpp Utils.h
|
||||||
|
$(CXX) $(CXXFLAGS) -c Utils.cpp
|
||||||
|
|
||||||
|
YSFConvolution.o: YSFConvolution.cpp YSFConvolution.h
|
||||||
|
$(CXX) $(CXXFLAGS) -c YSFConvolution.cpp
|
||||||
|
|
||||||
|
YSFFICH: YSFFICH.cpp CRC.h Golay24128.h YSFConvolution.h YSFDefines.h YSFFICH.h
|
||||||
|
$(CXX) $(CXXFLAGS) -c YSFFICH.cpp
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *.o *.bak *~ MMDVMCal
|
102
MMDVMCal/NXDNDefines.h
Executable file
|
@ -0,0 +1,102 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2016,2017,2018 by Jonathan Naylor G4KLX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(NXDNDEFINES_H)
|
||||||
|
#define NXDNDEFINES_H
|
||||||
|
|
||||||
|
const unsigned int NXDN_RADIO_SYMBOL_LENGTH = 5U; // At 24 kHz sample rate
|
||||||
|
|
||||||
|
const unsigned int NXDN_FRAME_LENGTH_BITS = 384U;
|
||||||
|
const unsigned int NXDN_FRAME_LENGTH_BYTES = NXDN_FRAME_LENGTH_BITS / 8U;
|
||||||
|
const unsigned int NXDN_FRAME_LENGTH_SYMBOLS = NXDN_FRAME_LENGTH_BITS / 2U;
|
||||||
|
|
||||||
|
const unsigned int NXDN_FSW_LENGTH_BITS = 20U;
|
||||||
|
const unsigned int NXDN_FSW_LENGTH_SYMBOLS = NXDN_FSW_LENGTH_BITS / 2U;
|
||||||
|
const unsigned int NXDN_FSW_LENGTH_SAMPLES = NXDN_FSW_LENGTH_SYMBOLS * NXDN_RADIO_SYMBOL_LENGTH;
|
||||||
|
|
||||||
|
const unsigned char NXDN_FSW_BYTES[] = {0xCDU, 0xF5U, 0x90U};
|
||||||
|
const unsigned char NXDN_FSW_BYTES_MASK[] = {0xFFU, 0xFFU, 0xF0U};
|
||||||
|
const unsigned int NXDN_FSW_BYTES_LENGTH = 3U;
|
||||||
|
|
||||||
|
const unsigned int NXDN_LICH_LENGTH_BITS = 16U;
|
||||||
|
|
||||||
|
const unsigned int NXDN_SACCH_LENGTH_BITS = 60U;
|
||||||
|
const unsigned int NXDN_FACCH1_LENGTH_BITS = 144U;
|
||||||
|
const unsigned int NXDN_FACCH2_LENGTH_BITS = 348U;
|
||||||
|
|
||||||
|
const unsigned int NXDN_FSW_LICH_SACCH_LENGTH_BITS = NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS + NXDN_SACCH_LENGTH_BITS;
|
||||||
|
const unsigned int NXDN_FSW_LICH_SACCH_LENGTH_BYTES = NXDN_FSW_LICH_SACCH_LENGTH_BITS / 8U;
|
||||||
|
|
||||||
|
const unsigned char NXDN_LICH_RFCT_RCCH = 0U;
|
||||||
|
const unsigned char NXDN_LICH_RFCT_RTCH = 1U;
|
||||||
|
const unsigned char NXDN_LICH_RFCT_RDCH = 2U;
|
||||||
|
const unsigned char NXDN_LICH_RFCT_RTCH_C = 3U;
|
||||||
|
|
||||||
|
const unsigned char NXDN_LICH_USC_SACCH_NS = 0U;
|
||||||
|
const unsigned char NXDN_LICH_USC_UDCH = 1U;
|
||||||
|
const unsigned char NXDN_LICH_USC_SACCH_SS = 2U;
|
||||||
|
const unsigned char NXDN_LICH_USC_SACCH_SS_IDLE = 3U;
|
||||||
|
|
||||||
|
const unsigned char NXDN_LICH_STEAL_NONE = 3U;
|
||||||
|
const unsigned char NXDN_LICH_STEAL_FACCH1_2 = 2U;
|
||||||
|
const unsigned char NXDN_LICH_STEAL_FACCH1_1 = 1U;
|
||||||
|
const unsigned char NXDN_LICH_STEAL_FACCH = 0U;
|
||||||
|
|
||||||
|
const unsigned char NXDN_LICH_DIRECTION_INBOUND = 0U;
|
||||||
|
const unsigned char NXDN_LICH_DIRECTION_OUTBOUND = 1U;
|
||||||
|
|
||||||
|
const unsigned char NXDN_SR_SINGLE = 0U;
|
||||||
|
const unsigned char NXDN_SR_4_4 = 0U;
|
||||||
|
const unsigned char NXDN_SR_3_4 = 1U;
|
||||||
|
const unsigned char NXDN_SR_2_4 = 2U;
|
||||||
|
const unsigned char NXDN_SR_1_4 = 3U;
|
||||||
|
|
||||||
|
const unsigned char NXDN_MESSAGE_TYPE_VCALL = 0x01U;
|
||||||
|
const unsigned char NXDN_MESSAGE_TYPE_VCALL_IV = 0x03U;
|
||||||
|
const unsigned char NXDN_MESSAGE_TYPE_DCALL_HDR = 0x09U;
|
||||||
|
const unsigned char NXDN_MESSAGE_TYPE_DCALL_DATA = 0x0BU;
|
||||||
|
const unsigned char NXDN_MESSAGE_TYPE_DCALL_ACK = 0x0CU;
|
||||||
|
const unsigned char NXDN_MESSAGE_TYPE_TX_REL = 0x08U;
|
||||||
|
const unsigned char NXDN_MESSAGE_TYPE_HEAD_DLY = 0x0FU;
|
||||||
|
const unsigned char NXDN_MESSAGE_TYPE_SDCALL_REQ_HDR = 0x38U;
|
||||||
|
const unsigned char NXDN_MESSAGE_TYPE_SDCALL_REQ_DATA = 0x39U;
|
||||||
|
const unsigned char NXDN_MESSAGE_TYPE_SDCALL_RESP = 0x3BU;
|
||||||
|
const unsigned char NXDN_MESSAGE_TYPE_SDCALL_IV = 0x3AU;
|
||||||
|
const unsigned char NXDN_MESSAGE_TYPE_STAT_INQ_REQ = 0x30U;
|
||||||
|
const unsigned char NXDN_MESSAGE_TYPE_STAT_INQ_RESP = 0x31U;
|
||||||
|
const unsigned char NXDN_MESSAGE_TYPE_STAT_REQ = 0x32U;
|
||||||
|
const unsigned char NXDN_MESSAGE_TYPE_STAT_RESP = 0x33U;
|
||||||
|
const unsigned char NXDN_MESSAGE_TYPE_REM_CON_REQ = 0x34U;
|
||||||
|
const unsigned char NXDN_MESSAGE_TYPE_REM_CON_RESP = 0x35U;
|
||||||
|
const unsigned char NXDN_MESSAGE_TYPE_IDLE = 0x10U;
|
||||||
|
const unsigned char NXDN_MESSAGE_TYPE_AUTH_INQ_REQ = 0x28U;
|
||||||
|
const unsigned char NXDN_MESSAGE_TYPE_AUTH_INQ_RESP = 0x29U;
|
||||||
|
const unsigned char NXDN_MESSAGE_TYPE_PROP_FORM = 0x3FU;
|
||||||
|
|
||||||
|
const unsigned char NXDN_VOICE_CALL_OPTION_HALF_DUPLEX = 0x00U;
|
||||||
|
const unsigned char NXDN_VOICE_CALL_OPTION_DUPLEX = 0x10U;
|
||||||
|
|
||||||
|
const unsigned char NXDN_DATA_CALL_OPTION_HALF_DUPLEX = 0x00U;
|
||||||
|
const unsigned char NXDN_DATA_CALL_OPTION_DUPLEX = 0x10U;
|
||||||
|
|
||||||
|
const unsigned char NXDN_DATA_CALL_OPTION_4800 = 0x00U;
|
||||||
|
const unsigned char NXDN_DATA_CALL_OPTION_9600 = 0x02U;
|
||||||
|
|
||||||
|
const unsigned char SACCH_IDLE[] = { NXDN_MESSAGE_TYPE_IDLE, 0x00U, 0x00U };
|
||||||
|
|
||||||
|
#endif
|
162
MMDVMCal/NXDNLICH.cpp
Executable file
|
@ -0,0 +1,162 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2018 by Jonathan Naylor G4KLX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "NXDNDefines.h"
|
||||||
|
#include "NXDNLICH.h"
|
||||||
|
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cassert>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
const unsigned char BIT_MASK_TABLE[] = {0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U};
|
||||||
|
|
||||||
|
#define WRITE_BIT1(p,i,b) p[(i)>>3] = (b) ? (p[(i)>>3] | BIT_MASK_TABLE[(i)&7]) : (p[(i)>>3] & ~BIT_MASK_TABLE[(i)&7])
|
||||||
|
#define READ_BIT1(p,i) (p[(i)>>3] & BIT_MASK_TABLE[(i)&7])
|
||||||
|
|
||||||
|
CNXDNLICH::CNXDNLICH(const CNXDNLICH& lich) :
|
||||||
|
m_lich(NULL)
|
||||||
|
{
|
||||||
|
m_lich = new unsigned char[1U];
|
||||||
|
m_lich[0U] = lich.m_lich[0U];
|
||||||
|
}
|
||||||
|
|
||||||
|
CNXDNLICH::CNXDNLICH() :
|
||||||
|
m_lich(NULL)
|
||||||
|
{
|
||||||
|
m_lich = new unsigned char[1U];
|
||||||
|
}
|
||||||
|
|
||||||
|
CNXDNLICH::~CNXDNLICH()
|
||||||
|
{
|
||||||
|
delete[] m_lich;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CNXDNLICH::decode(const unsigned char* bytes)
|
||||||
|
{
|
||||||
|
assert(bytes != NULL);
|
||||||
|
|
||||||
|
unsigned int offset = NXDN_FSW_LENGTH_BITS;
|
||||||
|
for (unsigned int i = 0U; i < (NXDN_LICH_LENGTH_BITS / 2U); i++, offset += 2U) {
|
||||||
|
bool b = READ_BIT1(bytes, offset);
|
||||||
|
WRITE_BIT1(m_lich, i, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool newParity = getParity();
|
||||||
|
bool origParity = (m_lich[0U] & 0x01U) == 0x01U;
|
||||||
|
|
||||||
|
return origParity == newParity;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CNXDNLICH::encode(unsigned char* bytes)
|
||||||
|
{
|
||||||
|
assert(bytes != NULL);
|
||||||
|
|
||||||
|
bool parity = getParity();
|
||||||
|
if (parity)
|
||||||
|
m_lich[0U] |= 0x01U;
|
||||||
|
else
|
||||||
|
m_lich[0U] &= 0xFEU;
|
||||||
|
|
||||||
|
unsigned int offset = NXDN_FSW_LENGTH_BITS;
|
||||||
|
for (unsigned int i = 0U; i < (NXDN_LICH_LENGTH_BITS / 2U); i++) {
|
||||||
|
bool b = READ_BIT1(m_lich, i);
|
||||||
|
WRITE_BIT1(bytes, offset, b);
|
||||||
|
offset++;
|
||||||
|
WRITE_BIT1(bytes, offset, true);
|
||||||
|
offset++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char CNXDNLICH::getRFCT() const
|
||||||
|
{
|
||||||
|
return (m_lich[0U] >> 6) & 0x03U;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char CNXDNLICH::getFCT() const
|
||||||
|
{
|
||||||
|
return (m_lich[0U] >> 4) & 0x03U;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char CNXDNLICH::getOption() const
|
||||||
|
{
|
||||||
|
return (m_lich[0U] >> 2) & 0x03U;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char CNXDNLICH::getDirection() const
|
||||||
|
{
|
||||||
|
return (m_lich[0U] >> 1) & 0x01U;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char CNXDNLICH::getRaw() const
|
||||||
|
{
|
||||||
|
bool parity = getParity();
|
||||||
|
if (parity)
|
||||||
|
m_lich[0U] |= 0x01U;
|
||||||
|
else
|
||||||
|
m_lich[0U] &= 0xFEU;
|
||||||
|
|
||||||
|
return m_lich[0U];
|
||||||
|
}
|
||||||
|
|
||||||
|
void CNXDNLICH::setRFCT(unsigned char rfct)
|
||||||
|
{
|
||||||
|
m_lich[0U] &= 0x3FU;
|
||||||
|
m_lich[0U] |= (rfct << 6) & 0xC0U;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CNXDNLICH::setFCT(unsigned char usc)
|
||||||
|
{
|
||||||
|
m_lich[0U] &= 0xCFU;
|
||||||
|
m_lich[0U] |= (usc << 4) & 0x30U;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CNXDNLICH::setOption(unsigned char option)
|
||||||
|
{
|
||||||
|
m_lich[0U] &= 0xF3U;
|
||||||
|
m_lich[0U] |= (option << 2) & 0x0CU;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CNXDNLICH::setDirection(unsigned char direction)
|
||||||
|
{
|
||||||
|
m_lich[0U] &= 0xFDU;
|
||||||
|
m_lich[0U] |= (direction << 1) & 0x02U;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CNXDNLICH::setRaw(unsigned char lich)
|
||||||
|
{
|
||||||
|
m_lich[0U] = lich;
|
||||||
|
}
|
||||||
|
|
||||||
|
CNXDNLICH& CNXDNLICH::operator=(const CNXDNLICH& lich)
|
||||||
|
{
|
||||||
|
if (&lich != this)
|
||||||
|
m_lich[0U] = lich.m_lich[0U];
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CNXDNLICH::getParity() const
|
||||||
|
{
|
||||||
|
switch (m_lich[0U] & 0xF0U) {
|
||||||
|
case 0x80U:
|
||||||
|
case 0xB0U:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
52
MMDVMCal/NXDNLICH.h
Executable file
|
@ -0,0 +1,52 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2018 by Jonathan Naylor G4KLX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(NXDNLICH_H)
|
||||||
|
#define NXDNLICH_H
|
||||||
|
|
||||||
|
class CNXDNLICH {
|
||||||
|
public:
|
||||||
|
CNXDNLICH(const CNXDNLICH& lich);
|
||||||
|
CNXDNLICH();
|
||||||
|
~CNXDNLICH();
|
||||||
|
|
||||||
|
bool decode(const unsigned char* bytes);
|
||||||
|
|
||||||
|
void encode(unsigned char* bytes);
|
||||||
|
|
||||||
|
unsigned char getRFCT() const;
|
||||||
|
unsigned char getFCT() const;
|
||||||
|
unsigned char getOption() const;
|
||||||
|
unsigned char getDirection() const;
|
||||||
|
unsigned char getRaw() const;
|
||||||
|
|
||||||
|
void setRFCT(unsigned char rfct);
|
||||||
|
void setFCT(unsigned char usc);
|
||||||
|
void setOption(unsigned char option);
|
||||||
|
void setDirection(unsigned char direction);
|
||||||
|
void setRaw(unsigned char lich);
|
||||||
|
|
||||||
|
CNXDNLICH& operator=(const CNXDNLICH& lich);
|
||||||
|
|
||||||
|
private:
|
||||||
|
unsigned char* m_lich;
|
||||||
|
|
||||||
|
bool getParity() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
135
MMDVMCal/P25Utils.cpp
Executable file
|
@ -0,0 +1,135 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2016,2018 by Jonathan Naylor G4KLX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "P25Utils.h"
|
||||||
|
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
|
const unsigned char BIT_MASK_TABLE[] = { 0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U };
|
||||||
|
|
||||||
|
#define WRITE_BIT(p,i,b) p[(i)>>3] = (b) ? (p[(i)>>3] | BIT_MASK_TABLE[(i)&7]) : (p[(i)>>3] & ~BIT_MASK_TABLE[(i)&7])
|
||||||
|
#define READ_BIT(p,i) (p[(i)>>3] & BIT_MASK_TABLE[(i)&7])
|
||||||
|
|
||||||
|
const unsigned int P25_SS0_START = 70U;
|
||||||
|
const unsigned int P25_SS1_START = 71U;
|
||||||
|
const unsigned int P25_SS_INCREMENT = 72U;
|
||||||
|
|
||||||
|
unsigned int CP25Utils::decode(const unsigned char* in, unsigned char* out, unsigned int start, unsigned int stop)
|
||||||
|
{
|
||||||
|
assert(in != NULL);
|
||||||
|
assert(out != NULL);
|
||||||
|
|
||||||
|
// Move the SSx positions to the range needed
|
||||||
|
unsigned int ss0Pos = P25_SS0_START;
|
||||||
|
unsigned int ss1Pos = P25_SS1_START;
|
||||||
|
|
||||||
|
while (ss0Pos < start) {
|
||||||
|
ss0Pos += P25_SS_INCREMENT;
|
||||||
|
ss1Pos += P25_SS_INCREMENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int n = 0U;
|
||||||
|
for (unsigned int i = start; i < stop; i++) {
|
||||||
|
if (i == ss0Pos) {
|
||||||
|
ss0Pos += P25_SS_INCREMENT;
|
||||||
|
} else if (i == ss1Pos) {
|
||||||
|
ss1Pos += P25_SS_INCREMENT;
|
||||||
|
} else {
|
||||||
|
bool b = READ_BIT(in, i);
|
||||||
|
WRITE_BIT(out, n, b);
|
||||||
|
n++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int CP25Utils::encode(const unsigned char* in, unsigned char* out, unsigned int start, unsigned int stop)
|
||||||
|
{
|
||||||
|
assert(in != NULL);
|
||||||
|
assert(out != NULL);
|
||||||
|
|
||||||
|
// Move the SSx positions to the range needed
|
||||||
|
unsigned int ss0Pos = P25_SS0_START;
|
||||||
|
unsigned int ss1Pos = P25_SS1_START;
|
||||||
|
|
||||||
|
while (ss0Pos < start) {
|
||||||
|
ss0Pos += P25_SS_INCREMENT;
|
||||||
|
ss1Pos += P25_SS_INCREMENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int n = 0U;
|
||||||
|
for (unsigned int i = start; i < stop; i++) {
|
||||||
|
if (i == ss0Pos) {
|
||||||
|
ss0Pos += P25_SS_INCREMENT;
|
||||||
|
} else if (i == ss1Pos) {
|
||||||
|
ss1Pos += P25_SS_INCREMENT;
|
||||||
|
} else {
|
||||||
|
bool b = READ_BIT(in, n);
|
||||||
|
WRITE_BIT(out, i, b);
|
||||||
|
n++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int CP25Utils::encode(const unsigned char* in, unsigned char* out, unsigned int length)
|
||||||
|
{
|
||||||
|
assert(in != NULL);
|
||||||
|
assert(out != NULL);
|
||||||
|
|
||||||
|
// Move the SSx positions to the range needed
|
||||||
|
unsigned int ss0Pos = P25_SS0_START;
|
||||||
|
unsigned int ss1Pos = P25_SS1_START;
|
||||||
|
|
||||||
|
unsigned int n = 0U;
|
||||||
|
unsigned int pos = 0U;
|
||||||
|
while (n < length) {
|
||||||
|
if (pos == ss0Pos) {
|
||||||
|
ss0Pos += P25_SS_INCREMENT;
|
||||||
|
} else if (pos == ss1Pos) {
|
||||||
|
ss1Pos += P25_SS_INCREMENT;
|
||||||
|
} else {
|
||||||
|
bool b = READ_BIT(in, n);
|
||||||
|
WRITE_BIT(out, pos, b);
|
||||||
|
n++;
|
||||||
|
}
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int CP25Utils::compare(const unsigned char* data1, const unsigned char* data2, unsigned int length)
|
||||||
|
{
|
||||||
|
assert(data1 != NULL);
|
||||||
|
assert(data2 != NULL);
|
||||||
|
|
||||||
|
unsigned int errs = 0U;
|
||||||
|
for (unsigned int i = 0U; i < length; i++) {
|
||||||
|
unsigned char v = data1[i] ^ data2[i];
|
||||||
|
while (v != 0U) {
|
||||||
|
v &= v - 1U;
|
||||||
|
errs++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return errs;
|
||||||
|
}
|
34
MMDVMCal/P25Utils.h
Executable file
|
@ -0,0 +1,34 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2016,2018 by Jonathan Naylor G4KLX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(P25Utils_H)
|
||||||
|
#define P25Utils_H
|
||||||
|
|
||||||
|
class CP25Utils {
|
||||||
|
public:
|
||||||
|
static unsigned int encode(const unsigned char* in, unsigned char* out, unsigned int start, unsigned int stop);
|
||||||
|
static unsigned int encode(const unsigned char* in, unsigned char* out, unsigned int length);
|
||||||
|
|
||||||
|
static unsigned int decode(const unsigned char* in, unsigned char* out, unsigned int start, unsigned int stop);
|
||||||
|
|
||||||
|
static unsigned int compare(const unsigned char* data1, const unsigned char* data2, unsigned int length);
|
||||||
|
|
||||||
|
private:
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
72
MMDVMCal/README.md
Executable file
|
@ -0,0 +1,72 @@
|
||||||
|
This is the calibration program to be used with the MMDVM and MMDVM_HS. It is started by
|
||||||
|
adding the serial port onto the command line. On Windows the serial port must be
|
||||||
|
prefixed with \\.\ as in \\.\COM4 to be valid. Once started the program takes
|
||||||
|
the following commands:
|
||||||
|
|
||||||
|
- MMDVM:
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr><th>Command</th><th>Description</th></tr>
|
||||||
|
<tr><td>H/h</td><td>Display help</td></tr>
|
||||||
|
<tr><td>Q/q</td><td>Quit</td></tr>
|
||||||
|
<tr><td>W/w</td><td>Enable/disable modem debug messages</td></tr>
|
||||||
|
<tr><td>I</td><td>Toggle transmit inversion</td><tr>
|
||||||
|
<tr><td>i</td><td>Toggle receive inversion</td></tr>
|
||||||
|
<tr><td>O</td><td>Increase TX DC offset level</td></tr>
|
||||||
|
<tr><td>o</td><td>Decrease TX DC offset level</td></tr>
|
||||||
|
<tr><td>C</td><td>Increase RX DC offset level</td></tr>
|
||||||
|
<tr><td>c</td><td>Decrease RX DC offset level</td></tr>
|
||||||
|
<tr><td>P/p</td><td>Toggle PTT inversion</td></tr>
|
||||||
|
<tr><td>R</td><td>Increase receive level</td></tr>
|
||||||
|
<tr><td>r</td><td>Decrease receive level</td></tr>
|
||||||
|
<tr><td>T</td><td>Increase transmit level</td></tr>
|
||||||
|
<tr><td>t</td><td>Decrease transmit level</td></tr>
|
||||||
|
<tr><td>d</td><td>D-Star mode</td></tr>
|
||||||
|
<tr><td>D</td><td>Set DMR Deviation Mode. Generates a 1.2Khz Sinewave. Set radio for 2.75 Khz Deviation</td></tr>
|
||||||
|
<tr><td>L/l</td><td>DMR Low Frequency Mode (80 Hz square wave)</td></tr>
|
||||||
|
<tr><td>A</td><td>DMR Duplex 1031 Hz Test Pattern (TS2 CC1 ID1 TG9)</td></tr>
|
||||||
|
<tr><td>M/m</td><td>DMR Simplex 1031 Hz Test Pattern (CC1 ID1 TG9)</td></tr>
|
||||||
|
<tr><td>a</td><td>P25 1011 Hz Test Pattern (NAC293 ID1 TG1)</td></tr>
|
||||||
|
<tr><td>N</td><td>NXDN 1031 Hz Test Pattern (RAN1 ID1 TG1)</td></tr>
|
||||||
|
<tr><td>K/k</td><td>BER Test Mode (FEC) for D-Star</td></tr>
|
||||||
|
<tr><td>b</td><td>BER Test Mode (FEC) for DMR Simplex (CC1)</td></tr>
|
||||||
|
<tr><td>B</td><td>BER Test Mode (1031 Hz Test Pattern) for DMR Simplex (CC1 ID1 TG9)</td></tr>
|
||||||
|
<tr><td>J</td><td>BER Test Mode (FEC) for YSF</td></tr>
|
||||||
|
<tr><td>j</td><td>BER Test Mode (FEC) for P25</td></tr>
|
||||||
|
<tr><td>n</td><td>BER Test Mode (FEC) for NXDN</td></tr>
|
||||||
|
<tr><td>g</td><td>POCSAG 600Hz Test Pattern</td></tr>
|
||||||
|
<tr><td>S/s</td><td>RSSI Mode</td></tr>
|
||||||
|
<tr><td>V/v</td><td>Display version of MMDVMCal</td></tr>
|
||||||
|
<tr><td><space></td><td>Toggle transmit</td></tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
- MMDVM_HS:
|
||||||
|
|
||||||
|
<table>
|
||||||
|
<tr><th>Command</th><th>Description</th></tr>
|
||||||
|
<tr><td>H/h</td><td>Display help</td></tr>
|
||||||
|
<tr><td>Q/q</td><td>Quit</td></tr>
|
||||||
|
<tr><td>W/w</td><td>Enable/disable modem debug messages</td></tr>
|
||||||
|
<tr><td>E/e</td><td>Enter frequency</td><tr>
|
||||||
|
<tr><td>F</td><td>Increase frequency</td></tr>
|
||||||
|
<tr><td>f</td><td>Decrease frequency</td></tr>
|
||||||
|
<tr><td>Z/z</td><td>Enter frequency step</td></tr>
|
||||||
|
<tr><td>T</td><td>Increase deviation</td></tr>
|
||||||
|
<tr><td>t</td><td>Decrease deviation</td></tr>
|
||||||
|
<tr><td>P</td><td>Increase RF power</td></tr>
|
||||||
|
<tr><td>p</td><td>Decrease RF power</td></tr>
|
||||||
|
<tr><td>C/c</td><td>Carrier Only Mode</td></tr>
|
||||||
|
<tr><td>D/d</td><td>DMR Deviation Mode</td></tr>
|
||||||
|
<tr><td>M/m</td><td>DMR Simplex 1031 Hz Test Pattern (CC1 ID1 TG9)</td></tr>
|
||||||
|
<tr><td>K/k</td><td>BER Test Mode (FEC) for D-Star</td></tr>
|
||||||
|
<tr><td>b</td><td>BER Test Mode (FEC) for DMR Simplex (CC1)</td></tr>
|
||||||
|
<tr><td>B</td><td>BER Test Mode (1031 Hz Test Pattern) for DMR Simplex (CC1 ID1 TG9)</td></tr>
|
||||||
|
<tr><td>J</td><td>BER Test Mode (FEC) for YSF</td></tr>
|
||||||
|
<tr><td>j</td><td>BER Test Mode (FEC) for P25</td></tr>
|
||||||
|
<tr><td>n</td><td>BER Test Mode (FEC) for NXDN</td></tr>
|
||||||
|
<tr><td>g</td><td>POCSAG 600Hz Test Pattern</td></tr>
|
||||||
|
<tr><td>S/s</td><td>RSSI Mode</td></tr>
|
||||||
|
<tr><td>I/i</td><td>Interrupt Counter Mode</td></tr>
|
||||||
|
<tr><td>V/v</td><td>Display version of MMDVMCal</td></tr>
|
||||||
|
<tr><td><space></td><td>Toggle transmit</td></tr>
|
||||||
|
</table>
|
516
MMDVMCal/SerialController.cpp
Executable file
|
@ -0,0 +1,516 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2002-2004,2007-2011,2013,2014-2017 by Jonathan Naylor G4KLX
|
||||||
|
* Copyright (C) 1999-2001 by Thomas Sailor HB9JNX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "SerialController.h"
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
|
#include <setupapi.h>
|
||||||
|
#include <winioctl.h>
|
||||||
|
#else
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <cerrno>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <termios.h>
|
||||||
|
#if defined(__linux__)
|
||||||
|
#include <linux/i2c-dev.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
|
#define EOL "\n"
|
||||||
|
#else
|
||||||
|
#include <unistd.h>
|
||||||
|
#define EOL "\r\n"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
|
|
||||||
|
CSerialController::CSerialController(const std::string& device, SERIAL_SPEED speed, bool assertRTS) :
|
||||||
|
m_device(device),
|
||||||
|
m_speed(speed),
|
||||||
|
m_assertRTS(assertRTS),
|
||||||
|
m_handle(INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
assert(!device.empty());
|
||||||
|
}
|
||||||
|
|
||||||
|
CSerialController::~CSerialController()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CSerialController::open()
|
||||||
|
{
|
||||||
|
assert(m_handle == INVALID_HANDLE_VALUE);
|
||||||
|
|
||||||
|
DWORD errCode;
|
||||||
|
|
||||||
|
std::string baseName = m_device.substr(4U); // Convert "\\.\COM10" to "COM10"
|
||||||
|
|
||||||
|
m_handle = ::CreateFileA(m_device.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
||||||
|
if (m_handle == INVALID_HANDLE_VALUE) {
|
||||||
|
::fprintf(stderr, "Cannot open device - %s, err=%04lx" EOL, m_device.c_str(), ::GetLastError());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
DCB dcb;
|
||||||
|
if (::GetCommState(m_handle, &dcb) == 0) {
|
||||||
|
::fprintf(stderr, "Cannot get the attributes for %s, err=%04lx" EOL, m_device.c_str(), ::GetLastError());
|
||||||
|
::ClearCommError(m_handle, &errCode, NULL);
|
||||||
|
::CloseHandle(m_handle);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
dcb.BaudRate = DWORD(m_speed);
|
||||||
|
dcb.ByteSize = 8;
|
||||||
|
dcb.Parity = NOPARITY;
|
||||||
|
dcb.fParity = FALSE;
|
||||||
|
dcb.StopBits = ONESTOPBIT;
|
||||||
|
dcb.fInX = FALSE;
|
||||||
|
dcb.fOutX = FALSE;
|
||||||
|
dcb.fOutxCtsFlow = FALSE;
|
||||||
|
dcb.fOutxDsrFlow = FALSE;
|
||||||
|
dcb.fDsrSensitivity = FALSE;
|
||||||
|
dcb.fDtrControl = DTR_CONTROL_DISABLE;
|
||||||
|
dcb.fRtsControl = RTS_CONTROL_DISABLE;
|
||||||
|
|
||||||
|
if (::SetCommState(m_handle, &dcb) == 0) {
|
||||||
|
::fprintf(stderr, "Cannot set the attributes for %s, err=%04lx" EOL, m_device.c_str(), ::GetLastError());
|
||||||
|
::ClearCommError(m_handle, &errCode, NULL);
|
||||||
|
::CloseHandle(m_handle);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
COMMTIMEOUTS timeouts;
|
||||||
|
if (!::GetCommTimeouts(m_handle, &timeouts)) {
|
||||||
|
::fprintf(stderr, "Cannot get the timeouts for %s, err=%04lx" EOL, m_device.c_str(), ::GetLastError());
|
||||||
|
::ClearCommError(m_handle, &errCode, NULL);
|
||||||
|
::CloseHandle(m_handle);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
timeouts.ReadIntervalTimeout = MAXDWORD;
|
||||||
|
timeouts.ReadTotalTimeoutMultiplier = 0UL;
|
||||||
|
timeouts.ReadTotalTimeoutConstant = 0UL;
|
||||||
|
|
||||||
|
if (!::SetCommTimeouts(m_handle, &timeouts)) {
|
||||||
|
::fprintf(stderr, "Cannot set the timeouts for %s, err=%04lx" EOL, m_device.c_str(), ::GetLastError());
|
||||||
|
::ClearCommError(m_handle, &errCode, NULL);
|
||||||
|
::CloseHandle(m_handle);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (::EscapeCommFunction(m_handle, CLRDTR) == 0) {
|
||||||
|
::fprintf(stderr, "Cannot clear DTR for %s, err=%04lx" EOL, m_device.c_str(), ::GetLastError());
|
||||||
|
::ClearCommError(m_handle, &errCode, NULL);
|
||||||
|
::CloseHandle(m_handle);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (::EscapeCommFunction(m_handle, m_assertRTS ? SETRTS : CLRRTS) == 0) {
|
||||||
|
::fprintf(stderr, "Cannot set/clear RTS for %s, err=%04lx" EOL, m_device.c_str(), ::GetLastError());
|
||||||
|
::ClearCommError(m_handle, &errCode, NULL);
|
||||||
|
::CloseHandle(m_handle);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
::ClearCommError(m_handle, &errCode, NULL);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CSerialController::read(unsigned char* buffer, unsigned int length)
|
||||||
|
{
|
||||||
|
assert(m_handle != INVALID_HANDLE_VALUE);
|
||||||
|
assert(buffer != NULL);
|
||||||
|
|
||||||
|
unsigned int ptr = 0U;
|
||||||
|
|
||||||
|
while (ptr < length) {
|
||||||
|
int ret = readNonblock(buffer + ptr, length - ptr);
|
||||||
|
if (ret < 0) {
|
||||||
|
return ret;
|
||||||
|
} else if (ret == 0) {
|
||||||
|
if (ptr == 0U)
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
ptr += ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return int(length);
|
||||||
|
}
|
||||||
|
|
||||||
|
int CSerialController::readNonblock(unsigned char* buffer, unsigned int length)
|
||||||
|
{
|
||||||
|
assert(m_handle != INVALID_HANDLE_VALUE);
|
||||||
|
assert(buffer != NULL);
|
||||||
|
|
||||||
|
if (length == 0U)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
DWORD errors;
|
||||||
|
COMSTAT status;
|
||||||
|
if (::ClearCommError(m_handle, &errors, &status) == 0) {
|
||||||
|
::fprintf(stderr, "Error from ClearCommError for %s, err=%04lx" EOL, m_device.c_str(), ::GetLastError());
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status.cbInQue == 0UL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
DWORD readLength = status.cbInQue;
|
||||||
|
if (length < readLength)
|
||||||
|
readLength = length;
|
||||||
|
|
||||||
|
DWORD bytes = 0UL;
|
||||||
|
BOOL ret = ::ReadFile(m_handle, buffer, readLength, &bytes, NULL);
|
||||||
|
if (!ret) {
|
||||||
|
::fprintf(stderr, "Error from ReadFile for %s: %04lx" EOL, m_device.c_str(), ::GetLastError());
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return int(bytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
int CSerialController::write(const unsigned char* buffer, unsigned int length)
|
||||||
|
{
|
||||||
|
assert(m_handle != INVALID_HANDLE_VALUE);
|
||||||
|
assert(buffer != NULL);
|
||||||
|
|
||||||
|
if (length == 0U)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
unsigned int ptr = 0U;
|
||||||
|
|
||||||
|
while (ptr < length) {
|
||||||
|
DWORD bytes = 0UL;
|
||||||
|
BOOL ret = ::WriteFile(m_handle, buffer + ptr, length - ptr, &bytes, NULL);
|
||||||
|
if (!ret) {
|
||||||
|
::fprintf(stderr, "Error from WriteFile for %s: %04lx" EOL, m_device.c_str(), ::GetLastError());
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ptr += bytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
return int(length);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSerialController::close()
|
||||||
|
{
|
||||||
|
assert(m_handle != INVALID_HANDLE_VALUE);
|
||||||
|
|
||||||
|
::CloseHandle(m_handle);
|
||||||
|
m_handle = INVALID_HANDLE_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
CSerialController::CSerialController(const std::string& device, SERIAL_SPEED speed, bool assertRTS) :
|
||||||
|
m_device(device),
|
||||||
|
m_speed(speed),
|
||||||
|
m_assertRTS(assertRTS),
|
||||||
|
m_fd(-1)
|
||||||
|
{
|
||||||
|
assert(!device.empty());
|
||||||
|
}
|
||||||
|
|
||||||
|
CSerialController::~CSerialController()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CSerialController::open()
|
||||||
|
{
|
||||||
|
assert(m_fd == -1);
|
||||||
|
|
||||||
|
if (m_device == "/dev/i2c-1") {
|
||||||
|
#if defined(__linux__)
|
||||||
|
m_fd = ::open(m_device.c_str(), O_RDWR);
|
||||||
|
if (m_fd < 0) {
|
||||||
|
::fprintf(stderr, "Cannot open device - %s", m_device.c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (::ioctl(m_fd, I2C_TENBIT, 0) < 0) {
|
||||||
|
::fprintf(stderr, "CI2C: failed to set 7bitaddress");
|
||||||
|
::close(m_fd);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (::ioctl(m_fd, I2C_SLAVE, 0x22) < 0) {
|
||||||
|
::fprintf(stderr, "CI2C: Failed to acquire bus access/talk to slave 0x22");
|
||||||
|
::close(m_fd);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
} else {
|
||||||
|
#if defined(__APPLE__)
|
||||||
|
m_fd = ::open(m_device.c_str(), O_RDWR | O_NOCTTY | O_NONBLOCK); /*open in block mode under OSX*/
|
||||||
|
#else
|
||||||
|
m_fd = ::open(m_device.c_str(), O_RDWR | O_NOCTTY | O_NDELAY, 0);
|
||||||
|
#endif
|
||||||
|
if (m_fd < 0) {
|
||||||
|
::fprintf(stderr, "Cannot open device - %s" EOL, m_device.c_str());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (::isatty(m_fd) == 0) {
|
||||||
|
::fprintf(stderr, "%s is not a TTY device" EOL, m_device.c_str());
|
||||||
|
::close(m_fd);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
termios termios;
|
||||||
|
if (::tcgetattr(m_fd, &termios) < 0) {
|
||||||
|
::fprintf(stderr, "Cannot get the attributes for %s" EOL, m_device.c_str());
|
||||||
|
::close(m_fd);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
termios.c_iflag &= ~(IGNBRK | BRKINT | IGNPAR | PARMRK | INPCK);
|
||||||
|
termios.c_iflag &= ~(ISTRIP | INLCR | IGNCR | ICRNL);
|
||||||
|
termios.c_iflag &= ~(IXON | IXOFF | IXANY);
|
||||||
|
termios.c_oflag &= ~(OPOST);
|
||||||
|
termios.c_cflag &= ~(CSIZE | CSTOPB | PARENB | CRTSCTS);
|
||||||
|
termios.c_cflag |= (CS8 | CLOCAL | CREAD);
|
||||||
|
termios.c_lflag &= ~(ISIG | ICANON | IEXTEN);
|
||||||
|
termios.c_lflag &= ~(ECHO | ECHOE | ECHOK | ECHONL);
|
||||||
|
#if defined(__APPLE__)
|
||||||
|
termios.c_cc[VMIN] = 1;
|
||||||
|
termios.c_cc[VTIME] = 1;
|
||||||
|
#else
|
||||||
|
termios.c_cc[VMIN] = 0;
|
||||||
|
termios.c_cc[VTIME] = 10;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
switch (m_speed) {
|
||||||
|
case SERIAL_1200:
|
||||||
|
::cfsetospeed(&termios, B1200);
|
||||||
|
::cfsetispeed(&termios, B1200);
|
||||||
|
break;
|
||||||
|
case SERIAL_2400:
|
||||||
|
::cfsetospeed(&termios, B2400);
|
||||||
|
::cfsetispeed(&termios, B2400);
|
||||||
|
break;
|
||||||
|
case SERIAL_4800:
|
||||||
|
::cfsetospeed(&termios, B4800);
|
||||||
|
::cfsetispeed(&termios, B4800);
|
||||||
|
break;
|
||||||
|
case SERIAL_9600:
|
||||||
|
::cfsetospeed(&termios, B9600);
|
||||||
|
::cfsetispeed(&termios, B9600);
|
||||||
|
break;
|
||||||
|
case SERIAL_19200:
|
||||||
|
::cfsetospeed(&termios, B19200);
|
||||||
|
::cfsetispeed(&termios, B19200);
|
||||||
|
break;
|
||||||
|
case SERIAL_38400:
|
||||||
|
::cfsetospeed(&termios, B38400);
|
||||||
|
::cfsetispeed(&termios, B38400);
|
||||||
|
break;
|
||||||
|
case SERIAL_115200:
|
||||||
|
::cfsetospeed(&termios, B115200);
|
||||||
|
::cfsetispeed(&termios, B115200);
|
||||||
|
break;
|
||||||
|
case SERIAL_230400:
|
||||||
|
::cfsetospeed(&termios, B230400);
|
||||||
|
::cfsetispeed(&termios, B230400);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
::fprintf(stderr, "Unsupported serial port speed - %d" EOL, int(m_speed));
|
||||||
|
::close(m_fd);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (::tcsetattr(m_fd, TCSANOW, &termios) < 0) {
|
||||||
|
::fprintf(stderr, "Cannot set the attributes for %s" EOL, m_device.c_str());
|
||||||
|
::close(m_fd);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_assertRTS) {
|
||||||
|
unsigned int y;
|
||||||
|
if (::ioctl(m_fd, TIOCMGET, &y) < 0) {
|
||||||
|
::fprintf(stderr, "Cannot get the control attributes for %s" EOL, m_device.c_str());
|
||||||
|
::close(m_fd);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
y |= TIOCM_RTS;
|
||||||
|
|
||||||
|
if (::ioctl(m_fd, TIOCMSET, &y) < 0) {
|
||||||
|
::fprintf(stderr, "Cannot set the control attributes for %s" EOL, m_device.c_str());
|
||||||
|
::close(m_fd);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(__APPLE__)
|
||||||
|
setNonblock(false);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(__APPLE__)
|
||||||
|
int CSerialController::setNonblock(bool nonblock)
|
||||||
|
{
|
||||||
|
int flag = ::fcntl(m_fd, F_GETFD, 0);
|
||||||
|
|
||||||
|
if (nonblock)
|
||||||
|
flag |= O_NONBLOCK;
|
||||||
|
else
|
||||||
|
flag &= ~O_NONBLOCK;
|
||||||
|
|
||||||
|
return ::fcntl(m_fd, F_SETFL, flag);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int CSerialController::read(unsigned char* buffer, unsigned int length)
|
||||||
|
{
|
||||||
|
assert(buffer != NULL);
|
||||||
|
assert(m_fd != -1);
|
||||||
|
|
||||||
|
if (length == 0U)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
unsigned int offset = 0U;
|
||||||
|
|
||||||
|
while (offset < length) {
|
||||||
|
if (m_device == "/dev/i2c-1"){
|
||||||
|
#if defined(__linux__)
|
||||||
|
ssize_t c = ::read(m_fd, buffer + offset, 1U);
|
||||||
|
if (c < 0) {
|
||||||
|
if (errno != EAGAIN) {
|
||||||
|
::fprintf(stderr, "Error returned from read(), errno=%d" EOL, errno);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (c > 0)
|
||||||
|
offset += c;
|
||||||
|
#endif
|
||||||
|
} else {
|
||||||
|
|
||||||
|
fd_set fds;
|
||||||
|
FD_ZERO(&fds);
|
||||||
|
FD_SET(m_fd, &fds);
|
||||||
|
int n;
|
||||||
|
if (offset == 0U) {
|
||||||
|
struct timeval tv;
|
||||||
|
tv.tv_sec = 0;
|
||||||
|
tv.tv_usec = 0;
|
||||||
|
n = ::select(m_fd + 1, &fds, NULL, NULL, &tv);
|
||||||
|
if (n == 0)
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
n = ::select(m_fd + 1, &fds, NULL, NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n < 0) {
|
||||||
|
::fprintf(stderr, "Error from select(), errno=%d" EOL, errno);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n > 0) {
|
||||||
|
ssize_t len = ::read(m_fd, buffer + offset, length - offset);
|
||||||
|
if (len < 0) {
|
||||||
|
if (errno != EAGAIN) {
|
||||||
|
::fprintf(stderr, "Error from read(), errno=%d" EOL, errno);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (len > 0)
|
||||||
|
offset += len;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CSerialController::canWrite(){
|
||||||
|
#if defined(__APPLE__)
|
||||||
|
fd_set wset;
|
||||||
|
FD_ZERO(&wset);
|
||||||
|
FD_SET(m_fd, &wset);
|
||||||
|
|
||||||
|
struct timeval timeo;
|
||||||
|
timeo.tv_sec = 0;
|
||||||
|
timeo.tv_usec = 0;
|
||||||
|
|
||||||
|
int rc = select(m_fd + 1, NULL, &wset, NULL, &timeo);
|
||||||
|
if (rc >0 && FD_ISSET(m_fd, &wset))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
#else
|
||||||
|
return true;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
int CSerialController::write(const unsigned char* buffer, unsigned int length)
|
||||||
|
{
|
||||||
|
assert(buffer != NULL);
|
||||||
|
assert(m_fd != -1);
|
||||||
|
|
||||||
|
if (length == 0U)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
unsigned int ptr = 0U;
|
||||||
|
while (ptr < length) {
|
||||||
|
ssize_t n = 0U;
|
||||||
|
if (m_device == "/dev/i2c-1"){
|
||||||
|
#if defined(__linux__)
|
||||||
|
n = ::write(m_fd, buffer + ptr, 1U);
|
||||||
|
#endif
|
||||||
|
} else {
|
||||||
|
if (canWrite())
|
||||||
|
n = ::write(m_fd, buffer + ptr, length - ptr);
|
||||||
|
}
|
||||||
|
if (n < 0) {
|
||||||
|
if (errno != EAGAIN) {
|
||||||
|
::fprintf(stderr, "Error returned from write(), errno=%d" EOL, errno);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (n > 0)
|
||||||
|
ptr += n;
|
||||||
|
}
|
||||||
|
|
||||||
|
return length;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSerialController::close()
|
||||||
|
{
|
||||||
|
assert(m_fd != -1);
|
||||||
|
|
||||||
|
::close(m_fd);
|
||||||
|
m_fd = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
78
MMDVMCal/SerialController.h
Executable file
|
@ -0,0 +1,78 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2002-2004,2007-2009,2011-2013,2015-2017 by Jonathan Naylor G4KLX
|
||||||
|
* Copyright (C) 1999-2001 by Thomas Sailor HB9JNX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SerialController_H
|
||||||
|
#define SerialController_H
|
||||||
|
|
||||||
|
#include "SerialPort.h"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <cstdio>
|
||||||
|
|
||||||
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
|
#include <windows.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
enum SERIAL_SPEED {
|
||||||
|
SERIAL_1200 = 1200,
|
||||||
|
SERIAL_2400 = 2400,
|
||||||
|
SERIAL_4800 = 4800,
|
||||||
|
SERIAL_9600 = 9600,
|
||||||
|
SERIAL_19200 = 19200,
|
||||||
|
SERIAL_38400 = 38400,
|
||||||
|
SERIAL_76800 = 76800,
|
||||||
|
SERIAL_115200 = 115200,
|
||||||
|
SERIAL_230400 = 230400
|
||||||
|
};
|
||||||
|
|
||||||
|
class CSerialController : public ISerialPort {
|
||||||
|
public:
|
||||||
|
CSerialController(const std::string& device, SERIAL_SPEED speed, bool assertRTS = false);
|
||||||
|
virtual ~CSerialController();
|
||||||
|
|
||||||
|
virtual bool open();
|
||||||
|
|
||||||
|
virtual int read(unsigned char* buffer, unsigned int length);
|
||||||
|
|
||||||
|
virtual int write(const unsigned char* buffer, unsigned int length);
|
||||||
|
|
||||||
|
virtual void close();
|
||||||
|
|
||||||
|
#if defined(__APPLE__)
|
||||||
|
virtual int setNonblock(bool nonblock);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string m_device;
|
||||||
|
SERIAL_SPEED m_speed;
|
||||||
|
bool m_assertRTS;
|
||||||
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
|
HANDLE m_handle;
|
||||||
|
#else
|
||||||
|
int m_fd;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
|
int readNonblock(unsigned char* buffer, unsigned int length);
|
||||||
|
#else
|
||||||
|
bool canWrite();
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
23
MMDVMCal/SerialPort.cpp
Executable file
|
@ -0,0 +1,23 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2016 by Jonathan Naylor G4KLX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "SerialPort.h"
|
||||||
|
|
||||||
|
ISerialPort::~ISerialPort()
|
||||||
|
{
|
||||||
|
}
|
37
MMDVMCal/SerialPort.h
Executable file
|
@ -0,0 +1,37 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2016 by Jonathan Naylor G4KLX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef SerialPort_H
|
||||||
|
#define SerialPort_H
|
||||||
|
|
||||||
|
class ISerialPort {
|
||||||
|
public:
|
||||||
|
virtual ~ISerialPort() = 0;
|
||||||
|
|
||||||
|
virtual bool open() = 0;
|
||||||
|
|
||||||
|
virtual int read(unsigned char* buffer, unsigned int length) = 0;
|
||||||
|
|
||||||
|
virtual int write(const unsigned char* buffer, unsigned int length) = 0;
|
||||||
|
|
||||||
|
virtual void close() = 0;
|
||||||
|
|
||||||
|
private:
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
80
MMDVMCal/Utils.cpp
Executable file
|
@ -0,0 +1,80 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2009,2014-2016 Jonathan Naylor, G4KLX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; version 2 of the License.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "Utils.h"
|
||||||
|
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
|
void CUtils::dump(const std::string& title, const unsigned char* data, unsigned int length)
|
||||||
|
{
|
||||||
|
assert(data != NULL);
|
||||||
|
|
||||||
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
|
::fprintf(stdout, "%s\n", title.c_str());
|
||||||
|
#else
|
||||||
|
::fprintf(stdout, "%s\r\n", title.c_str());
|
||||||
|
#endif
|
||||||
|
|
||||||
|
unsigned int offset = 0U;
|
||||||
|
|
||||||
|
while (length > 0U) {
|
||||||
|
::fprintf(stdout, "%04X: ", offset);
|
||||||
|
|
||||||
|
unsigned int bytes = (length > 16U) ? 16U : length;
|
||||||
|
|
||||||
|
for (unsigned i = 0U; i < bytes; i++)
|
||||||
|
::fprintf(stdout, "%02X ", data[offset + i]);
|
||||||
|
|
||||||
|
for (unsigned int i = bytes; i < 16U; i++)
|
||||||
|
::fprintf(stdout, " ");
|
||||||
|
|
||||||
|
::fprintf(stdout, " *");
|
||||||
|
|
||||||
|
for (unsigned i = 0U; i < bytes; i++) {
|
||||||
|
unsigned char c = data[offset + i];
|
||||||
|
|
||||||
|
if (::isprint(c))
|
||||||
|
::fprintf(stdout, "%c", c);
|
||||||
|
else
|
||||||
|
::fprintf(stdout, ".");
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(_WIN32) || defined(_WIN64)
|
||||||
|
::fprintf(stdout, "*\n");
|
||||||
|
#else
|
||||||
|
::fprintf(stdout, "*\r\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
offset += 16U;
|
||||||
|
|
||||||
|
if (length >= 16U)
|
||||||
|
length -= 16U;
|
||||||
|
else
|
||||||
|
length = 0U;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CUtils::bitsToByteBE(const bool* bits, unsigned char& byte)
|
||||||
|
{
|
||||||
|
assert(bits != NULL);
|
||||||
|
|
||||||
|
byte = bits[0U] ? 0x80U : 0x00U;
|
||||||
|
byte |= bits[1U] ? 0x40U : 0x00U;
|
||||||
|
byte |= bits[2U] ? 0x20U : 0x00U;
|
||||||
|
byte |= bits[3U] ? 0x10U : 0x00U;
|
||||||
|
byte |= bits[4U] ? 0x08U : 0x00U;
|
||||||
|
byte |= bits[5U] ? 0x04U : 0x00U;
|
||||||
|
byte |= bits[6U] ? 0x02U : 0x00U;
|
||||||
|
byte |= bits[7U] ? 0x01U : 0x00U;
|
||||||
|
}
|
28
MMDVMCal/Utils.h
Executable file
|
@ -0,0 +1,28 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2009,2014,2015 by Jonathan Naylor, G4KLX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; version 2 of the License.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef Utils_H
|
||||||
|
#define Utils_H
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
class CUtils {
|
||||||
|
public:
|
||||||
|
static void dump(const std::string& title, const unsigned char* data, unsigned int length);
|
||||||
|
|
||||||
|
static void bitsToByteBE(const bool* bits, unsigned char& byte);
|
||||||
|
|
||||||
|
private:
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
24
MMDVMCal/Version.h
Executable file
|
@ -0,0 +1,24 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2018,2019,2020 by Jonathan Naylor G4KLX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(VERSION_H)
|
||||||
|
#define VERSION_H
|
||||||
|
|
||||||
|
#define VERSION "MMDVMCal 20200506"
|
||||||
|
|
||||||
|
#endif
|
141
MMDVMCal/YSFConvolution.cpp
Executable file
|
@ -0,0 +1,141 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2009-2016 by Jonathan Naylor G4KLX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "YSFConvolution.h"
|
||||||
|
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cassert>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
const unsigned char BIT_MASK_TABLE[] = {0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U};
|
||||||
|
|
||||||
|
#define WRITE_BIT1(p,i,b) p[(i)>>3] = (b) ? (p[(i)>>3] | BIT_MASK_TABLE[(i)&7]) : (p[(i)>>3] & ~BIT_MASK_TABLE[(i)&7])
|
||||||
|
#define READ_BIT1(p,i) (p[(i)>>3] & BIT_MASK_TABLE[(i)&7])
|
||||||
|
|
||||||
|
const uint8_t BRANCH_TABLE1[] = {0U, 0U, 0U, 0U, 1U, 1U, 1U, 1U};
|
||||||
|
const uint8_t BRANCH_TABLE2[] = {0U, 1U, 1U, 0U, 0U, 1U, 1U, 0U};
|
||||||
|
|
||||||
|
const unsigned int NUM_OF_STATES_D2 = 8U;
|
||||||
|
const unsigned int NUM_OF_STATES = 16U;
|
||||||
|
const uint32_t M = 2U;
|
||||||
|
const unsigned int K = 5U;
|
||||||
|
|
||||||
|
CYSFConvolution::CYSFConvolution() :
|
||||||
|
m_metrics1(NULL),
|
||||||
|
m_metrics2(NULL),
|
||||||
|
m_oldMetrics(NULL),
|
||||||
|
m_newMetrics(NULL),
|
||||||
|
m_decisions(NULL),
|
||||||
|
m_dp(NULL)
|
||||||
|
{
|
||||||
|
m_metrics1 = new uint16_t[16U];
|
||||||
|
m_metrics2 = new uint16_t[16U];
|
||||||
|
m_decisions = new uint64_t[180U];
|
||||||
|
}
|
||||||
|
|
||||||
|
CYSFConvolution::~CYSFConvolution()
|
||||||
|
{
|
||||||
|
delete[] m_metrics1;
|
||||||
|
delete[] m_metrics2;
|
||||||
|
delete[] m_decisions;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CYSFConvolution::start()
|
||||||
|
{
|
||||||
|
::memset(m_metrics1, 0x00U, NUM_OF_STATES * sizeof(uint16_t));
|
||||||
|
::memset(m_metrics2, 0x00U, NUM_OF_STATES * sizeof(uint16_t));
|
||||||
|
|
||||||
|
m_oldMetrics = m_metrics1;
|
||||||
|
m_newMetrics = m_metrics2;
|
||||||
|
m_dp = m_decisions;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CYSFConvolution::decode(uint8_t s0, uint8_t s1)
|
||||||
|
{
|
||||||
|
*m_dp = 0U;
|
||||||
|
|
||||||
|
for (uint8_t i = 0U; i < NUM_OF_STATES_D2; i++) {
|
||||||
|
uint8_t j = i * 2U;
|
||||||
|
|
||||||
|
uint16_t metric = (BRANCH_TABLE1[i] ^ s0) + (BRANCH_TABLE2[i] ^ s1);
|
||||||
|
|
||||||
|
uint16_t m0 = m_oldMetrics[i] + metric;
|
||||||
|
uint16_t m1 = m_oldMetrics[i + NUM_OF_STATES_D2] + (M - metric);
|
||||||
|
uint8_t decision0 = (m0 >= m1) ? 1U : 0U;
|
||||||
|
m_newMetrics[j + 0U] = decision0 != 0U ? m1 : m0;
|
||||||
|
|
||||||
|
m0 = m_oldMetrics[i] + (M - metric);
|
||||||
|
m1 = m_oldMetrics[i + NUM_OF_STATES_D2] + metric;
|
||||||
|
uint8_t decision1 = (m0 >= m1) ? 1U : 0U;
|
||||||
|
m_newMetrics[j + 1U] = decision1 != 0U ? m1 : m0;
|
||||||
|
|
||||||
|
*m_dp |= (uint64_t(decision1) << (j + 1U)) | (uint64_t(decision0) << (j + 0U));
|
||||||
|
}
|
||||||
|
|
||||||
|
++m_dp;
|
||||||
|
|
||||||
|
assert((m_dp - m_decisions) <= 180);
|
||||||
|
|
||||||
|
uint16_t* tmp = m_oldMetrics;
|
||||||
|
m_oldMetrics = m_newMetrics;
|
||||||
|
m_newMetrics = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CYSFConvolution::chainback(unsigned char* out, unsigned int nBits)
|
||||||
|
{
|
||||||
|
assert(out != NULL);
|
||||||
|
|
||||||
|
uint32_t state = 0U;
|
||||||
|
|
||||||
|
while (nBits-- > 0) {
|
||||||
|
--m_dp;
|
||||||
|
|
||||||
|
uint32_t i = state >> (9 - K);
|
||||||
|
uint8_t bit = uint8_t(*m_dp >> i) & 1;
|
||||||
|
state = (bit << 7) | (state >> 1);
|
||||||
|
|
||||||
|
WRITE_BIT1(out, nBits, bit != 0U);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CYSFConvolution::encode(const unsigned char* in, unsigned char* out, unsigned int nBits) const
|
||||||
|
{
|
||||||
|
assert(in != NULL);
|
||||||
|
assert(out != NULL);
|
||||||
|
assert(nBits > 0U);
|
||||||
|
|
||||||
|
uint8_t d1 = 0U, d2 = 0U, d3 = 0U, d4 = 0U;
|
||||||
|
uint32_t k = 0U;
|
||||||
|
for (unsigned int i = 0U; i < nBits; i++) {
|
||||||
|
uint8_t d = READ_BIT1(in, i) ? 1U : 0U;
|
||||||
|
|
||||||
|
uint8_t g1 = (d + d3 + d4) & 1;
|
||||||
|
uint8_t g2 = (d + d1 + d2 + d4) & 1;
|
||||||
|
|
||||||
|
d4 = d3;
|
||||||
|
d3 = d2;
|
||||||
|
d2 = d1;
|
||||||
|
d1 = d;
|
||||||
|
|
||||||
|
WRITE_BIT1(out, k, g1 != 0U);
|
||||||
|
k++;
|
||||||
|
|
||||||
|
WRITE_BIT1(out, k, g2 != 0U);
|
||||||
|
k++;
|
||||||
|
}
|
||||||
|
}
|
45
MMDVMCal/YSFConvolution.h
Executable file
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2015,2016 by Jonathan Naylor G4KLX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(YSFConvolution_H)
|
||||||
|
#define YSFConvolution_H
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
class CYSFConvolution {
|
||||||
|
public:
|
||||||
|
CYSFConvolution();
|
||||||
|
~CYSFConvolution();
|
||||||
|
|
||||||
|
void start();
|
||||||
|
void decode(uint8_t s0, uint8_t s1);
|
||||||
|
void chainback(unsigned char* out, unsigned int nBits);
|
||||||
|
|
||||||
|
void encode(const unsigned char* in, unsigned char* out, unsigned int nBits) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
uint16_t* m_metrics1;
|
||||||
|
uint16_t* m_metrics2;
|
||||||
|
uint16_t* m_oldMetrics;
|
||||||
|
uint16_t* m_newMetrics;
|
||||||
|
uint64_t* m_decisions;
|
||||||
|
uint64_t* m_dp;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
53
MMDVMCal/YSFDefines.h
Executable file
|
@ -0,0 +1,53 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2015,2016,2017 by Jonathan Naylor G4KLX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(YSFDefines_H)
|
||||||
|
#define YSFDefines_H
|
||||||
|
|
||||||
|
const unsigned int YSF_FRAME_LENGTH_BYTES = 120U;
|
||||||
|
|
||||||
|
const unsigned char YSF_SYNC_BYTES[] = {0xD4U, 0x71U, 0xC9U, 0x63U, 0x4DU};
|
||||||
|
const unsigned int YSF_SYNC_LENGTH_BYTES = 5U;
|
||||||
|
|
||||||
|
const unsigned int YSF_FICH_LENGTH_BYTES = 25U;
|
||||||
|
|
||||||
|
const unsigned char YSF_SYNC_OK = 0x01U;
|
||||||
|
|
||||||
|
const unsigned int YSF_CALLSIGN_LENGTH = 10U;
|
||||||
|
|
||||||
|
const unsigned int YSF_FRAME_TIME = 100U;
|
||||||
|
|
||||||
|
const unsigned char YSF_FI_HEADER = 0x00U;
|
||||||
|
const unsigned char YSF_FI_COMMUNICATIONS = 0x01U;
|
||||||
|
const unsigned char YSF_FI_TERMINATOR = 0x02U;
|
||||||
|
const unsigned char YSF_FI_TEST = 0x03U;
|
||||||
|
|
||||||
|
const unsigned char YSF_DT_VD_MODE1 = 0x00U;
|
||||||
|
const unsigned char YSF_DT_DATA_FR_MODE = 0x01U;
|
||||||
|
const unsigned char YSF_DT_VD_MODE2 = 0x02U;
|
||||||
|
const unsigned char YSF_DT_VOICE_FR_MODE = 0x03U;
|
||||||
|
|
||||||
|
const unsigned char YSF_CM_GROUP1 = 0x00U;
|
||||||
|
const unsigned char YSF_CM_GROUP2 = 0x01U;
|
||||||
|
const unsigned char YSF_CM_INDIVIDUAL = 0x03U;
|
||||||
|
|
||||||
|
const unsigned char YSF_MR_DIRECT = 0x00U;
|
||||||
|
const unsigned char YSF_MR_NOT_BUSY = 0x01U;
|
||||||
|
const unsigned char YSF_MR_BUSY = 0x02U;
|
||||||
|
|
||||||
|
#endif
|
286
MMDVMCal/YSFFICH.cpp
Executable file
|
@ -0,0 +1,286 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2016,2017 by Jonathan Naylor G4KLX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "YSFConvolution.h"
|
||||||
|
#include "YSFDefines.h"
|
||||||
|
#include "Golay24128.h"
|
||||||
|
#include "YSFFICH.h"
|
||||||
|
#include "CRC.h"
|
||||||
|
|
||||||
|
#include <cstdio>
|
||||||
|
#include <cassert>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
const unsigned char BIT_MASK_TABLE[] = {0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U};
|
||||||
|
|
||||||
|
#define WRITE_BIT1(p,i,b) p[(i)>>3] = (b) ? (p[(i)>>3] | BIT_MASK_TABLE[(i)&7]) : (p[(i)>>3] & ~BIT_MASK_TABLE[(i)&7])
|
||||||
|
#define READ_BIT1(p,i) (p[(i)>>3] & BIT_MASK_TABLE[(i)&7])
|
||||||
|
|
||||||
|
const unsigned int INTERLEAVE_TABLE[] = {
|
||||||
|
0U, 40U, 80U, 120U, 160U,
|
||||||
|
2U, 42U, 82U, 122U, 162U,
|
||||||
|
4U, 44U, 84U, 124U, 164U,
|
||||||
|
6U, 46U, 86U, 126U, 166U,
|
||||||
|
8U, 48U, 88U, 128U, 168U,
|
||||||
|
10U, 50U, 90U, 130U, 170U,
|
||||||
|
12U, 52U, 92U, 132U, 172U,
|
||||||
|
14U, 54U, 94U, 134U, 174U,
|
||||||
|
16U, 56U, 96U, 136U, 176U,
|
||||||
|
18U, 58U, 98U, 138U, 178U,
|
||||||
|
20U, 60U, 100U, 140U, 180U,
|
||||||
|
22U, 62U, 102U, 142U, 182U,
|
||||||
|
24U, 64U, 104U, 144U, 184U,
|
||||||
|
26U, 66U, 106U, 146U, 186U,
|
||||||
|
28U, 68U, 108U, 148U, 188U,
|
||||||
|
30U, 70U, 110U, 150U, 190U,
|
||||||
|
32U, 72U, 112U, 152U, 192U,
|
||||||
|
34U, 74U, 114U, 154U, 194U,
|
||||||
|
36U, 76U, 116U, 156U, 196U,
|
||||||
|
38U, 78U, 118U, 158U, 198U};
|
||||||
|
|
||||||
|
CYSFFICH::CYSFFICH(const CYSFFICH& fich) :
|
||||||
|
m_fich(NULL)
|
||||||
|
{
|
||||||
|
m_fich = new unsigned char[6U];
|
||||||
|
|
||||||
|
::memcpy(m_fich, fich.m_fich, 6U);
|
||||||
|
}
|
||||||
|
|
||||||
|
CYSFFICH::CYSFFICH() :
|
||||||
|
m_fich(NULL)
|
||||||
|
{
|
||||||
|
m_fich = new unsigned char[6U];
|
||||||
|
|
||||||
|
memset(m_fich, 0x00U, 6U);
|
||||||
|
}
|
||||||
|
|
||||||
|
CYSFFICH::~CYSFFICH()
|
||||||
|
{
|
||||||
|
delete[] m_fich;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CYSFFICH::decode(const unsigned char* bytes)
|
||||||
|
{
|
||||||
|
assert(bytes != NULL);
|
||||||
|
|
||||||
|
// Skip the sync bytes
|
||||||
|
bytes += YSF_SYNC_LENGTH_BYTES;
|
||||||
|
|
||||||
|
CYSFConvolution viterbi;
|
||||||
|
viterbi.start();
|
||||||
|
|
||||||
|
// Deinterleave the FICH and send bits to the Viterbi decoder
|
||||||
|
for (unsigned int i = 0U; i < 100U; i++) {
|
||||||
|
unsigned int n = INTERLEAVE_TABLE[i];
|
||||||
|
uint8_t s0 = READ_BIT1(bytes, n) ? 1U : 0U;
|
||||||
|
|
||||||
|
n++;
|
||||||
|
uint8_t s1 = READ_BIT1(bytes, n) ? 1U : 0U;
|
||||||
|
|
||||||
|
viterbi.decode(s0, s1);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char output[13U];
|
||||||
|
viterbi.chainback(output, 96U);
|
||||||
|
|
||||||
|
unsigned int b0 = CGolay24128::decode24128(output + 0U);
|
||||||
|
unsigned int b1 = CGolay24128::decode24128(output + 3U);
|
||||||
|
unsigned int b2 = CGolay24128::decode24128(output + 6U);
|
||||||
|
unsigned int b3 = CGolay24128::decode24128(output + 9U);
|
||||||
|
|
||||||
|
m_fich[0U] = (b0 >> 4) & 0xFFU;
|
||||||
|
m_fich[1U] = ((b0 << 4) & 0xF0U) | ((b1 >> 8) & 0x0FU);
|
||||||
|
m_fich[2U] = (b1 >> 0) & 0xFFU;
|
||||||
|
m_fich[3U] = (b2 >> 4) & 0xFFU;
|
||||||
|
m_fich[4U] = ((b2 << 4) & 0xF0U) | ((b3 >> 8) & 0x0FU);
|
||||||
|
m_fich[5U] = (b3 >> 0) & 0xFFU;
|
||||||
|
|
||||||
|
return CCRC::checkCCITT162(m_fich, 6U);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CYSFFICH::encode(unsigned char* bytes)
|
||||||
|
{
|
||||||
|
assert(bytes != NULL);
|
||||||
|
|
||||||
|
// Skip the sync bytes
|
||||||
|
bytes += YSF_SYNC_LENGTH_BYTES;
|
||||||
|
|
||||||
|
CCRC::addCCITT162(m_fich, 6U);
|
||||||
|
|
||||||
|
unsigned int b0 = ((m_fich[0U] << 4) & 0xFF0U) | ((m_fich[1U] >> 4) & 0x00FU);
|
||||||
|
unsigned int b1 = ((m_fich[1U] << 8) & 0xF00U) | ((m_fich[2U] >> 0) & 0x0FFU);
|
||||||
|
unsigned int b2 = ((m_fich[3U] << 4) & 0xFF0U) | ((m_fich[4U] >> 4) & 0x00FU);
|
||||||
|
unsigned int b3 = ((m_fich[4U] << 8) & 0xF00U) | ((m_fich[5U] >> 0) & 0x0FFU);
|
||||||
|
|
||||||
|
unsigned int c0 = CGolay24128::encode24128(b0);
|
||||||
|
unsigned int c1 = CGolay24128::encode24128(b1);
|
||||||
|
unsigned int c2 = CGolay24128::encode24128(b2);
|
||||||
|
unsigned int c3 = CGolay24128::encode24128(b3);
|
||||||
|
|
||||||
|
unsigned char conv[13U];
|
||||||
|
conv[0U] = (c0 >> 16) & 0xFFU;
|
||||||
|
conv[1U] = (c0 >> 8) & 0xFFU;
|
||||||
|
conv[2U] = (c0 >> 0) & 0xFFU;
|
||||||
|
conv[3U] = (c1 >> 16) & 0xFFU;
|
||||||
|
conv[4U] = (c1 >> 8) & 0xFFU;
|
||||||
|
conv[5U] = (c1 >> 0) & 0xFFU;
|
||||||
|
conv[6U] = (c2 >> 16) & 0xFFU;
|
||||||
|
conv[7U] = (c2 >> 8) & 0xFFU;
|
||||||
|
conv[8U] = (c2 >> 0) & 0xFFU;
|
||||||
|
conv[9U] = (c3 >> 16) & 0xFFU;
|
||||||
|
conv[10U] = (c3 >> 8) & 0xFFU;
|
||||||
|
conv[11U] = (c3 >> 0) & 0xFFU;
|
||||||
|
conv[12U] = 0x00U;
|
||||||
|
|
||||||
|
CYSFConvolution convolution;
|
||||||
|
unsigned char convolved[25U];
|
||||||
|
convolution.encode(conv, convolved, 100U);
|
||||||
|
|
||||||
|
unsigned int j = 0U;
|
||||||
|
for (unsigned int i = 0U; i < 100U; i++) {
|
||||||
|
unsigned int n = INTERLEAVE_TABLE[i];
|
||||||
|
|
||||||
|
bool s0 = READ_BIT1(convolved, j) != 0U;
|
||||||
|
j++;
|
||||||
|
|
||||||
|
bool s1 = READ_BIT1(convolved, j) != 0U;
|
||||||
|
j++;
|
||||||
|
|
||||||
|
WRITE_BIT1(bytes, n, s0);
|
||||||
|
|
||||||
|
n++;
|
||||||
|
WRITE_BIT1(bytes, n, s1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char CYSFFICH::getFI() const
|
||||||
|
{
|
||||||
|
return (m_fich[0U] >> 6) & 0x03U;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char CYSFFICH::getCM() const
|
||||||
|
{
|
||||||
|
return (m_fich[0U] >> 2) & 0x03U;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char CYSFFICH::getBN() const
|
||||||
|
{
|
||||||
|
return m_fich[0U] & 0x03U;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char CYSFFICH::getBT() const
|
||||||
|
{
|
||||||
|
return (m_fich[1U] >> 6) & 0x03U;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char CYSFFICH::getFN() const
|
||||||
|
{
|
||||||
|
return (m_fich[1U] >> 3) & 0x07U;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char CYSFFICH::getFT() const
|
||||||
|
{
|
||||||
|
return m_fich[1U] & 0x07U;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char CYSFFICH::getDT() const
|
||||||
|
{
|
||||||
|
return m_fich[2U] & 0x03U;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char CYSFFICH::getMR() const
|
||||||
|
{
|
||||||
|
return (m_fich[2U] >> 3) & 0x03U;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CYSFFICH::getDev() const
|
||||||
|
{
|
||||||
|
return (m_fich[2U] & 0x40U) == 0x40U;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CYSFFICH::getSQL() const
|
||||||
|
{
|
||||||
|
return (m_fich[3U] & 0x80U) == 0x80U;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char CYSFFICH::getSQ() const
|
||||||
|
{
|
||||||
|
return m_fich[3U] & 0x7FU;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CYSFFICH::setFI(unsigned char fi)
|
||||||
|
{
|
||||||
|
m_fich[0U] &= 0x3FU;
|
||||||
|
m_fich[0U] |= (fi << 6) & 0xC0U;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CYSFFICH::setFN(unsigned char fn)
|
||||||
|
{
|
||||||
|
m_fich[1U] &= 0xC7U;
|
||||||
|
m_fich[1U] |= (fn << 3) & 0x38U;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CYSFFICH::setFT(unsigned char ft)
|
||||||
|
{
|
||||||
|
m_fich[1U] &= 0xF8U;
|
||||||
|
m_fich[1U] |= ft & 0x07U;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CYSFFICH::setMR(unsigned char mr)
|
||||||
|
{
|
||||||
|
m_fich[2U] &= 0xC7U;
|
||||||
|
m_fich[2U] |= (mr << 3) & 0x38U;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CYSFFICH::setVoIP(bool on)
|
||||||
|
{
|
||||||
|
if (on)
|
||||||
|
m_fich[2U] |= 0x04U;
|
||||||
|
else
|
||||||
|
m_fich[2U] &= 0xFBU;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CYSFFICH::setDev(bool on)
|
||||||
|
{
|
||||||
|
if (on)
|
||||||
|
m_fich[2U] |= 0x40U;
|
||||||
|
else
|
||||||
|
m_fich[2U] &= 0xBFU;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CYSFFICH::setSQL(bool on)
|
||||||
|
{
|
||||||
|
if (on)
|
||||||
|
m_fich[3U] |= 0x80U;
|
||||||
|
else
|
||||||
|
m_fich[3U] &= 0x7FU;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CYSFFICH::setSQ(unsigned char sq)
|
||||||
|
{
|
||||||
|
m_fich[3U] &= 0x80U;
|
||||||
|
m_fich[3U] |= sq & 0x7FU;
|
||||||
|
}
|
||||||
|
|
||||||
|
CYSFFICH& CYSFFICH::operator=(const CYSFFICH& fich)
|
||||||
|
{
|
||||||
|
if (&fich != this)
|
||||||
|
::memcpy(m_fich, fich.m_fich, 6U);
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
59
MMDVMCal/YSFFICH.h
Executable file
|
@ -0,0 +1,59 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2016,2017 by Jonathan Naylor G4KLX
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if !defined(YSFFICH_H)
|
||||||
|
#define YSFFICH_H
|
||||||
|
|
||||||
|
class CYSFFICH {
|
||||||
|
public:
|
||||||
|
CYSFFICH(const CYSFFICH& fich);
|
||||||
|
CYSFFICH();
|
||||||
|
~CYSFFICH();
|
||||||
|
|
||||||
|
bool decode(const unsigned char* bytes);
|
||||||
|
|
||||||
|
void encode(unsigned char* bytes);
|
||||||
|
|
||||||
|
unsigned char getFI() const;
|
||||||
|
unsigned char getCM() const;
|
||||||
|
unsigned char getBN() const;
|
||||||
|
unsigned char getBT() const;
|
||||||
|
unsigned char getFN() const;
|
||||||
|
unsigned char getFT() const;
|
||||||
|
unsigned char getDT() const;
|
||||||
|
unsigned char getMR() const;
|
||||||
|
bool getDev() const;
|
||||||
|
bool getSQL() const;
|
||||||
|
unsigned char getSQ() const;
|
||||||
|
|
||||||
|
void setFI(unsigned char fi);
|
||||||
|
void setFN(unsigned char fn);
|
||||||
|
void setFT(unsigned char ft);
|
||||||
|
void setMR(unsigned char mr);
|
||||||
|
void setVoIP(bool set);
|
||||||
|
void setDev(bool set);
|
||||||
|
void setSQL(bool set);
|
||||||
|
void setSQ(unsigned char sq);
|
||||||
|
|
||||||
|
CYSFFICH& operator=(const CYSFFICH& fich);
|
||||||
|
|
||||||
|
private:
|
||||||
|
unsigned char* m_fich;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
178
hd44780/I2C_LCD_driver.py
Executable file
|
@ -0,0 +1,178 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Original code found at:
|
||||||
|
# https://gist.github.com/DenisFromHR/cc863375a6e19dce359d
|
||||||
|
|
||||||
|
"""
|
||||||
|
Compiled, mashed and generally mutilated 2014-2015 by Denis Pleic
|
||||||
|
Made available under GNU GENERAL PUBLIC LICENSE
|
||||||
|
|
||||||
|
# Modified Python I2C library for Raspberry Pi
|
||||||
|
# as found on http://www.recantha.co.uk/blog/?p=4849
|
||||||
|
# Joined existing 'i2c_lib.py' and 'lcddriver.py' into a single library
|
||||||
|
# added bits and pieces from various sources
|
||||||
|
# By DenisFromHR (Denis Pleic)
|
||||||
|
# 2015-02-10, ver 0.1
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
# i2c bus (0 -- original Pi, 1 -- Rev 2 Pi)
|
||||||
|
I2CBUS = 0
|
||||||
|
|
||||||
|
# LCD Address
|
||||||
|
ADDRESS = 0x27
|
||||||
|
|
||||||
|
import smbus
|
||||||
|
from time import sleep
|
||||||
|
|
||||||
|
class i2c_device:
|
||||||
|
def __init__(self, addr, port=I2CBUS):
|
||||||
|
self.addr = addr
|
||||||
|
self.bus = smbus.SMBus(port)
|
||||||
|
|
||||||
|
# Write a single command
|
||||||
|
def write_cmd(self, cmd):
|
||||||
|
self.bus.write_byte(self.addr, cmd)
|
||||||
|
sleep(0.0001)
|
||||||
|
|
||||||
|
# Write a command and argument
|
||||||
|
def write_cmd_arg(self, cmd, data):
|
||||||
|
self.bus.write_byte_data(self.addr, cmd, data)
|
||||||
|
sleep(0.0001)
|
||||||
|
|
||||||
|
# Write a block of data
|
||||||
|
def write_block_data(self, cmd, data):
|
||||||
|
self.bus.write_block_data(self.addr, cmd, data)
|
||||||
|
sleep(0.0001)
|
||||||
|
|
||||||
|
# Read a single byte
|
||||||
|
def read(self):
|
||||||
|
return self.bus.read_byte(self.addr)
|
||||||
|
|
||||||
|
# Read
|
||||||
|
def read_data(self, cmd):
|
||||||
|
return self.bus.read_byte_data(self.addr, cmd)
|
||||||
|
|
||||||
|
# Read a block of data
|
||||||
|
def read_block_data(self, cmd):
|
||||||
|
return self.bus.read_block_data(self.addr, cmd)
|
||||||
|
|
||||||
|
|
||||||
|
# commands
|
||||||
|
LCD_CLEARDISPLAY = 0x01
|
||||||
|
LCD_RETURNHOME = 0x02
|
||||||
|
LCD_ENTRYMODESET = 0x04
|
||||||
|
LCD_DISPLAYCONTROL = 0x08
|
||||||
|
LCD_CURSORSHIFT = 0x10
|
||||||
|
LCD_FUNCTIONSET = 0x20
|
||||||
|
LCD_SETCGRAMADDR = 0x40
|
||||||
|
LCD_SETDDRAMADDR = 0x80
|
||||||
|
|
||||||
|
# flags for display entry mode
|
||||||
|
LCD_ENTRYRIGHT = 0x00
|
||||||
|
LCD_ENTRYLEFT = 0x02
|
||||||
|
LCD_ENTRYSHIFTINCREMENT = 0x01
|
||||||
|
LCD_ENTRYSHIFTDECREMENT = 0x00
|
||||||
|
|
||||||
|
# flags for display on/off control
|
||||||
|
LCD_DISPLAYON = 0x04
|
||||||
|
LCD_DISPLAYOFF = 0x00
|
||||||
|
LCD_CURSORON = 0x02
|
||||||
|
LCD_CURSOROFF = 0x00
|
||||||
|
LCD_BLINKON = 0x01
|
||||||
|
LCD_BLINKOFF = 0x00
|
||||||
|
|
||||||
|
# flags for display/cursor shift
|
||||||
|
LCD_DISPLAYMOVE = 0x08
|
||||||
|
LCD_CURSORMOVE = 0x00
|
||||||
|
LCD_MOVERIGHT = 0x04
|
||||||
|
LCD_MOVELEFT = 0x00
|
||||||
|
|
||||||
|
# flags for function set
|
||||||
|
LCD_8BITMODE = 0x10
|
||||||
|
LCD_4BITMODE = 0x00
|
||||||
|
LCD_2LINE = 0x08
|
||||||
|
LCD_1LINE = 0x00
|
||||||
|
LCD_5x10DOTS = 0x04
|
||||||
|
LCD_5x8DOTS = 0x00
|
||||||
|
|
||||||
|
# flags for backlight control
|
||||||
|
LCD_BACKLIGHT = 0x08
|
||||||
|
LCD_NOBACKLIGHT = 0x00
|
||||||
|
|
||||||
|
En = 0b00000100 # Enable bit
|
||||||
|
Rw = 0b00000010 # Read/Write bit
|
||||||
|
Rs = 0b00000001 # Register select bit
|
||||||
|
|
||||||
|
class lcd:
|
||||||
|
#initializes objects and lcd
|
||||||
|
def __init__(self):
|
||||||
|
self.lcd_device = i2c_device(ADDRESS)
|
||||||
|
|
||||||
|
self.lcd_write(0x03)
|
||||||
|
self.lcd_write(0x03)
|
||||||
|
self.lcd_write(0x03)
|
||||||
|
self.lcd_write(0x02)
|
||||||
|
|
||||||
|
self.lcd_write(LCD_FUNCTIONSET | LCD_2LINE | LCD_5x8DOTS | LCD_4BITMODE)
|
||||||
|
self.lcd_write(LCD_DISPLAYCONTROL | LCD_DISPLAYON)
|
||||||
|
self.lcd_write(LCD_CLEARDISPLAY)
|
||||||
|
self.lcd_write(LCD_ENTRYMODESET | LCD_ENTRYLEFT)
|
||||||
|
sleep(0.2)
|
||||||
|
|
||||||
|
|
||||||
|
# clocks EN to latch command
|
||||||
|
def lcd_strobe(self, data):
|
||||||
|
self.lcd_device.write_cmd(data | En | LCD_BACKLIGHT)
|
||||||
|
sleep(.0005)
|
||||||
|
self.lcd_device.write_cmd(((data & ~En) | LCD_BACKLIGHT))
|
||||||
|
sleep(.0001)
|
||||||
|
|
||||||
|
def lcd_write_four_bits(self, data):
|
||||||
|
self.lcd_device.write_cmd(data | LCD_BACKLIGHT)
|
||||||
|
self.lcd_strobe(data)
|
||||||
|
|
||||||
|
# write a command to lcd
|
||||||
|
def lcd_write(self, cmd, mode=0):
|
||||||
|
self.lcd_write_four_bits(mode | (cmd & 0xF0))
|
||||||
|
self.lcd_write_four_bits(mode | ((cmd << 4) & 0xF0))
|
||||||
|
|
||||||
|
# write a character to lcd (or character rom) 0x09: backlight | RS=DR<
|
||||||
|
# works!
|
||||||
|
def lcd_write_char(self, charvalue, mode=1):
|
||||||
|
self.lcd_write_four_bits(mode | (charvalue & 0xF0))
|
||||||
|
self.lcd_write_four_bits(mode | ((charvalue << 4) & 0xF0))
|
||||||
|
|
||||||
|
# put string function with optional char positioning
|
||||||
|
def lcd_display_string(self, string, line=1, pos=0):
|
||||||
|
if line == 1:
|
||||||
|
pos_new = pos
|
||||||
|
elif line == 2:
|
||||||
|
pos_new = 0x40 + pos
|
||||||
|
elif line == 3:
|
||||||
|
pos_new = 0x14 + pos
|
||||||
|
elif line == 4:
|
||||||
|
pos_new = 0x54 + pos
|
||||||
|
|
||||||
|
self.lcd_write(0x80 + pos_new)
|
||||||
|
|
||||||
|
for char in string:
|
||||||
|
self.lcd_write(ord(char), Rs)
|
||||||
|
|
||||||
|
# clear lcd and set to home
|
||||||
|
def lcd_clear(self):
|
||||||
|
self.lcd_write(LCD_CLEARDISPLAY)
|
||||||
|
self.lcd_write(LCD_RETURNHOME)
|
||||||
|
|
||||||
|
# define backlight on/off (lcd.backlight(1); off= lcd.backlight(0)
|
||||||
|
def backlight(self, state): # for state, 1 = on, 0 = off
|
||||||
|
if state == 1:
|
||||||
|
self.lcd_device.write_cmd(LCD_BACKLIGHT)
|
||||||
|
elif state == 0:
|
||||||
|
self.lcd_device.write_cmd(LCD_NOBACKLIGHT)
|
||||||
|
|
||||||
|
# add custom characters (0 - 7)
|
||||||
|
def lcd_load_custom_chars(self, fontdata):
|
||||||
|
self.lcd_write(0x40);
|
||||||
|
for char in fontdata:
|
||||||
|
for line in char:
|
||||||
|
self.lcd_write_char(line)
|
BIN
hd44780/I2C_LCD_driver.pyc
Executable file
120
hd44780/hd44780.py
Executable file
|
@ -0,0 +1,120 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: UTF-8 -*-
|
||||||
|
#(c) Xavier 2020
|
||||||
|
import os
|
||||||
|
import array
|
||||||
|
from difflib import get_close_matches
|
||||||
|
import fileinput
|
||||||
|
import I2C_LCD_driver
|
||||||
|
import socket
|
||||||
|
import fcntl
|
||||||
|
import struct
|
||||||
|
import time
|
||||||
|
|
||||||
|
from datetime import datetime
|
||||||
|
from time import sleep
|
||||||
|
|
||||||
|
mylcd = I2C_LCD_driver.lcd()
|
||||||
|
|
||||||
|
#init
|
||||||
|
mylcd.lcd_display_string("FRS2013 (C) 2020", 1)
|
||||||
|
mylcd.lcd_display_string("MMDVM STARTED ", 2)
|
||||||
|
sleep(5)
|
||||||
|
mylcd.lcd_display_string(" ", 1)
|
||||||
|
mylcd.lcd_display_string(" ", 2)
|
||||||
|
|
||||||
|
def get_ip_address(ifname):
|
||||||
|
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||||
|
return socket.inet_ntoa(fcntl.ioctl(
|
||||||
|
s.fileno(),
|
||||||
|
0x8915,
|
||||||
|
struct.pack('256s', ifname[:15])
|
||||||
|
)[20:24])
|
||||||
|
|
||||||
|
|
||||||
|
cpt = 0
|
||||||
|
cpt1 = 0
|
||||||
|
while True:
|
||||||
|
maintenant = datetime.now()
|
||||||
|
month_str=""
|
||||||
|
mois = maintenant.month
|
||||||
|
if (mois<10):
|
||||||
|
month_str="0"
|
||||||
|
day_str=""
|
||||||
|
jour= maintenant.day
|
||||||
|
if (jour<10):
|
||||||
|
day_str="0"
|
||||||
|
oFichier = "/var/log/mmdvmhost/MMDVM-" + str(maintenant.year) + "-" + month_str + str(maintenant.month) + "-" + day_str + str(maintenant.day) +".log"
|
||||||
|
oLog1 = open( oFichier,'r')
|
||||||
|
oLog2 = open( oFichier,'r')
|
||||||
|
#init var
|
||||||
|
numeroLigne = 1
|
||||||
|
var = ""
|
||||||
|
|
||||||
|
for line in oLog1 :
|
||||||
|
# On ne considère pas les lignes vides
|
||||||
|
if line != "" :
|
||||||
|
if ("DMR Slot 2, received RF voice header from" in line) or ("DMR Slot 2, received network voice header from" in line):
|
||||||
|
var = line.split(" ")
|
||||||
|
#print (var)
|
||||||
|
typeradio = var[3]
|
||||||
|
time_start = var[2]
|
||||||
|
var1= time_start.split(":")
|
||||||
|
#print(var1)
|
||||||
|
heure_start = var1[0]
|
||||||
|
minute_start = var1[1]
|
||||||
|
seconde_start = var1[2]
|
||||||
|
callid = var[11]
|
||||||
|
sl = var[5]
|
||||||
|
sl = sl.replace(",","")
|
||||||
|
tg = var[14]
|
||||||
|
tg = tg.replace("\n", "")
|
||||||
|
|
||||||
|
oLog1.close()
|
||||||
|
#print ("Typeradio=",typeradio,"Heure",heure_start,"minute=",minute_start,"seconde=",seconde_start,"ID=",callid,"TG=",tg)
|
||||||
|
|
||||||
|
for line1 in oLog2 :
|
||||||
|
# On ne considère pas les lignes vides
|
||||||
|
if line1 != "" :
|
||||||
|
if ("DMR Slot 2, received RF end of voice transmission from" in line1) or ("DMR Slot 2, received network end of voice transmission from" in line1):
|
||||||
|
var11 = line1.split(" ")
|
||||||
|
#print (var11)
|
||||||
|
time_end = var11[2]
|
||||||
|
var2= time_end.split(":")
|
||||||
|
#print(var2)
|
||||||
|
heure_end = var2[0]
|
||||||
|
minute_end = var2[1]
|
||||||
|
seconde_end = var2[2]
|
||||||
|
|
||||||
|
callid_end = var11[13]
|
||||||
|
|
||||||
|
|
||||||
|
oLog2.close()
|
||||||
|
#print ("Heureend=",heure_end,"minute=",minute_end,"seconde=",seconde_end,"IDEND=",callid_end)
|
||||||
|
|
||||||
|
#print("CallID=",callid,"CallidEnd=",callid_end)
|
||||||
|
#print("Heurestart=",heure_start,"Heure_end=",heure_end)
|
||||||
|
#print("Minutrestart=",minute_start,"Minute_end=",minute_end)
|
||||||
|
#print("Secondestart=",seconde_start,"Seconde_end=",seconde_end)
|
||||||
|
|
||||||
|
if (callid!=callid_end) or ( (callid==callid_end) and (heure_start>=heure_end) and (minute_start>=minute_end) and (seconde_start>seconde_end) ) :
|
||||||
|
body1 = "ID:" + callid + " "
|
||||||
|
body2 = typeradio + " SL:"+ sl +" TG:" + tg + " "
|
||||||
|
mylcd.lcd_display_string("%s " %body1, 1)
|
||||||
|
mylcd.lcd_display_string("%s " %body2, 2)
|
||||||
|
sleep(1)
|
||||||
|
else:
|
||||||
|
cpt1 = cpt1 + 1
|
||||||
|
cpt = cpt + 1
|
||||||
|
mylcd.lcd_display_string("Time: %s" %time.strftime("%H:%M:%S"), 1)
|
||||||
|
if (cpt>25):
|
||||||
|
mylcd.lcd_display_string("LASTID:" + callid + ' ', 2)
|
||||||
|
else:
|
||||||
|
if (cpt1 > 200):
|
||||||
|
mylcd.lcd_display_string("IP:" + get_ip_address('wlan0') + ' ', 2)
|
||||||
|
else:
|
||||||
|
mylcd.lcd_display_string("IP: unknow ", 2)
|
||||||
|
if (cpt>50):
|
||||||
|
cpt=0
|
||||||
|
|
||||||
|
|
9
hd44780/test.py
Executable file
|
@ -0,0 +1,9 @@
|
||||||
|
import I2C_LCD_driver
|
||||||
|
import time
|
||||||
|
mylcd = I2C_LCD_driver.lcd()
|
||||||
|
|
||||||
|
|
||||||
|
while True:
|
||||||
|
mylcd.lcd_display_string("Time: %s" %time.strftime("%H:%M:%S"), 1)
|
||||||
|
|
||||||
|
mylcd.lcd_display_string("Date: %s" %time.strftime("%m/%d/%Y"), 2)
|
21
hd44780/test2.py
Executable file
|
@ -0,0 +1,21 @@
|
||||||
|
import I2C_LCD_driver
|
||||||
|
import socket
|
||||||
|
import fcntl
|
||||||
|
import struct
|
||||||
|
import time
|
||||||
|
mylcd = I2C_LCD_driver.lcd()
|
||||||
|
|
||||||
|
def get_ip_address(ifname):
|
||||||
|
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
||||||
|
return socket.inet_ntoa(fcntl.ioctl(
|
||||||
|
s.fileno(),
|
||||||
|
0x8915,
|
||||||
|
struct.pack('256s', ifname[:15])
|
||||||
|
)[20:24])
|
||||||
|
|
||||||
|
mylcd.lcd_display_string("IP Address:", 1)
|
||||||
|
|
||||||
|
mylcd.lcd_display_string(get_ip_address('wlan0'), 2)
|
||||||
|
|
||||||
|
while True:
|
||||||
|
mylcd.lcd_display_string("Time: %s" %time.strftime("%H:%M:%S"), 1)
|
BIN
html/FRA1OD.png
Executable file
After Width: | Height: | Size: 6.6 KiB |
117
html/LICENSE
Executable file
|
@ -0,0 +1,117 @@
|
||||||
|
CC0 1.0 Universal
|
||||||
|
|
||||||
|
Statement of Purpose
|
||||||
|
|
||||||
|
The laws of most jurisdictions throughout the world automatically confer
|
||||||
|
exclusive Copyright and Related Rights (defined below) upon the creator and
|
||||||
|
subsequent owner(s) (each and all, an "owner") of an original work of
|
||||||
|
authorship and/or a database (each, a "Work").
|
||||||
|
|
||||||
|
Certain owners wish to permanently relinquish those rights to a Work for the
|
||||||
|
purpose of contributing to a commons of creative, cultural and scientific
|
||||||
|
works ("Commons") that the public can reliably and without fear of later
|
||||||
|
claims of infringement build upon, modify, incorporate in other works, reuse
|
||||||
|
and redistribute as freely as possible in any form whatsoever and for any
|
||||||
|
purposes, including without limitation commercial purposes. These owners may
|
||||||
|
contribute to the Commons to promote the ideal of a free culture and the
|
||||||
|
further production of creative, cultural and scientific works, or to gain
|
||||||
|
reputation or greater distribution for their Work in part through the use and
|
||||||
|
efforts of others.
|
||||||
|
|
||||||
|
For these and/or other purposes and motivations, and without any expectation
|
||||||
|
of additional consideration or compensation, the person associating CC0 with a
|
||||||
|
Work (the "Affirmer"), to the extent that he or she is an owner of Copyright
|
||||||
|
and Related Rights in the Work, voluntarily elects to apply CC0 to the Work
|
||||||
|
and publicly distribute the Work under its terms, with knowledge of his or her
|
||||||
|
Copyright and Related Rights in the Work and the meaning and intended legal
|
||||||
|
effect of CC0 on those rights.
|
||||||
|
|
||||||
|
1. Copyright and Related Rights. A Work made available under CC0 may be
|
||||||
|
protected by copyright and related or neighboring rights ("Copyright and
|
||||||
|
Related Rights"). Copyright and Related Rights include, but are not limited
|
||||||
|
to, the following:
|
||||||
|
|
||||||
|
i. the right to reproduce, adapt, distribute, perform, display, communicate,
|
||||||
|
and translate a Work;
|
||||||
|
|
||||||
|
ii. moral rights retained by the original author(s) and/or performer(s);
|
||||||
|
|
||||||
|
iii. publicity and privacy rights pertaining to a person's image or likeness
|
||||||
|
depicted in a Work;
|
||||||
|
|
||||||
|
iv. rights protecting against unfair competition in regards to a Work,
|
||||||
|
subject to the limitations in paragraph 4(a), below;
|
||||||
|
|
||||||
|
v. rights protecting the extraction, dissemination, use and reuse of data in
|
||||||
|
a Work;
|
||||||
|
|
||||||
|
vi. database rights (such as those arising under Directive 96/9/EC of the
|
||||||
|
European Parliament and of the Council of 11 March 1996 on the legal
|
||||||
|
protection of databases, and under any national implementation thereof,
|
||||||
|
including any amended or successor version of such directive); and
|
||||||
|
|
||||||
|
vii. other similar, equivalent or corresponding rights throughout the world
|
||||||
|
based on applicable law or treaty, and any national implementations thereof.
|
||||||
|
|
||||||
|
2. Waiver. To the greatest extent permitted by, but not in contravention of,
|
||||||
|
applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and
|
||||||
|
unconditionally waives, abandons, and surrenders all of Affirmer's Copyright
|
||||||
|
and Related Rights and associated claims and causes of action, whether now
|
||||||
|
known or unknown (including existing as well as future claims and causes of
|
||||||
|
action), in the Work (i) in all territories worldwide, (ii) for the maximum
|
||||||
|
duration provided by applicable law or treaty (including future time
|
||||||
|
extensions), (iii) in any current or future medium and for any number of
|
||||||
|
copies, and (iv) for any purpose whatsoever, including without limitation
|
||||||
|
commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes
|
||||||
|
the Waiver for the benefit of each member of the public at large and to the
|
||||||
|
detriment of Affirmer's heirs and successors, fully intending that such Waiver
|
||||||
|
shall not be subject to revocation, rescission, cancellation, termination, or
|
||||||
|
any other legal or equitable action to disrupt the quiet enjoyment of the Work
|
||||||
|
by the public as contemplated by Affirmer's express Statement of Purpose.
|
||||||
|
|
||||||
|
3. Public License Fallback. Should any part of the Waiver for any reason be
|
||||||
|
judged legally invalid or ineffective under applicable law, then the Waiver
|
||||||
|
shall be preserved to the maximum extent permitted taking into account
|
||||||
|
Affirmer's express Statement of Purpose. In addition, to the extent the Waiver
|
||||||
|
is so judged Affirmer hereby grants to each affected person a royalty-free,
|
||||||
|
non transferable, non sublicensable, non exclusive, irrevocable and
|
||||||
|
unconditional license to exercise Affirmer's Copyright and Related Rights in
|
||||||
|
the Work (i) in all territories worldwide, (ii) for the maximum duration
|
||||||
|
provided by applicable law or treaty (including future time extensions), (iii)
|
||||||
|
in any current or future medium and for any number of copies, and (iv) for any
|
||||||
|
purpose whatsoever, including without limitation commercial, advertising or
|
||||||
|
promotional purposes (the "License"). The License shall be deemed effective as
|
||||||
|
of the date CC0 was applied by Affirmer to the Work. Should any part of the
|
||||||
|
License for any reason be judged legally invalid or ineffective under
|
||||||
|
applicable law, such partial invalidity or ineffectiveness shall not
|
||||||
|
invalidate the remainder of the License, and in such case Affirmer hereby
|
||||||
|
affirms that he or she will not (i) exercise any of his or her remaining
|
||||||
|
Copyright and Related Rights in the Work or (ii) assert any associated claims
|
||||||
|
and causes of action with respect to the Work, in either case contrary to
|
||||||
|
Affirmer's express Statement of Purpose.
|
||||||
|
|
||||||
|
4. Limitations and Disclaimers.
|
||||||
|
|
||||||
|
a. No trademark or patent rights held by Affirmer are waived, abandoned,
|
||||||
|
surrendered, licensed or otherwise affected by this document.
|
||||||
|
|
||||||
|
b. Affirmer offers the Work as-is and makes no representations or warranties
|
||||||
|
of any kind concerning the Work, express, implied, statutory or otherwise,
|
||||||
|
including without limitation warranties of title, merchantability, fitness
|
||||||
|
for a particular purpose, non infringement, or the absence of latent or
|
||||||
|
other defects, accuracy, or the present or absence of errors, whether or not
|
||||||
|
discoverable, all to the greatest extent permissible under applicable law.
|
||||||
|
|
||||||
|
c. Affirmer disclaims responsibility for clearing rights of other persons
|
||||||
|
that may apply to the Work or any use thereof, including without limitation
|
||||||
|
any person's Copyright and Related Rights in the Work. Further, Affirmer
|
||||||
|
disclaims responsibility for obtaining any necessary consents, permissions
|
||||||
|
or other rights required for any use of the Work.
|
||||||
|
|
||||||
|
d. Affirmer understands and acknowledges that Creative Commons is not a
|
||||||
|
party to this document and has no duty or obligation with respect to this
|
||||||
|
CC0 or use of the Work.
|
||||||
|
|
||||||
|
For more information, please see
|
||||||
|
<http://creativecommons.org/publicdomain/zero/1.0/>
|
||||||
|
|
66
html/README.md
Executable file
|
@ -0,0 +1,66 @@
|
||||||
|
# MMDVMHost-Dashboard
|
||||||
|
Dashboard for MMDVMHost (by G4KLX)
|
||||||
|
==================================
|
||||||
|
|
||||||
|
About
|
||||||
|
=====
|
||||||
|
MMDVMHost-Dashboard is a web-dashboard for visualization of different data like
|
||||||
|
system temperatur, cpu-load ... and it shows a last-heard-list.
|
||||||
|
|
||||||
|
It relies on MMDVMHost by G4KLX (see https://github.com/g4klx/MMDVMHost). At
|
||||||
|
this place a big thank you to Jonathan for his great work he did with this
|
||||||
|
software.
|
||||||
|
|
||||||
|
Based on G4KLX code, mod by EA4GKQ
|
||||||
|
|
||||||
|
Required are
|
||||||
|
============
|
||||||
|
* Webserver like lighttpd or similar
|
||||||
|
* php5
|
||||||
|
* if using sqlite3-database name resolving sqlite3 and php5-sqlite also needed
|
||||||
|
|
||||||
|
Installation
|
||||||
|
============
|
||||||
|
* Please ensure to not put loglevels at 0 in MMDVM.ini.
|
||||||
|
* Copy all files into your webroot and enjoy working with it.
|
||||||
|
* Create a config/config.php by calling setup.php and giving suitable values
|
||||||
|
* If Dashboard is working, remove setup.php from your webroot
|
||||||
|
|
||||||
|
For detailled installation see `linux-step-by-step.md` within this repository.
|
||||||
|
|
||||||
|
Usage
|
||||||
|
=====
|
||||||
|
To use the dashboard simply call the corresponding address in a webbrowser. The webbrowser has to be javascript-enabled because of the usage of DataTables, that would only be functional with Javascript enabled for this site!
|
||||||
|
|
||||||
|
Features
|
||||||
|
========
|
||||||
|
At the moment there are several information-sections shown:
|
||||||
|
* System Info:
|
||||||
|
Here you'll find live info about the host-system itself like CPU-freq, temperature, system-load, cpu-usage, uptime and cpu-idle-time.
|
||||||
|
* Repeater Info:
|
||||||
|
Here are some basic repeater info and link-states
|
||||||
|
* Enabled Modes
|
||||||
|
This is a list of enabled modes. If green, it's enabled, if grey, it's disabled. If it is red, there is an error-state with MMDVMHost or ircddbgateway.
|
||||||
|
* Last Heard List of today's x callsigns:
|
||||||
|
This is a list of the last x callsigns heard in general in the system over all modes and directions. X is to be configured in /config/config.php
|
||||||
|
* Today's last 10 local transmissions:
|
||||||
|
For better debugging/calibrating etc. the last 10 local transmissions (RF-side of the repeater) are listed.
|
||||||
|
|
||||||
|
New features by EA4GKQ
|
||||||
|
======================
|
||||||
|
* Buttons toolbar, security-hint: to make this function secure, please enable htpasswd-function for folder "scripts"!
|
||||||
|
* LastHeard table are sorted
|
||||||
|
* Some mods to improve mobile experience
|
||||||
|
|
||||||
|
Cronjob for updating DMR IDs
|
||||||
|
============================
|
||||||
|
You can use the included script to update the DMR IDs periodically. Copy the files updateDMRIDs to /etc/cron.d/ and updateDMRIDs.sh to /var/www from the cron folder in this repo. The paths may have to be aligned to your system architecture. The Update script will then be executed once every 24 hours at 3:30. For security considerations please make sure that the cron folder is not copied to your web server's www root directory.
|
||||||
|
|
||||||
|
If you are using the sqlite3-database, in the database-folder you can find a update-script that updates the database from MARC-database.
|
||||||
|
|
||||||
|
|
||||||
|
Contact
|
||||||
|
=======
|
||||||
|
Feel free to contact the author via email: dg9vh[@]darc.de
|
||||||
|
|
||||||
|
Feel free to contact the mod author via email: ea4gkq[@]ure.es
|
305
html/ajax.php
Executable file
|
@ -0,0 +1,305 @@
|
||||||
|
<?php
|
||||||
|
//session_start();
|
||||||
|
header("Cache-Control: no-cache, must-revalidate");
|
||||||
|
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
|
||||||
|
include "config/config.php";
|
||||||
|
|
||||||
|
if (!defined("LOCALE"))
|
||||||
|
define("LOCALE", "en_GB");
|
||||||
|
include "locale/".LOCALE."/settings.php";
|
||||||
|
$codeset = "UTF8";
|
||||||
|
putenv('LANG='.LANG_LOCALE.'.'.$codeset);
|
||||||
|
putenv('LANGUAGE='.LANG_LOCALE.'.'.$codeset);
|
||||||
|
bind_textdomain_codeset('messages', $codeset);
|
||||||
|
bindtextdomain('messages', dirname(__FILE__).'/locale/');
|
||||||
|
setlocale(LC_ALL, LANG_LOCALE.'.'.$codeset);
|
||||||
|
textdomain('messages');
|
||||||
|
|
||||||
|
include "include/tools.php";
|
||||||
|
include "include/functions.php";
|
||||||
|
|
||||||
|
$mmdvmconfigs = getMMDVMConfig();
|
||||||
|
if (!defined("MMDVMLOGPREFIX"))
|
||||||
|
define("MMDVMLOGPREFIX", getConfigItem("Log", "FileRoot", $mmdvmconfigs));
|
||||||
|
if (!defined("TIMEZONE"))
|
||||||
|
define("TIMEZONE", "UTC");
|
||||||
|
if (defined("RESOLVETGS")) {
|
||||||
|
$tgList = getTGList();
|
||||||
|
}
|
||||||
|
$logLinesMMDVM = getMMDVMLog();
|
||||||
|
$reverseLogLinesMMDVM = $logLinesMMDVM;
|
||||||
|
rsort($reverseLogLinesMMDVM);
|
||||||
|
|
||||||
|
if ($_GET['section'] == "mode") {
|
||||||
|
$mode = getActualMode(getLastHeard($reverseLogLinesMMDVM, TRUE), $mmdvmconfigs);
|
||||||
|
echo $mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($_GET['section'] == "dstarlink") {
|
||||||
|
$link = getActualLink($reverseLogLinesMMDVM, "D-Star");
|
||||||
|
echo $link;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ($_GET['section'] == "ysflink") {
|
||||||
|
$logLinesYSFGateway = getYSFGatewayLog();
|
||||||
|
$reverseLogLinesYSFGateway = $logLinesYSFGateway;
|
||||||
|
rsort($reverseLogLinesYSFGateway);
|
||||||
|
$activeYSFReflectors = getActiveYSFReflectors();
|
||||||
|
$link = getActualLink($reverseLogLinesYSFGateway, "YSF");
|
||||||
|
echo $link;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ($_GET['section'] == "dmr1link") {
|
||||||
|
$link = getActualLink($reverseLogLinesMMDVM, "DMR Slot 1");
|
||||||
|
echo $link;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ($_GET['section'] == "dmr2link") {
|
||||||
|
$link = getActualLink($reverseLogLinesMMDVM, "DMR Slot 2")."/". getActualReflector($reverseLogLinesMMDVM, "DMR Slot 2") ;
|
||||||
|
echo $link;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($_GET['section'] == "lastHeard") {
|
||||||
|
$lastHeardList = getLastHeard($reverseLogLinesMMDVM, FALSE);
|
||||||
|
$lastHeard = Array();
|
||||||
|
for ($i = 0; $i < count($lastHeardList); $i++) {
|
||||||
|
$listElem = $lastHeardList[$i];
|
||||||
|
// Generate a canonicalized call for QRZ and name lookups
|
||||||
|
$call_canon = preg_replace('/\s+\w$/', '', $listElem[2]);
|
||||||
|
if (defined("ENABLEXTDLOOKUP")) {
|
||||||
|
$listElem[11] ="";
|
||||||
|
array_push($lastHeard, $listElem);
|
||||||
|
} else {
|
||||||
|
$listElem[10] ="";
|
||||||
|
array_push($lastHeard, $listElem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
echo '{"data": '.json_encode($lastHeard)."}";
|
||||||
|
}
|
||||||
|
if ($_GET['section'] == "localTx") {
|
||||||
|
$localTXList = getHeardList($reverseLogLinesMMDVM, FALSE);
|
||||||
|
$lastHeard = Array();
|
||||||
|
for ($i = 0; $i < count($localTXList); $i++) {
|
||||||
|
$listElem = $localTXList[$i];
|
||||||
|
// Generate a canonicalized call for QRZ and name lookups
|
||||||
|
$call_canon = preg_replace('/\s+\w$/', '', $listElem[2]);
|
||||||
|
//remove suffix used sometimes in YSF (es: -FT2 , -991)
|
||||||
|
if (strpos($call_canon,"-")!=false) {
|
||||||
|
$call_canon = substr($call_canon, 0, strpos($call_canon, "-"));
|
||||||
|
}
|
||||||
|
if (defined("ENABLEXTDLOOKUP")) {
|
||||||
|
$listElem[11] ="";
|
||||||
|
if ($listElem[6] == "RF" && ($listElem[1]=="D-Star" || startsWith($listElem[1], "DMR") || $listElem[1]=="YSF" || $listElem[1]=="P25" || $listElem[1]=="NXDN")) {
|
||||||
|
$listElem[3] = getName($call_canon);
|
||||||
|
if ($listElem[2] !== "??????????") {
|
||||||
|
if (!is_numeric($listElem[2])) {
|
||||||
|
if (defined("SHOWQRZ")) {
|
||||||
|
$listElem[2] = "<a target=\"_new\" href=\"id.php?id=$listElem[2]\">".str_replace("0","Ø",$listElem[2])."</a>";
|
||||||
|
} else {
|
||||||
|
$listElem[2] = "<a target=\"_new\" href=\"id.php?id=$listElem[2]\">".$listElem[2]."</a>";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$listElem[2] = "<a target=\"_new\" href=\"id.php?id=$listElem[2]\">".$listElem[2]."</a>";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
array_push($lastHeard, $listElem);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$listElem[10] ="";
|
||||||
|
if ($listElem[5] == "RF" && ($listElem[1]=="D-Star" || startsWith($listElem[1], "DMR") || $listElem[1]=="YSF" || $listElem[1]=="P25" || $listElem[1]=="NXDN")) {
|
||||||
|
if ($listElem[2] !== "??????????") {
|
||||||
|
if (!is_numeric($listElem[2])) {
|
||||||
|
if (defined("SHOWQRZ")) {
|
||||||
|
$listElem[2] = "<a target=\"_new\" href=\"id.php?id=$listElem[2]\">".str_replace("0","Ø",$listElem[2])."</a>";
|
||||||
|
} else {
|
||||||
|
$listElem[2] = "<a target=\"_new\" href=\"id.php?id=$listElem[2]\">".$listElem[2]."</a>";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$listElem[2] = "<a target=\"_new\" href=\"id.php?id=$listElem[2]\">".$listElem[2]."</a>";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
array_push($lastHeard, $listElem);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
echo '{"data": '.json_encode($lastHeard)."}";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($_GET['section'] == "sysinfo") {
|
||||||
|
$cputemp = NULL;
|
||||||
|
$cpufreq = NULL;
|
||||||
|
if (file_exists ("/sys/class/thermal/thermal_zone0/temp")) {
|
||||||
|
exec("cat /sys/class/thermal/thermal_zone0/temp", $cputemp);
|
||||||
|
$cputemp = $cputemp[0] / 1000;
|
||||||
|
}
|
||||||
|
showLapTime("cputemp");
|
||||||
|
if (file_exists ("/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq")) {
|
||||||
|
exec("cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq", $cpufreq);
|
||||||
|
$cpufreq = $cpufreq[0] / 1000;
|
||||||
|
}
|
||||||
|
showLapTime("cpufreq");
|
||||||
|
|
||||||
|
if (defined("TEMPERATUREALERT") && $cputemp > TEMPERATUREHIGHLEVEL && $cputemp !== NULL) {
|
||||||
|
?>
|
||||||
|
<script>
|
||||||
|
function deleteLayer(id) {
|
||||||
|
if (document.getElementById && document.getElementById(id)) {
|
||||||
|
var theNode = document.getElementById(id);
|
||||||
|
theNode.parentNode.removeChild(theNode);
|
||||||
|
}
|
||||||
|
else if (document.all && document.all[id]) {
|
||||||
|
document.all[id].innerHTML='';
|
||||||
|
document.all[id].outerHTML='';
|
||||||
|
}
|
||||||
|
// OBSOLETE CODE FOR NETSCAPE 4
|
||||||
|
else if (document.layers && document.layers[id]) {
|
||||||
|
document.layers[id].visibility='hide';
|
||||||
|
delete document.layers[id];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function makeLayer(id,L,T,W,H,bgColor,visible,zIndex) {
|
||||||
|
if (document.getElementById) {
|
||||||
|
if (document.getElementById(id)) {
|
||||||
|
alert ('Layer with this ID already exists!');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var ST = 'position:absolute; text-align:center;padding-top:20px;'
|
||||||
|
+'; left:'+L+'px'
|
||||||
|
+'; top:'+T+'px'
|
||||||
|
+'; width:'+W+'px'
|
||||||
|
+'; height:'+H+'px'
|
||||||
|
+'; clip:rect(0,'+W+','+H+',0)'
|
||||||
|
+'; visibility:'
|
||||||
|
+(null==visible || 1==visible ? 'visible':'hidden')
|
||||||
|
+(null==zIndex ? '' : '; z-index:'+zIndex)
|
||||||
|
+(null==bgColor ? '' : '; background-color:'+bgColor);
|
||||||
|
|
||||||
|
var LR = '<DIV id='+id+' style="'+ST+'">CPU-Temperature is very high!<br><input type="button" value="Close" onclick="deleteLayer(\'LYR1\')"></DIV>';
|
||||||
|
|
||||||
|
if (document.body) {
|
||||||
|
if (document.body.insertAdjacentHTML)
|
||||||
|
document.body.insertAdjacentHTML("BeforeEnd",LR);
|
||||||
|
else if (document.createElement && document.body.appendChild) {
|
||||||
|
var newNode = document.createElement('div');
|
||||||
|
newNode.setAttribute('id',id);
|
||||||
|
newNode.setAttribute('style',ST);
|
||||||
|
document.body.appendChild(newNode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var audio = new Audio('sounds/alert.mp3');
|
||||||
|
audio.play();
|
||||||
|
var x = window.innerWidth/2-100;
|
||||||
|
var y = window.innerHeight/2-50;
|
||||||
|
|
||||||
|
makeLayer('LYR1',x,y,200,100,'red',1,1);
|
||||||
|
</script>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
|
||||||
|
$output = shell_exec('cat /proc/loadavg');
|
||||||
|
$loadavg = explode(" ", $output);
|
||||||
|
$sysload = $loadavg[0] . " / " . $loadavg[1] . " / " . $loadavg[2];
|
||||||
|
Showlaptime("sysload");
|
||||||
|
$stat1 = file('/proc/stat');
|
||||||
|
sleep(1);
|
||||||
|
$stat2 = file('/proc/stat');
|
||||||
|
$info1 = explode(" ", preg_replace("!cpu +!", "", $stat1[0]));
|
||||||
|
$info2 = explode(" ", preg_replace("!cpu +!", "", $stat2[0]));
|
||||||
|
$dif = array();
|
||||||
|
$dif['user'] = $info2[0] - $info1[0];
|
||||||
|
$dif['nice'] = $info2[1] - $info1[1];
|
||||||
|
$dif['sys'] = $info2[2] - $info1[2];
|
||||||
|
$dif['idle'] = $info2[3] - $info1[3];
|
||||||
|
$total = array_sum($dif);
|
||||||
|
$cpu = array();
|
||||||
|
foreach($dif as $x=>$y) $cpu[$x] = round($y / $total * 100, 1);
|
||||||
|
$cpuusage = round($cpu['user'] + $cpu['sys'], 2);
|
||||||
|
showLapTime("cpuusage");
|
||||||
|
|
||||||
|
$output = shell_exec('grep -c processor /proc/cpuinfo');
|
||||||
|
$cpucores = intval($output);
|
||||||
|
|
||||||
|
$output = shell_exec('cat /proc/uptime');
|
||||||
|
$uptime = format_time(substr($output,0,strpos($output," ")));
|
||||||
|
$idletime = format_time(doubleval((substr($output,strpos($output," "))))/$cpucores);
|
||||||
|
showLapTime("idletime");
|
||||||
|
|
||||||
|
if (defined("SHOWPOWERSTATE")) {
|
||||||
|
$pinStatus = trim(shell_exec("gpio -g read ".POWERONLINEPIN)); // Pin 18
|
||||||
|
}
|
||||||
|
//returns 0 = low; 1 = high
|
||||||
|
?>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<?php
|
||||||
|
if (defined("SHOWPOWERSTATE")) {
|
||||||
|
?>
|
||||||
|
<th><?php echo _("Power"); ?></th>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
if ($cputemp !== NULL) {
|
||||||
|
?>
|
||||||
|
<th><?php echo _("CPU-Temperature"); ?></th>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
if ($cpufreq !== NULL) {
|
||||||
|
?>
|
||||||
|
<th><?php echo _("CPU-Frequency");?></th>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
<th><?php echo _("System-Load"); ?></th>
|
||||||
|
<th><?php echo _("CPU-Usage"); ?></th>
|
||||||
|
<th><?php echo _("Uptime"); ?></th>
|
||||||
|
<th><?php echo _("Idle"); ?></th>
|
||||||
|
</tr>
|
||||||
|
<tr class="gatewayinfo">
|
||||||
|
<?php
|
||||||
|
if (defined("SHOWPOWERSTATE")) {
|
||||||
|
?>
|
||||||
|
<td><?php if ($pinStatus == POWERONLINESTATE ) {echo _("online");} else {echo _("on battery");} ?></td>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
if ($cputemp !== NULL) {
|
||||||
|
?>
|
||||||
|
<td><?php echo $cputemp; ?> °C</td>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
if ($cpufreq !== NULL) {
|
||||||
|
?>
|
||||||
|
<td><?php echo $cpufreq; ?> MHz</td>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
<td><?php echo $sysload; ?></td>
|
||||||
|
<td>
|
||||||
|
<?php
|
||||||
|
if (defined("SHOWPROGRESSBARS")) {
|
||||||
|
?>
|
||||||
|
<div class="progress"><div class="progress-bar <?php
|
||||||
|
if ($cpuusage < 30)
|
||||||
|
echo "progress-bar-success";
|
||||||
|
if ($cpuusage >= 30 and $cpuusage < 60)
|
||||||
|
echo "progress-bar-warning";
|
||||||
|
if ($cpuusage >= 60)
|
||||||
|
echo "progress-bar-danger";
|
||||||
|
?>" role="progressbar" aria-valuenow="<?php echo $cpuusage; ?>" aria-valuemin="0" aria-valuemax="100" style="width: <?php echo intval($cpuusage); ?>%;"><?php echo $cpuusage; ?>%</div></div>
|
||||||
|
<?php
|
||||||
|
} else {
|
||||||
|
echo $cpuusage." %";
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
</td>
|
||||||
|
<td><?php echo $uptime; ?></td>
|
||||||
|
<td><?php echo $idletime; ?></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
?>
|
1
html/config/DMRNetwork.txt
Executable file
|
@ -0,0 +1 @@
|
||||||
|
Multimode DMRplus
|
63
html/config/config.php
Executable file
|
@ -0,0 +1,63 @@
|
||||||
|
<?php
|
||||||
|
# This is an auto-generated config-file!
|
||||||
|
# Be careful, when manual editing this!
|
||||||
|
|
||||||
|
date_default_timezone_set('UTC');
|
||||||
|
define("MMDVMLOGPATH", "/var/log/mmdvmhost");
|
||||||
|
define("MMDVMINIPATH", "/etc/mmdvmhost");
|
||||||
|
define("MMDVMINIFILENAME", "MMDVM.ini");
|
||||||
|
define("MMDVMHOSTPATH", "/usr/local/bin/");
|
||||||
|
define("ENABLEXTDLOOKUP", "on");
|
||||||
|
define("TALKERALIAS", "on");
|
||||||
|
define("DMRIDDATPATH", "/home/pi/MMDVM/MMDVMHost/DMRIds.dat");
|
||||||
|
define("RESOLVETGS", "on");
|
||||||
|
define("YSFGATEWAYLOGPATH", "");
|
||||||
|
define("YSFGATEWAYLOGPREFIX", "YSFGateway");
|
||||||
|
define("YSFGATEWAYINIPATH", "");
|
||||||
|
define("YSFGATEWAYINIFILENAME", "YSFGateway.ini");
|
||||||
|
define("YSFHOSTSPATH", "YSFHosts.txt");
|
||||||
|
define("YSFHOSTSFILENAME", "YSFHotst.txt");
|
||||||
|
define("DMRGATEWAYLOGPATH", "");
|
||||||
|
define("DMRGATEWAYLOGPREFIX", "DMRGateway");
|
||||||
|
define("DMRGATEWAYINIPATH", "");
|
||||||
|
define("DMRGATEWAYPATH", "/usr/local/bin/");
|
||||||
|
define("DMRGATEWAYINIFILENAME", "DMRGateway.ini");
|
||||||
|
define("LINKLOGPATH", "");
|
||||||
|
define("IRCDDBGATEWAY", "ircddbgatewayd");
|
||||||
|
define("TIMEZONE", "Europe/Paris");
|
||||||
|
define("LOCALE", "fr_FR");
|
||||||
|
define("LOGO", "http://127.0.0.1/FRA1OD.png");
|
||||||
|
define("JSONNETWORK", "on");
|
||||||
|
define("DMRPLUSLOGO", "http://127.0.0.1/FRA1OD.png");
|
||||||
|
define("BRANDMEISTERLOGO", "");
|
||||||
|
define("REFRESHAFTER", "60");
|
||||||
|
define("SHOWCPU", "on");
|
||||||
|
define("SHOWDISK", "on");
|
||||||
|
define("SHOWRPTINFO", "on");
|
||||||
|
define("SHOWMODES", "on");
|
||||||
|
define("SHOWLH", "on");
|
||||||
|
define("SHOWLOCALTX", "on");
|
||||||
|
define("SHOWPROGRESSBARS", "on");
|
||||||
|
define("TEMPERATUREALERT", "on");
|
||||||
|
define("TEMPERATUREHIGHLEVEL", "60");
|
||||||
|
define("ENABLEREFLECTORSWITCHING", "on");
|
||||||
|
define("SWITCHNETWORKUSER", "");
|
||||||
|
define("SWITCHNETWORKPW", "");
|
||||||
|
define("ENABLEMANAGEMENT", "on");
|
||||||
|
define("VIEWLOGUSER", "");
|
||||||
|
define("VIEWLOGPW", "");
|
||||||
|
define("HALTUSER", "");
|
||||||
|
define("HALTPW", "");
|
||||||
|
define("REBOOTUSER", "");
|
||||||
|
define("REBOOTPW", "");
|
||||||
|
define("RESTARTUSER", "");
|
||||||
|
define("RESTARTPW", "");
|
||||||
|
define("REBOOTYSFGATEWAY", "sudo service ysfgateway restart");
|
||||||
|
define("REBOOTMMDVM", "sudo service mmdvmhost restart");
|
||||||
|
define("REBOOTSYS", "sudo reboot");
|
||||||
|
define("HALTSYS", "sudo halt");
|
||||||
|
define("POWERONLINEPIN", "18");
|
||||||
|
define("POWERONLINESTATE", "1");
|
||||||
|
define("SHOWQRZ", "on");
|
||||||
|
define("RSSI", "avg");
|
||||||
|
?>
|
63
html/config/config.php.sav
Executable file
|
@ -0,0 +1,63 @@
|
||||||
|
<?php
|
||||||
|
# This is an auto-generated config-file!
|
||||||
|
# Be careful, when manual editing this!
|
||||||
|
|
||||||
|
date_default_timezone_set('UTC');
|
||||||
|
define("MMDVMLOGPATH", "/var/log/mmdvmhost");
|
||||||
|
define("MMDVMINIPATH", "/etc/mmdvmhost");
|
||||||
|
define("MMDVMINIFILENAME", "MMDVM.ini");
|
||||||
|
define("MMDVMHOSTPATH", "/usr/local/bin/");
|
||||||
|
define("ENABLEXTDLOOKUP", "on");
|
||||||
|
define("TALKERALIAS", "on");
|
||||||
|
define("DMRIDDATPATH", "/home/pi/MMDVM/MMDVMHost/DMRIds.dat");
|
||||||
|
define("RESOLVETGS", "on");
|
||||||
|
define("YSFGATEWAYLOGPATH", "");
|
||||||
|
define("YSFGATEWAYLOGPREFIX", "YSFGateway");
|
||||||
|
define("YSFGATEWAYINIPATH", "");
|
||||||
|
define("YSFGATEWAYINIFILENAME", "YSFGateway.ini");
|
||||||
|
define("YSFHOSTSPATH", "YSFHosts.txt");
|
||||||
|
define("YSFHOSTSFILENAME", "YSFHotst.txt");
|
||||||
|
define("DMRGATEWAYLOGPATH", "");
|
||||||
|
define("DMRGATEWAYLOGPREFIX", "DMRGateway");
|
||||||
|
define("DMRGATEWAYINIPATH", "");
|
||||||
|
define("DMRGATEWAYPATH", "/usr/local/bin/");
|
||||||
|
define("DMRGATEWAYINIFILENAME", "DMRGateway.ini");
|
||||||
|
define("LINKLOGPATH", "");
|
||||||
|
define("IRCDDBGATEWAY", "ircddbgatewayd");
|
||||||
|
define("TIMEZONE", "Europe/Paris");
|
||||||
|
define("LOCALE", "fr_FR");
|
||||||
|
define("LOGO", "http://127.0.0.1/FRA1OD.png");
|
||||||
|
define("JSONNETWORK", "on");
|
||||||
|
define("DMRPLUSLOGO", "http://127.0.0.1/FRA1OD.png");
|
||||||
|
define("BRANDMEISTERLOGO", "");
|
||||||
|
define("REFRESHAFTER", "60");
|
||||||
|
define("SHOWCPU", "on");
|
||||||
|
define("SHOWDISK", "on");
|
||||||
|
define("SHOWRPTINFO", "on");
|
||||||
|
define("SHOWMODES", "on");
|
||||||
|
define("SHOWLH", "on");
|
||||||
|
define("SHOWLOCALTX", "on");
|
||||||
|
define("SHOWPROGRESSBARS", "on");
|
||||||
|
define("TEMPERATUREALERT", "on");
|
||||||
|
define("TEMPERATUREHIGHLEVEL", "60");
|
||||||
|
define("ENABLEREFLECTORSWITCHING", "on");
|
||||||
|
define("SWITCHNETWORKUSER", "");
|
||||||
|
define("SWITCHNETWORKPW", "");
|
||||||
|
define("ENABLEMANAGEMENT", "on");
|
||||||
|
define("VIEWLOGUSER", "");
|
||||||
|
define("VIEWLOGPW", "");
|
||||||
|
define("HALTUSER", "");
|
||||||
|
define("HALTPW", "");
|
||||||
|
define("REBOOTUSER", "");
|
||||||
|
define("REBOOTPW", "");
|
||||||
|
define("RESTARTUSER", "");
|
||||||
|
define("RESTARTPW", "");
|
||||||
|
define("REBOOTYSFGATEWAY", "sudo service ysfgateway restart");
|
||||||
|
define("REBOOTMMDVM", "sudo service mmdvmhost restart");
|
||||||
|
define("REBOOTSYS", "sudo reboot");
|
||||||
|
define("HALTSYS", "sudo halt");
|
||||||
|
define("POWERONLINEPIN", "18");
|
||||||
|
define("POWERONLINESTATE", "1");
|
||||||
|
define("SHOWQRZ", "on");
|
||||||
|
define("RSSI", "avg");
|
||||||
|
?>
|
21
html/config/networks.php
Executable file
|
@ -0,0 +1,21 @@
|
||||||
|
<?php
|
||||||
|
$networks_json = '{
|
||||||
|
"DMRPLUS":{
|
||||||
|
"label":"Multimode DMRplus",
|
||||||
|
"ini":"DMRPLUS",
|
||||||
|
"logo":"http://db0lm.de/wp-content/uploads/2015/10/DMR-Plus-300x109.png"
|
||||||
|
},
|
||||||
|
"BRANDMEISTER":{
|
||||||
|
"label":"Multimode BrandMeister",
|
||||||
|
"ini":"BRANDMEISTER",
|
||||||
|
"logo":"https://s3.amazonaws.com/files.qrz.com/a/pd1ra/dmr_brandmeister.jpg"
|
||||||
|
},
|
||||||
|
"DSTAR":{
|
||||||
|
"label":"Singlemode D-STAR",
|
||||||
|
"ini":"DSTAR",
|
||||||
|
"logo":""
|
||||||
|
}
|
||||||
|
}';
|
||||||
|
|
||||||
|
$networks = json_decode($networks_json, true);
|
||||||
|
?>
|
55
html/credits.php
Executable file
|
@ -0,0 +1,55 @@
|
||||||
|
<?php
|
||||||
|
include "config/config.php";
|
||||||
|
if (!defined("LOCALE"))
|
||||||
|
define("LOCALE", "en_GB");
|
||||||
|
|
||||||
|
include "locale/".LOCALE."/settings.php";
|
||||||
|
$codeset = "UTF8";
|
||||||
|
putenv('LANG='.LANG_LOCALE.'.'.$codeset);
|
||||||
|
putenv('LANGUAGE='.LANG_LOCALE.'.'.$codeset);
|
||||||
|
bind_textdomain_codeset('messages', $codeset);
|
||||||
|
bindtextdomain('messages', dirname(__FILE__).'/locale/');
|
||||||
|
setlocale(LC_ALL, LANG_LOCALE.'.'.$codeset);
|
||||||
|
textdomain('messages');
|
||||||
|
?>
|
||||||
|
<!doctype html>
|
||||||
|
<html lang="de">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>
|
||||||
|
<!-- Das neueste kompilierte und minimierte CSS -->
|
||||||
|
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
|
||||||
|
<!-- Optionales Theme -->
|
||||||
|
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap-theme.min.css">
|
||||||
|
<!-- Das neueste kompilierte und minimierte JavaScript -->
|
||||||
|
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
|
||||||
|
<title>MMDVM-Dashboard by DG9VH - <?php echo _("Credits"); ?></title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="page-header">
|
||||||
|
<h1><small>MMDVM-Dashboard by DG9VH</small> <?php echo _("Credits"); ?></h1>
|
||||||
|
</div>
|
||||||
|
<div class="container">
|
||||||
|
<p><?php echo _("I think, after all the time this dashboard is developed mainly by myself, it is time to say \"Thank you\" to all those, wo delivered some ideas or code into this project."); ?></p>
|
||||||
|
<p><?php echo _("This are explicit named following persons:"); ?></p>
|
||||||
|
<ul>
|
||||||
|
<li>df2et</li>
|
||||||
|
<li>dg1tal</li>
|
||||||
|
<li>ayasystems</li>
|
||||||
|
<li>on3yh</li>
|
||||||
|
<li>g0wfv</li>
|
||||||
|
<li>dg0cco</li>
|
||||||
|
<li>sa7bnt</li>
|
||||||
|
<li>ct2jay</li>
|
||||||
|
<li>oe7jkt</li>
|
||||||
|
<li>f0dei</li>
|
||||||
|
<li>f1ptl</li>
|
||||||
|
<li><?php echo _("and some others..."); ?></li>
|
||||||
|
</ul>
|
||||||
|
<p><?php echo _("Those, who felt forgotten, feel free to commit a change into github of this file."); ?></p>
|
||||||
|
<p><?php echo _("Many thanks to you all!"); ?></p>
|
||||||
|
<p><?php echo _("Best 73, Kim, DG9VH"); ?></p>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
4
html/cron/updateDMRIDs
Executable file
|
@ -0,0 +1,4 @@
|
||||||
|
# Move this file to /etc/cron.d
|
||||||
|
# Updates the DMRIds.dat every 24 hours
|
||||||
|
* * * * * www-data [ -x /var/www/updateDMRIDs.sh ] && /var/www/updateDMRIDs.sh
|
||||||
|
|
58
html/cron/updateDMRIDs.sh
Executable file
|
@ -0,0 +1,58 @@
|
||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
###############################################################################
|
||||||
|
#
|
||||||
|
# updateDMRIDs.sh
|
||||||
|
#
|
||||||
|
# Copyright (C) 2017 by Florian Wolters DF2ET
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
#
|
||||||
|
###############################################################################
|
||||||
|
#
|
||||||
|
# 18/1/17 - This script is a "derivative work" of GPL version 2 code Copyright
|
||||||
|
# by Tony Corbett G0WFV and is reproduced in this CC0 Universal licensed
|
||||||
|
# project with the original authors' express consent.
|
||||||
|
#
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
|
||||||
|
# Full path to DMR ID file
|
||||||
|
DMRIDFILE=/var/www/html/DMRIds.dat
|
||||||
|
|
||||||
|
# How many DMR ID files do you want backed up (0 = do not keep backups)
|
||||||
|
DMRFILEBACKUP=1
|
||||||
|
|
||||||
|
# Create backup of old file
|
||||||
|
if [ ${DMRFILEBACKUP} -ne 0 ]
|
||||||
|
then
|
||||||
|
cp ${DMRIDFILE} ${DMRIDFILE}.$(date +%d%m%y)
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Prune backups
|
||||||
|
BACKUPCOUNT=$(ls ${DMRIDFILE}.* | wc -l)
|
||||||
|
BACKUPSTODELETE=$(expr ${BACKUPCOUNT} - ${DMRFILEBACKUP})
|
||||||
|
|
||||||
|
if [ ${BACKUPCOUNT} -gt ${DMRFILEBACKUP} ]
|
||||||
|
then
|
||||||
|
for f in $(ls -tr ${DMRIDFILE}.* | head -${BACKUPSTODELETE})
|
||||||
|
do
|
||||||
|
rm $f
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
curl 'http://www.dmr-marc.net/cgi-bin/trbo-database/datadump.cgi?table=users&format=csv&header=0' 2>/dev/null | sed -e 's/\t//g' | awk -F"," '/,/{gsub(/ /, "", $2); printf "%s\t%s\t%s\n", $1, $2, $3}' | sed -e 's/\(.\) .*/\1/g' > /tmp/DMRIds.dat.$(date +%d%m%y)
|
||||||
|
mv /tmp/DMRIds.dat.$(date +%d%m%y) ${DMRIDFILE}
|
||||||
|
rm -f /tmp/DMRIds.dat.$(date +%d%m%y)
|
68
html/cron/updateDMRIDsBM.sh
Executable file
|
@ -0,0 +1,68 @@
|
||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
###############################################################################
|
||||||
|
#
|
||||||
|
# updateDMRIDs.sh
|
||||||
|
#
|
||||||
|
# Copyright (C) 2017 by Florian Wolters DF2ET
|
||||||
|
#
|
||||||
|
# This program is free software; you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with this program; if not, write to the Free Software
|
||||||
|
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
#
|
||||||
|
###############################################################################
|
||||||
|
#
|
||||||
|
# 18/1/17 - This script is a "derivative work" of GPL version 2 code Copyright
|
||||||
|
# by Tony Corbett G0WFV and is reproduced in this CC0 Universal licensed
|
||||||
|
# project with the original authors' express consent.
|
||||||
|
#
|
||||||
|
###############################################################################
|
||||||
|
#
|
||||||
|
#Edit by R2AJV
|
||||||
|
#Edit by CT2JAY
|
||||||
|
|
||||||
|
|
||||||
|
# Full path to DMR ID file
|
||||||
|
DMRIDFILE=/var/www/html/DMRIds.dat
|
||||||
|
|
||||||
|
# How many DMR ID files do you want backed up (0 = do not keep backups)
|
||||||
|
DMRFILEBACKUP=1
|
||||||
|
|
||||||
|
# Create backup of old file
|
||||||
|
if [ ${DMRFILEBACKUP} -ne 0 ]
|
||||||
|
then
|
||||||
|
cp ${DMRIDFILE} ${DMRIDFILE}.$(date +%d%m%y)
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Prune backups
|
||||||
|
BACKUPCOUNT=$(ls ${DMRIDFILE}.* | wc -l)
|
||||||
|
BACKUPSTODELETE=$(expr ${BACKUPCOUNT} - ${DMRFILEBACKUP})
|
||||||
|
|
||||||
|
if [ ${BACKUPCOUNT} -gt ${DMRFILEBACKUP} ]
|
||||||
|
then
|
||||||
|
for f in $(ls -tr ${DMRIDFILE}.* | head -${BACKUPSTODELETE})
|
||||||
|
do
|
||||||
|
rm $f
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Uncomment it if you want to get the data from a database of the DMR-MARC network
|
||||||
|
#curl 'http://www.dmr-marc.net/cgi-bin/trbo-database/datadump.cgi?table=users&format=csv&header=0' 2>/dev/null | sed -e 's/\t//g' | awk -F"," '/,/{gsub(/ /, "", $2); printf "%s\t%s\t%s\n", $1, $2,$
|
||||||
|
#mv /tmp/DMRIds.dat.$(date +%d%m%y) ${DMRIDFILE}
|
||||||
|
#rm -f /tmp/DMRIds.dat.$(date +%d%m%y)
|
||||||
|
|
||||||
|
# Uncomment it if you want to get the data from database of the BrandMeister network
|
||||||
|
curl 'http://registry.dstar.su/dmr/DMRIds.php' 2>/dev/null | sed -e 's/[[:space:]]\+/ /g' > ${DMRIDFILE}
|
||||||
|
mv /tmp/DMRIds.dat.$(date +%d%m%y) ${DMRIDFILE}
|
||||||
|
rm -f /tmp/DMRIds.dat.$(date +%d%m%y)
|
||||||
|
|
34
html/css/monospacetables.css
Executable file
|
@ -0,0 +1,34 @@
|
||||||
|
.diskuse {
|
||||||
|
font-family: monospace;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.repeaterinfo {
|
||||||
|
font-family: monospace;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sysinfo {
|
||||||
|
font-family: monospace;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.localTx {
|
||||||
|
font-family: monospace;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lastHeard {
|
||||||
|
font-family: monospace;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.curTx {
|
||||||
|
font-family: monospace;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ysfGateways {
|
||||||
|
font-family: monospace;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
20
html/css/style.css
Executable file
|
@ -0,0 +1,20 @@
|
||||||
|
.clickable{
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.panel-heading span {
|
||||||
|
font-size: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-active {
|
||||||
|
text-shadow: 0 1px 0 #fff;
|
||||||
|
background-image: -webkit-linear-gradient(top,#fff 0,#3c763d 100%);
|
||||||
|
background-image: -o-linear-gradient(top,#fff 0,#3c763d 100%);
|
||||||
|
background-image: -webkit-gradient(linear,left top,left bottom,from(#fff),to(##3c763d));
|
||||||
|
background-image: linear-gradient(to bottom,#fff 0,#3c763d 100%);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ff3c763d', GradientType=0);
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
|
||||||
|
background-repeat: repeat-x;
|
||||||
|
border-color: #dbdbdb;
|
||||||
|
border-color: #ccc;
|
||||||
|
}
|
46
html/css/tooltip.css
Executable file
|
@ -0,0 +1,46 @@
|
||||||
|
/* Tooltip container */
|
||||||
|
.tooltip2 {
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
border-bottom: 1px dotted black; /* If you want dots under the hoverable text */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Tooltip text */
|
||||||
|
.tooltip2 .tooltip2text {
|
||||||
|
visibility: hidden;
|
||||||
|
width: 120px;
|
||||||
|
background-color: #555;
|
||||||
|
color: #fff;
|
||||||
|
text-align: center;
|
||||||
|
padding: 5px 0;
|
||||||
|
border-radius: 6px;
|
||||||
|
|
||||||
|
/* Position the tooltip text */
|
||||||
|
position: absolute;
|
||||||
|
z-index: 1;
|
||||||
|
bottom: 125%;
|
||||||
|
left: 50%;
|
||||||
|
margin-left: -60px;
|
||||||
|
|
||||||
|
/* Fade in tooltip */
|
||||||
|
opacity: 0;
|
||||||
|
transition: opacity 1s;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Tooltip arrow */
|
||||||
|
.tooltip2 .tooltip2text::after {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: 100%;
|
||||||
|
left: 50%;
|
||||||
|
margin-left: -5px;
|
||||||
|
border-width: 5px;
|
||||||
|
border-style: solid;
|
||||||
|
border-color: #555 transparent transparent transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Show the tooltip text when you mouse over the tooltip container */
|
||||||
|
.tooltip2:hover .tooltip2text {
|
||||||
|
visibility: visible;
|
||||||
|
opacity: 1;
|
||||||
|
}
|
BIN
html/database/callsigns.db
Executable file
11
html/database/dbupdate.sh
Executable file
|
@ -0,0 +1,11 @@
|
||||||
|
#!/bin/bash
|
||||||
|
echo Downloading DMR-IDs from RadioID database
|
||||||
|
#curl 'https://www.ham-digital.org/status/users.csv' 2>/dev/null | sed -e 's/\t//g' | awk -F"," '/,/{gsub(/ /, "", $2); printf "%s;%s;%s\n", $1, $2, $3}' | sed -e 's/\(.\) .*/\1/g' > dmrids.dat
|
||||||
|
curl 'https://ham-digital.org/status/dmrid.dat' 2>/dev/null > dmrids.dat
|
||||||
|
|
||||||
|
echo Removing IDs from local database
|
||||||
|
echo -e 'delete from callsign where 1;' | sqlite3 callsigns.db
|
||||||
|
|
||||||
|
echo inserting new ID-list into local database
|
||||||
|
echo -e '.separator ";" \n.import dmrids.dat callsign' | sqlite3 callsigns.db
|
||||||
|
|
1241
html/database/tgs.csv
Executable file
80
html/editor.php
Executable file
|
@ -0,0 +1,80 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
|
||||||
|
<?php
|
||||||
|
if (!empty($_POST['data'])) {
|
||||||
|
/*
|
||||||
|
print_r($_POST);
|
||||||
|
exit;
|
||||||
|
*/
|
||||||
|
$nomfile=$_POST['nomfile'];
|
||||||
|
$data=$_POST['data'];
|
||||||
|
$path="/var/www/html/configfile/";
|
||||||
|
$data=str_replace("<br>","\n",$data);
|
||||||
|
$data=str_replace("<br />","\n",$data);
|
||||||
|
$data=strip_tags($data);
|
||||||
|
$myfile = fopen($path.$nomfile, "w") or die("Enregistrement impossible!");
|
||||||
|
fwrite($myfile, $data);
|
||||||
|
fclose($myfile);
|
||||||
|
|
||||||
|
|
||||||
|
$path2="/home/pi/";
|
||||||
|
|
||||||
|
//echo "<br>path=".$path.$nomfile."<br>path2=".$path2.$nomfile;
|
||||||
|
//redemarrage obligatoire
|
||||||
|
//redirection sur le index.html
|
||||||
|
echo "<script>alert('Redemarrage Obligatoire!');window.open('index.php','_self');</script>";
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
||||||
|
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
|
||||||
|
|
||||||
|
<script type="text/javascript" src="tiny_mce/tiny_mce.js"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
!--
|
||||||
|
tinyMCE.init({
|
||||||
|
mode : "textareas",
|
||||||
|
valid_elements : "em/i,strike,u,strong/b,div[align],br,#p[align],-ol[type|compact],-ul[type|compact],-li"
|
||||||
|
});
|
||||||
|
//-->
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<b>CONFIGURATION WIFI</b>
|
||||||
|
<br>
|
||||||
|
<form id="form1" method="post" action="editor.php">
|
||||||
|
<textarea name="data" id="data" cols="50" rows="15">
|
||||||
|
<?php
|
||||||
|
$lines = file("/etc/wpa_supplicant/wpa_supplicant.conf");
|
||||||
|
foreach($lines as $n => $line){
|
||||||
|
echo $line."<br>";
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
</textarea>
|
||||||
|
<input name="nomfile" type="hidden" value="wpa_supplicant.conf">
|
||||||
|
<br />
|
||||||
|
<input name="Submit" type="submit" Value="modifier" />
|
||||||
|
</form>
|
||||||
|
<br>
|
||||||
|
<b>CONFIGURATION MMDVM</b>
|
||||||
|
<br>
|
||||||
|
<form id="form2" method="post" action="editor.php">
|
||||||
|
<textarea name="data" id="data2" cols="50" rows="15">
|
||||||
|
<?php
|
||||||
|
$lines = file("/etc/mmdvmhost/MMDVM.ini");
|
||||||
|
foreach($lines as $n => $line){
|
||||||
|
echo $line."<br>";
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
</textarea>
|
||||||
|
<input name="nomfile" type="hidden" value="MMDVM.ini">
|
||||||
|
<br />
|
||||||
|
<input name="Submit" type="submit" Value="modifier" />
|
||||||
|
</form>
|
||||||
|
<input name="Retour" type="button" Value="retour" onclick="javascript:window.open('index.php','_self');"/>
|
||||||
|
</body>
|
||||||
|
</html>
|
80
html/id.php
Executable file
|
@ -0,0 +1,80 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
$callsign = (!empty($_GET['id'])) ? $_GET['id'] : 'FRA1OD';
|
||||||
|
$chemin = 'listing.csv';
|
||||||
|
$lines = file($chemin);
|
||||||
|
$id = '';
|
||||||
|
$nom ='';
|
||||||
|
$prenom = '';
|
||||||
|
$ville='';
|
||||||
|
$departement ='';
|
||||||
|
$pays='';
|
||||||
|
|
||||||
|
foreach ($lines as $line_num => $line)
|
||||||
|
{
|
||||||
|
|
||||||
|
//echo "<br>Ligne #<b>{$line_num}</b> : <b>ICI</b> : ".htmlspecialchars($line)."<br />\n";
|
||||||
|
$tmp = explode(',',$line);
|
||||||
|
|
||||||
|
|
||||||
|
if ($callsign==$tmp[1]) {
|
||||||
|
//print_r($tmp);
|
||||||
|
$id=$tmp[0];
|
||||||
|
$name=$tmp[2];
|
||||||
|
$ville=$tmp[3];
|
||||||
|
$departement =$tmp[4];
|
||||||
|
$pays=$tmp[7];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
||||||
|
|
||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta name="robots" content="index" />
|
||||||
|
<meta name="robots" content="follow" />
|
||||||
|
<meta name="language" content="English" />
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
|
<?php echo "<meta name=\"generator\" content=\"$progname $rev\" />\n"; ?>
|
||||||
|
<meta name="Author" content="Hans-J. Barthen (DL5DI), Kim Huebel (DV9VH) and Andy Taylor (MW0MWZ)" />
|
||||||
|
<meta name="Description" content="Pi-Star Dashboard" />
|
||||||
|
<meta name="KeyWords" content="MW0MWZ,MMDVMHost,ircDDBGateway,D-Star,ircDDB,Pi-Star,Blackwood,Wales,DL5DI,DG9VH" />
|
||||||
|
<meta http-equiv="cache-control" content="max-age=0" />
|
||||||
|
<meta http-equiv="cache-control" content="no-cache, no-store, must-revalidate" />
|
||||||
|
<meta http-equiv="expires" content="0" />
|
||||||
|
<meta http-equiv="pragma" content="no-cache" />
|
||||||
|
<link rel="shortcut icon" href="images/favicon.ico" type="image/x-icon">
|
||||||
|
<title><?php echo "$MYCALL"." - ".$lang['digital_voice']." ".$lang['dashboard'];?></title>
|
||||||
|
<?php include_once "config/browserdetect.php"; ?>
|
||||||
|
|
||||||
|
<link href="/featherlight.css" type="text/css" rel="stylesheet" />
|
||||||
|
</head>
|
||||||
|
<body class="scroll-assist">
|
||||||
|
<center>
|
||||||
|
|
||||||
|
<div id="localTxs"><b>Information sur l'opérateur:</b>
|
||||||
|
<table border="1">
|
||||||
|
<tbody><tr>
|
||||||
|
<th><a class="tooltip" href="#">Indicatif</a></th>
|
||||||
|
<th><a class="tooltip" href="#">Id Réseau</a></th>
|
||||||
|
<th><a class="tooltip" href="#">Prénom</a></th>
|
||||||
|
<th><a class="tooltip" href="#">Ville</a></th>
|
||||||
|
<th><a class="tooltip" href="#">Département</a></th>
|
||||||
|
<th><a class="tooltip" href="#">Pays</a></th>
|
||||||
|
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td align="left"><?php echo $callsign; ?></td>
|
||||||
|
<td align="left"><?php echo $id; ?></td>
|
||||||
|
<td align="left"><?php echo $name; ?></a></td>
|
||||||
|
<td align="left"><?php echo $ville; ?></td>
|
||||||
|
<td align="left"><?php echo $departement; ?></td>
|
||||||
|
<td align="left"><?php echo $pays; ?></td>
|
||||||
|
</tr>
|
||||||
|
</tbody></table>
|
||||||
|
</div>
|
||||||
|
</center>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
BIN
html/images/0.png
Executable file
After Width: | Height: | Size: 394 B |
BIN
html/images/1.png
Executable file
After Width: | Height: | Size: 452 B |
BIN
html/images/2.png
Executable file
After Width: | Height: | Size: 493 B |
BIN
html/images/3.png
Executable file
After Width: | Height: | Size: 531 B |
BIN
html/images/4.png
Executable file
After Width: | Height: | Size: 571 B |
BIN
html/images/dashboard.png
Executable file
After Width: | Height: | Size: 1.0 KiB |
61
html/include/disk.php
Executable file
|
@ -0,0 +1,61 @@
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<!-- Standard-Panel-Inhalt -->
|
||||||
|
<div class="panel-heading"><?php echo _("Disk Use"); ?><span class="pull-right clickable"><i class="glyphicon glyphicon-chevron-up"></i></span></div>
|
||||||
|
<div class="panel-body">
|
||||||
|
<!-- Tabelle -->
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table id="diskuse" class="table diskuse table-condensed table-striped table-hover">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th class="w10p filesystem"><?php echo _("File System"); ?></th>
|
||||||
|
<th class="w20p"><?php echo _("Mount Point"); ?></th>
|
||||||
|
<th><?php echo _("Use"); ?></th>
|
||||||
|
<th class="w15p"><?php echo _("Free"); ?></th>
|
||||||
|
<th class="w15p"><?php echo _("Used"); ?></th>
|
||||||
|
<th class="w15p"><?php echo _("Total"); ?></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<?php
|
||||||
|
error_reporting(E_ERROR | E_WARNING | E_PARSE);
|
||||||
|
try{
|
||||||
|
$datas = array();
|
||||||
|
if (!(exec('/bin/df -T | awk -v c=`/bin/df -T | grep -bo "Type" | awk -F: \'{print $2}\'` \'{print substr($0,c);}\' | tail -n +2 | awk \'{print $1","$2","$3","$4","$5","$6","$7}\'', $df))) {
|
||||||
|
$datas[] = array(
|
||||||
|
'total' => 'N.A',
|
||||||
|
'used' => 'N.A',
|
||||||
|
'free' => 'N.A',
|
||||||
|
'percent_used' => 0,
|
||||||
|
'mount' => 'N.A',
|
||||||
|
'filesystem' => 'N.A',
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
$mounted_points = array();
|
||||||
|
$key = 0;
|
||||||
|
foreach ($df as $mounted) {
|
||||||
|
list($filesystem, $type, $total, $used, $free, $percent, $mount) = explode(',', $mounted);
|
||||||
|
if ((strpos($type, 'tmpfs') !== false) && (strpos($mount, '/mnt/ramdisk') === false))
|
||||||
|
continue;
|
||||||
|
?>
|
||||||
|
<tr>
|
||||||
|
<td><?php echo $filesystem ?></td>
|
||||||
|
<td><?php echo $mount ?></td>
|
||||||
|
<td><div class="progress"><div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="<?php echo trim($percent, '%') ?>" aria-valuemin="0" aria-valuemax="100" style="width: <?php echo trim($percent, '%') ?>%;"><?php echo trim($percent, '%') ?>%</div></div></td>
|
||||||
|
<td><?php echo getSize($free * 1024) ?></td>
|
||||||
|
<td><?php echo getSize($used * 1024) ?></td>
|
||||||
|
<td><?php echo getSize($total * 1024) ?></td>
|
||||||
|
</tr>
|
||||||
|
<?php
|
||||||
|
$key++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception $e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
?>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
1058
html/include/functions.php
Executable file
27
html/include/init.php
Executable file
|
@ -0,0 +1,27 @@
|
||||||
|
<?php
|
||||||
|
//Some basic inits
|
||||||
|
$mmdvmconfigs = getMMDVMConfig();
|
||||||
|
if (!defined("MMDVMLOGPREFIX"))
|
||||||
|
define("MMDVMLOGPREFIX", getConfigItem("Log", "FileRoot", $mmdvmconfigs));
|
||||||
|
if (!defined("TIMEZONE"))
|
||||||
|
define("TIMEZONE", "UTC");
|
||||||
|
if (defined("RESOLVETGS")) {
|
||||||
|
$tgList = getTGList();
|
||||||
|
}
|
||||||
|
$logLinesMMDVM = getMMDVMLog();
|
||||||
|
showLapTime("getMMDVMLog");
|
||||||
|
$reverseLogLinesMMDVM = $logLinesMMDVM;
|
||||||
|
rsort($reverseLogLinesMMDVM);
|
||||||
|
showLapTime("array_multisort");
|
||||||
|
$lastHeard = getLastHeard($reverseLogLinesMMDVM, FALSE);
|
||||||
|
showLapTime("getLastHeard");
|
||||||
|
if (defined("ENABLEYSFGATEWAY")) {
|
||||||
|
$logLinesYSFGateway = getYSFGatewayLog();
|
||||||
|
showLapTime("getYSFGatewayLog");
|
||||||
|
$reverseLogLinesYSFGateway = $logLinesYSFGateway;
|
||||||
|
rsort($reverseLogLinesYSFGateway);
|
||||||
|
showLapTime("array_multisort");
|
||||||
|
$activeYSFReflectors = getActiveYSFReflectors();
|
||||||
|
showLapTime("getActiveYSFReflectors");
|
||||||
|
}
|
||||||
|
?>
|
72
html/include/lh_ajax.php
Executable file
|
@ -0,0 +1,72 @@
|
||||||
|
<?php
|
||||||
|
$totalLH = count($lastHeard);
|
||||||
|
if (defined("ENABLEXTDLOOKUP") && !defined("USESQLITE")) {
|
||||||
|
$TMP_CALL_NAME = "/tmp/Callsign_Name.txt";
|
||||||
|
exec("wc -l ".$TMP_CALL_NAME." | cut -f1 -d' '", $output);
|
||||||
|
exec("wc -l ".DMRIDDATPATH." | cut -f1 -d' '", $output2);
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<!-- Standard-Panel-Inhalt -->
|
||||||
|
<div class="panel-heading"><?php
|
||||||
|
echo _("Last Heard List of today's")." ".$totalLH." "._("callsigns.")." ";
|
||||||
|
if (defined("ENABLEXTDLOOKUP") && !defined("USESQLITE")) {
|
||||||
|
echo _("Cached")." (".$output[0]."/".$output2[0].")";
|
||||||
|
}
|
||||||
|
?><span class="pull-right clickable"><i class="glyphicon glyphicon-chevron-up"></i></span></div>
|
||||||
|
<div class="panel-body">
|
||||||
|
<!-- Tabelle -->
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table id="lastHeard" class="table lastHeard table-condensed table-striped table-hover">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th><?php echo _("Time"); ?> (<?php echo TIMEZONE;?>)</th>
|
||||||
|
<th><?php echo _("Mode"); ?></th>
|
||||||
|
<th><?php echo _("Callsign"); ?></th>
|
||||||
|
<?php
|
||||||
|
if (defined("ENABLEXTDLOOKUP")) {
|
||||||
|
?>
|
||||||
|
<th><?php echo _("Name"); ?></th>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
<th><?php echo _("DSTAR-ID"); ?></th>
|
||||||
|
<th><?php echo _("Target"); ?></th>
|
||||||
|
<th><?php echo _("Source"); ?></th>
|
||||||
|
<th><?php echo _("Dur (s)"); ?></th>
|
||||||
|
<th><?php echo _("Loss"); ?></th>
|
||||||
|
<th><?php echo _("BER"); ?></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
$(document).ready(function(){
|
||||||
|
var lastHeardT = $('#lastHeard').dataTable( {
|
||||||
|
"language": <?php echo DATATABLESTRANSLATION; ?>,
|
||||||
|
"aaSorting": [[0,'desc']],
|
||||||
|
<?php $request = 'http' . (isset($_SERVER['HTTPS']) ? 's' : '') . '://' . "{$_SERVER['SERVER_NAME']}:{$_SERVER['SERVER_PORT']}/{$_SERVER['REQUEST_URI']}";
|
||||||
|
if (strpos($request,"index.php")> 0) {
|
||||||
|
$request = substr($request,0,strpos($request,"index.php"));
|
||||||
|
}
|
||||||
|
if (strpos($request,"?stoprefresh")> 0) {
|
||||||
|
$request = substr($request,0,strpos($request,"?stoprefresh"));
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
"ajax": '<?php echo $request?>/ajax.php?section=lastHeard',
|
||||||
|
"deferRender": true
|
||||||
|
} );
|
||||||
|
|
||||||
|
<?php
|
||||||
|
if (!isset($_GET['stoprefresh'])) {
|
||||||
|
?>
|
||||||
|
setInterval( function () {
|
||||||
|
lastHeardT.api().ajax.reload( );
|
||||||
|
}, <?php echo REFRESHAFTER * 1000 ?> );
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
});
|
||||||
|
</script>
|
70
html/include/localtx_ajax.php
Executable file
|
@ -0,0 +1,70 @@
|
||||||
|
<?php
|
||||||
|
$totalLH = count($lastHeard);
|
||||||
|
?>
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<!-- Standard-Panel-Inhalt -->
|
||||||
|
<div class="panel-heading"><?php echo _("Today's local transmissions"); ?><span class="pull-right clickable"><i class="glyphicon glyphicon-chevron-up"></i></span></div>
|
||||||
|
<div class="panel-body">
|
||||||
|
<!-- Tabelle -->
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table id="localTx" class="table localTx table-condensed table-striped table-hover">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th><?php echo _("Time"); ?> (<?php echo TIMEZONE;?>)</th>
|
||||||
|
<th><?php echo _("Mode"); ?></th>
|
||||||
|
<th><?php echo _("Callsign"); ?></th>
|
||||||
|
<?php
|
||||||
|
if (defined("ENABLEXTDLOOKUP")) {
|
||||||
|
?>
|
||||||
|
<th><?php echo _("Name"); ?></th>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
<th><?php echo _("DSTAR-ID"); ?></th>
|
||||||
|
<th><?php echo _("Target"); ?></th>
|
||||||
|
<th><?php echo _("Source"); ?></th>
|
||||||
|
<th><?php echo _("Dur (s)"); ?></th>
|
||||||
|
<th><?php echo _("Loss"); ?></th>
|
||||||
|
<th><?php echo _("BER"); ?></th>
|
||||||
|
<?php
|
||||||
|
if (constant("RSSI") == "min") echo "<th>"._("RSSI (min)")."</th>";
|
||||||
|
else if (constant("RSSI") == "max") echo "<th>"._("RSSI (max)")."</th>";
|
||||||
|
else if (constant("RSSI") == "avg") echo "<th>"._("RSSI (avg)")."</th>";
|
||||||
|
else if (constant("RSSI") == "all") echo "<th>"._("RSSI (min/max/avg)")."</th>";
|
||||||
|
else echo "<th>"._("RSSI (avg)")."</th>";
|
||||||
|
?>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
$(document).ready(function(){
|
||||||
|
var localTxT = $('#localTx').dataTable( {
|
||||||
|
"language": <?php echo DATATABLESTRANSLATION; ?>,
|
||||||
|
"aaSorting": [[0,'desc']],
|
||||||
|
|
||||||
|
<?php $request = 'http' . (isset($_SERVER['HTTPS']) ? 's' : '') . '://' . "{$_SERVER['SERVER_NAME']}:{$_SERVER['SERVER_PORT']}/{$_SERVER['REQUEST_URI']}";
|
||||||
|
if (strpos($request,"index.php")> 0) {
|
||||||
|
$request = substr($request,0,strpos($request,"index.php"));
|
||||||
|
}
|
||||||
|
if (strpos($request,"?stoprefresh")> 0) {
|
||||||
|
$request = substr($request,0,strpos($request,"?stoprefresh"));
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
"ajax": '<?php echo $request?>/ajax.php?section=localTx',
|
||||||
|
"deferRender": true
|
||||||
|
} );
|
||||||
|
|
||||||
|
<?php
|
||||||
|
if (!isset($_GET['stoprefresh'])) {
|
||||||
|
?>
|
||||||
|
setInterval( function () {
|
||||||
|
localTxT.api().ajax.reload( );
|
||||||
|
}, <?php echo REFRESHAFTER * 1000 ?> );
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
});
|
||||||
|
</script>
|
23
html/include/modes.php
Executable file
|
@ -0,0 +1,23 @@
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<!-- Standard-Panel-Inhalt -->
|
||||||
|
<div class="panel-heading"><?php echo _("Enabled Modes"); ?><span class="pull-right clickable"><i class="glyphicon glyphicon-chevron-up"></i></span></div>
|
||||||
|
<div class="panel-body">
|
||||||
|
<!-- Tabelle -->
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table">
|
||||||
|
<tr>
|
||||||
|
<?php showMode("DMR", $mmdvmconfigs);?>
|
||||||
|
<?php showMode("DMR Network", $mmdvmconfigs);?>
|
||||||
|
<?php showMode("D-Star", $mmdvmconfigs);?>
|
||||||
|
<?php showMode("D-Star Network", $mmdvmconfigs);?>
|
||||||
|
<?php showMode("System Fusion", $mmdvmconfigs);?>
|
||||||
|
<?php showMode("System Fusion Network", $mmdvmconfigs);?>
|
||||||
|
<?php showMode("P25", $mmdvmconfigs);?>
|
||||||
|
<?php showMode("P25 Network", $mmdvmconfigs);?>
|
||||||
|
<?php showMode("NXDN", $mmdvmconfigs);?>
|
||||||
|
<?php showMode("NXDN Network", $mmdvmconfigs);?>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
126
html/include/repeaterinfo.php
Executable file
|
@ -0,0 +1,126 @@
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<!-- Standard-Panel-Inhalt -->
|
||||||
|
<div class="panel-heading"><?php echo _("Repeater Info"); ?><span class="pull-right clickable"><i class="glyphicon glyphicon-chevron-up"></i></span></div>
|
||||||
|
<div class="panel-body">
|
||||||
|
<!-- Tabelle -->
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table repeaterinfo">
|
||||||
|
<tr>
|
||||||
|
<th><?php echo _("Current Mode"); ?></th>
|
||||||
|
<?php
|
||||||
|
if (getEnabled("D-Star", $mmdvmconfigs) == 1) {
|
||||||
|
?>
|
||||||
|
<th><?php echo _("D-Star linked to"); ?></th>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
if (getEnabled("System Fusion", $mmdvmconfigs) == 1) {
|
||||||
|
?>
|
||||||
|
<th><?php echo _("YSF linked to"); ?></th>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
if (getEnabled("DMR", $mmdvmconfigs) == 1) {
|
||||||
|
if (getConfigItem("DMR Network", "Slot1", $mmdvmconfigs) == "1") {
|
||||||
|
?>
|
||||||
|
<th><?php echo _("DMR TS1 last linked to"); ?></th>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
<th><?php echo _("DMR TS2 last linked to"); ?></th>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
</tr>
|
||||||
|
<?php
|
||||||
|
echo"<tr>";
|
||||||
|
echo"<td id=\"mode\">".getActualMode($lastHeard, $mmdvmconfigs)."</td>";
|
||||||
|
if (getEnabled("D-Star", $mmdvmconfigs) == 1) {
|
||||||
|
echo"<td id=\"dstarlink\">".getActualLink($reverseLogLinesMMDVM, "D-Star")."</td>";
|
||||||
|
}
|
||||||
|
if (getEnabled("System Fusion", $mmdvmconfigs) == 1) {
|
||||||
|
echo"<td id=\"ysflink\">".getActualLink($reverseLogLinesYSFGateway, "YSF")."</td>";
|
||||||
|
}
|
||||||
|
if (getEnabled("DMR", $mmdvmconfigs) == 1) {
|
||||||
|
if (getConfigItem("DMR Network", "Slot1", $mmdvmconfigs) == "1") {
|
||||||
|
echo"<td id=\"dmr1link\">".getActualLink($reverseLogLinesMMDVM, "DMR Slot 1")."</td>";
|
||||||
|
}
|
||||||
|
echo"<td id=\"dmr2link\">".getActualLink($reverseLogLinesMMDVM, "DMR Slot 2")."/". getActualReflector($reverseLogLinesMMDVM, "DMR Slot 2") ."</td>";
|
||||||
|
}
|
||||||
|
echo"</tr>\n";
|
||||||
|
?>
|
||||||
|
<tr>
|
||||||
|
<td colspan="5">
|
||||||
|
<table class="table">
|
||||||
|
<tr>
|
||||||
|
<th><?php echo _("Location"); ?></th>
|
||||||
|
<th><?php echo _("TX-Freq."); ?></th>
|
||||||
|
<th><?php echo _("RX-Freq."); ?></th>
|
||||||
|
<?php
|
||||||
|
if (getEnabled("System Fusion Network", $mmdvmconfigs) == 1) {
|
||||||
|
?>
|
||||||
|
<th><?php echo _("YSFGateway"); ?></th>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
if (getEnabled("DMR", $mmdvmconfigs) == 1) {
|
||||||
|
?>
|
||||||
|
<th><?php echo _("DMR CC"); ?></th>
|
||||||
|
<?php
|
||||||
|
if (getEnabled("DMR Network", $mmdvmconfigs) == 1) {
|
||||||
|
?>
|
||||||
|
<th><?php echo _("DMR-Master"); ?></th>
|
||||||
|
<th><?php echo _("TS1"); ?></th>
|
||||||
|
<th><?php echo _("TS2"); ?></th>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
</tr>
|
||||||
|
<?php
|
||||||
|
echo"<tr>";
|
||||||
|
echo"<td>".getConfigItem("Info", "Location", $mmdvmconfigs)."</td>";
|
||||||
|
echo"<td>".getMHZ(getConfigItem("Info", "TXFrequency", $mmdvmconfigs))."</td>";
|
||||||
|
echo"<td>".getMHZ(getConfigItem("Info", "RXFrequency", $mmdvmconfigs))."</td>";
|
||||||
|
if (getEnabled("System Fusion Network", $mmdvmconfigs) == 1) {
|
||||||
|
echo"<td>".getConfigItem("System Fusion Network", "GatewayAddress", $mmdvmconfigs)."</td>";
|
||||||
|
}
|
||||||
|
if (getEnabled("DMR", $mmdvmconfigs) == 1) {
|
||||||
|
echo"<td>".getConfigItem("DMR", "ColorCode", $mmdvmconfigs)."</td>";
|
||||||
|
if (getEnabled("DMR Network", $mmdvmconfigs) == 1) {
|
||||||
|
echo"<td>";
|
||||||
|
if (getDMRMasterState()) {
|
||||||
|
echo "<span class=\"badge badge-success\" title=\"Master connected\">";
|
||||||
|
} else {
|
||||||
|
echo "<span class=\"badge badge-danger\" title=\"Master not connected\">";
|
||||||
|
}
|
||||||
|
echo getConfigItem("DMR Network", "Address", $mmdvmconfigs);
|
||||||
|
if (strlen(getDMRNetwork()) > 0 ) {
|
||||||
|
echo " (".getDMRNetwork().")";
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
<td><span class="badge <?php
|
||||||
|
if (getConfigItem("DMR Network", "Slot1", $mmdvmconfigs) == 1) {
|
||||||
|
echo 'badge-success">'._("enabled");
|
||||||
|
} else {
|
||||||
|
echo 'badge-default">'._("disabled");
|
||||||
|
}
|
||||||
|
?></span></td>
|
||||||
|
<td><span class="badge <?php
|
||||||
|
if (getConfigItem("DMR Network", "Slot2", $mmdvmconfigs) == 1) {
|
||||||
|
echo 'badge-success">'._("enabled");
|
||||||
|
} else {
|
||||||
|
echo 'badge-default">'._("disabled");
|
||||||
|
}
|
||||||
|
?></span></td>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
31
html/include/sysinfo_ajax.php
Executable file
|
@ -0,0 +1,31 @@
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<!-- Standard-Panel-Inhalt -->
|
||||||
|
<div class="panel-heading"><?php echo _("System Info"); ?><span class="pull-right clickable"><i class="glyphicon glyphicon-chevron-up"></i></span></div>
|
||||||
|
<div class="panel-body">
|
||||||
|
<!-- Tabelle -->
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table id="sysinfo" class="table sysinfo table-condensed">
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
function loadXMLDocSysinfo() {
|
||||||
|
var xmlhttp;
|
||||||
|
if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
|
||||||
|
xmlhttp=new XMLHttpRequest();
|
||||||
|
} else {// code for IE6, IE5
|
||||||
|
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
|
||||||
|
}
|
||||||
|
xmlhttp.onreadystatechange=function() {
|
||||||
|
if (xmlhttp.readyState==4 && xmlhttp.status==200) {
|
||||||
|
document.getElementById("sysinfo").innerHTML=xmlhttp.responseText;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
xmlhttp.open("GET","ajax.php?section=sysinfo",true);
|
||||||
|
xmlhttp.send();
|
||||||
|
|
||||||
|
var timeout = window.setTimeout("loadXMLDocSysinfo()", 20000);
|
||||||
|
}
|
||||||
|
loadXMLDocSysinfo();
|
||||||
|
</script>
|
136
html/include/tools.php
Executable file
|
@ -0,0 +1,136 @@
|
||||||
|
<?php
|
||||||
|
function format_time($seconds) {
|
||||||
|
$secs = intval($seconds % 60);
|
||||||
|
$mins = intval($seconds / 60 % 60);
|
||||||
|
$hours = intval($seconds / 3600 % 24);
|
||||||
|
$days = intval($seconds / 86400);
|
||||||
|
$uptimeString = "";
|
||||||
|
|
||||||
|
if ($days > 0) {
|
||||||
|
$uptimeString .= $days;
|
||||||
|
$uptimeString .= (($days == 1) ? " day" : " days");
|
||||||
|
}
|
||||||
|
if ($hours > 0) {
|
||||||
|
$uptimeString .= (($days > 0) ? ", " : "") . $hours;
|
||||||
|
$uptimeString .= (($hours == 1) ? " hr" : " hrs");
|
||||||
|
}
|
||||||
|
if ($mins > 0) {
|
||||||
|
$uptimeString .= (($days > 0 || $hours > 0) ? ", " : "") . $mins;
|
||||||
|
$uptimeString .= (($mins == 1) ? " min" : " mins");
|
||||||
|
}
|
||||||
|
if ($secs > 0) {
|
||||||
|
$uptimeString .= (($days > 0 || $hours > 0 || $mins > 0) ? ", " : "") . $secs;
|
||||||
|
$uptimeString .= (($secs == 1) ? " s" : " s");
|
||||||
|
}
|
||||||
|
return $uptimeString;
|
||||||
|
}
|
||||||
|
|
||||||
|
function startsWith($haystack, $needle) {
|
||||||
|
return $needle === "" || strrpos($haystack, $needle, -strlen($haystack)) !== false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getMHZ($freq) {
|
||||||
|
return substr($freq,0,3) . "." . substr($freq,3,6) . " MHz";
|
||||||
|
}
|
||||||
|
|
||||||
|
function isProcessRunning($processname) {
|
||||||
|
exec("pgrep " . $processname, $pids);
|
||||||
|
if(empty($pids)) {
|
||||||
|
// process not running!
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
// process running!
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function clean($string) {
|
||||||
|
return preg_replace('/[^A-Za-z0-9:\-\/\ \.\_\>\&]/', '', $string); // Removes special chars.
|
||||||
|
}
|
||||||
|
|
||||||
|
function createConfigLines() {
|
||||||
|
$out ="";
|
||||||
|
foreach($_GET as $key=>$val) {
|
||||||
|
if($key != "cmd") {
|
||||||
|
//$val = clean($val);
|
||||||
|
$out .= "define(\"$key\", \"$val\");"."\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $out;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSize($filesize, $precision = 2) {
|
||||||
|
$units = array('', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y');
|
||||||
|
foreach ($units as $idUnit => $unit) {
|
||||||
|
if ($filesize > 1024)
|
||||||
|
$filesize /= 1024;
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return round($filesize, $precision).' '.$units[$idUnit].'B';
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkSetup() {
|
||||||
|
$el = error_reporting();
|
||||||
|
error_reporting(E_ERROR | E_WARNING | E_PARSE);
|
||||||
|
if (file_exists ("setup.php") && ! defined("DISABLESETUPWARNING")) {
|
||||||
|
?>
|
||||||
|
<div class="alert alert-danger" role="alert"><?php echo _("You forgot to remove setup.php in root-directory of your dashboard or you forgot to configure it! Please delete the file or configure your Dashboard by calling <a href=\"setup.php\">setup.php</a>!"); ?></div>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
error_reporting($el);
|
||||||
|
}
|
||||||
|
|
||||||
|
function startStopwatch() {
|
||||||
|
$time = microtime();
|
||||||
|
$time = explode(' ', $time);
|
||||||
|
$time = $time[1] + $time[0];
|
||||||
|
$_SESSION['starttime'] = $time;
|
||||||
|
return $time;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getLapTime() {
|
||||||
|
$start = $_SESSION['starttime'];
|
||||||
|
$time = microtime();
|
||||||
|
$time = explode(' ', $time);
|
||||||
|
$time = $time[1] + $time[0];
|
||||||
|
$finish = $time;
|
||||||
|
$lap_time = round(($finish - $start), 4);
|
||||||
|
return $lap_time;
|
||||||
|
}
|
||||||
|
|
||||||
|
function showLapTime($func) {
|
||||||
|
if( defined("DEBUG") ) {
|
||||||
|
?><script>console.log('<?php echo $func . ": ". getLapTime(); ?> sec.');</script><?php
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function convertTimezone($timestamp) {
|
||||||
|
try {
|
||||||
|
$date = new DateTime($timestamp);
|
||||||
|
$date->setTimezone(new DateTimeZone(TIMEZONE));
|
||||||
|
return $date->format('Y-m-d H:i:s');
|
||||||
|
} catch (Exception $err) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
function encode($hex) {
|
||||||
|
$validchars = " abcdefghijklmnopqrstuvwxyzäöüßABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜ0123456789";
|
||||||
|
$str = '';
|
||||||
|
$chrval = hexdec($hex);
|
||||||
|
$str = chr($chrval);
|
||||||
|
if (strpos($validchars, $str)>=0)
|
||||||
|
return $str;
|
||||||
|
else
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
function recursive_array_search($needle,$haystack) {
|
||||||
|
foreach($haystack as $key=>$value) {
|
||||||
|
$current_key = $key;
|
||||||
|
if($needle===$value OR (is_array($value) && recursive_array_search($needle,$value) !== false)) {
|
||||||
|
return $current_key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
?>
|
114
html/include/txinfo.php
Executable file
|
@ -0,0 +1,114 @@
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<!-- Standard-Panel-Inhalt -->
|
||||||
|
<div class="panel-heading"><?php echo _("Currently TXing"); ?><span class="pull-right clickable"><i class="glyphicon glyphicon-chevron-up"></i></span></div>
|
||||||
|
<div class="panel-body">
|
||||||
|
<!-- Tabelle -->
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table id="currtx" class="table curTx table-condensed table-striped table-hover">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th><?php echo _("Time"); ?> (<?php echo TIMEZONE;?>)</th>
|
||||||
|
<th><?php echo _("Mode"); ?></th>
|
||||||
|
<th><?php echo _("Callsign"); ?></th>
|
||||||
|
<?php
|
||||||
|
if (defined("ENABLEXTDLOOKUP")) {
|
||||||
|
?>
|
||||||
|
<th><?php echo _("Name"); ?></th>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
if (defined("TALKERALIAS")) {
|
||||||
|
?>
|
||||||
|
<th><?php echo _("Talker Alias"); ?></th>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
<th><?php echo _("DSTAR-ID"); ?></th>
|
||||||
|
<th><?php echo _("Target"); ?></th>
|
||||||
|
<th><?php echo _("Source"); ?></th>
|
||||||
|
<th><?php echo _("TX-Time"); ?></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody id="txline">
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
function doXMLHTTPRequest(scriptname, elem) {
|
||||||
|
var xmlhttp;
|
||||||
|
if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
|
||||||
|
xmlhttp=new XMLHttpRequest();
|
||||||
|
} else {// code for IE6, IE5
|
||||||
|
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
|
||||||
|
}
|
||||||
|
xmlhttp.onreadystatechange=function() {
|
||||||
|
if (xmlhttp.readyState==4 && xmlhttp.status==200) {
|
||||||
|
document.getElementById(elem).innerHTML=xmlhttp.responseText;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
xmlhttp.open("GET",scriptname,true);
|
||||||
|
xmlhttp.send();
|
||||||
|
}
|
||||||
|
|
||||||
|
function refreshMode() {
|
||||||
|
doXMLHTTPRequest("ajax.php?section=mode","mode");
|
||||||
|
}
|
||||||
|
|
||||||
|
function refreshDstarLink() {
|
||||||
|
doXMLHTTPRequest("ajax.php?section=dstarlink","dstarlink");
|
||||||
|
}
|
||||||
|
|
||||||
|
function refreshYSFLink() {
|
||||||
|
doXMLHTTPRequest("ajax.php?section=ysflink","ysflink");
|
||||||
|
}
|
||||||
|
|
||||||
|
function refreshDMR1Link() {
|
||||||
|
doXMLHTTPRequest("ajax.php?section=dmr1link","dmr1link");
|
||||||
|
}
|
||||||
|
|
||||||
|
function refreshDMR2Link() {
|
||||||
|
doXMLHTTPRequest("ajax.php?section=dmr2link","dmr2link");
|
||||||
|
}
|
||||||
|
|
||||||
|
var transmitting = false;
|
||||||
|
function loadXMLDoc() {
|
||||||
|
var xmlhttp;
|
||||||
|
if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
|
||||||
|
xmlhttp=new XMLHttpRequest();
|
||||||
|
} else {// code for IE6, IE5
|
||||||
|
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
|
||||||
|
}
|
||||||
|
xmlhttp.onreadystatechange=function() {
|
||||||
|
if (xmlhttp.readyState==4 && xmlhttp.status==200) {
|
||||||
|
document.getElementById("txline").innerHTML=xmlhttp.responseText;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
xmlhttp.open("GET","txinfo.php",true);
|
||||||
|
xmlhttp.send();
|
||||||
|
|
||||||
|
var timeout = window.setTimeout("loadXMLDoc()", 1000);
|
||||||
|
refreshMode();
|
||||||
|
<?php
|
||||||
|
if (getEnabled("D-Star", $mmdvmconfigs) == 1) {
|
||||||
|
?>
|
||||||
|
refreshDstarLink();
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
<?php
|
||||||
|
if (getEnabled("System Fusion", $mmdvmconfigs) == 1) {
|
||||||
|
?>refreshYSFLink();
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
<?php
|
||||||
|
if (getEnabled("DMR", $mmdvmconfigs) == 1) {
|
||||||
|
?>refreshDMR1Link();
|
||||||
|
refreshDMR2Link();
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
}
|
||||||
|
loadXMLDoc();
|
||||||
|
</script>
|
95
html/include/ysfgatewayinfo.php
Executable file
|
@ -0,0 +1,95 @@
|
||||||
|
<?php
|
||||||
|
?>
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<!-- Standard-Panel-Inhalt -->
|
||||||
|
<div class="panel-heading"><?php echo _("YSFGateway-Infos"); ?><span class="pull-right clickable"><i class="glyphicon glyphicon-chevron-up"></i></span></div>
|
||||||
|
<div class="panel-body">
|
||||||
|
<!-- Tabelle -->
|
||||||
|
<table class="table">
|
||||||
|
<tr>
|
||||||
|
<td><span class="badge <?php
|
||||||
|
if (isProcessRunning("YSFGateway")) {
|
||||||
|
echo "badge-success";
|
||||||
|
?>"><?php echo _("YSFGateway Process is running"); ?></span></td><?php
|
||||||
|
} else {
|
||||||
|
echo "badge-danger\" title=\"YSFGateway is down!";
|
||||||
|
?>"><?php echo _("YSFGateway Process is down!"); ?></span></td><?php
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<!-- Standard-Panel-Inhalt -->
|
||||||
|
<div class="panel-heading"><?php echo _("YSFReflectors reported active"); ?><span class="pull-right clickable"><i class="glyphicon glyphicon-chevron-up"></i></span></div>
|
||||||
|
<div class="panel-body">
|
||||||
|
<!-- Tabelle -->
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table id="ysfGateways" class="table ysfGateways table-condensed table-striped table-hover">
|
||||||
|
|
||||||
|
<?php
|
||||||
|
|
||||||
|
if (count($activeYSFReflectors) > 0) {
|
||||||
|
?>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th><?php echo _("No."); ?></th>
|
||||||
|
<th><?php echo _("Name"); ?></th>
|
||||||
|
<th><?php echo _("Description"); ?></th>
|
||||||
|
<th><?php echo _("ID"); ?></th>
|
||||||
|
<th><?php echo _("Connections"); ?></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<?php
|
||||||
|
$counter = 1;
|
||||||
|
foreach ($activeYSFReflectors as $reflector) {
|
||||||
|
echo "<tr>";
|
||||||
|
echo "<td>$counter</td>";
|
||||||
|
for ($i = 0; $i < 5; $i++) {
|
||||||
|
if ($i == 0 && defined("ENABLEYSFREFLECTORSWITCHING")) {
|
||||||
|
echo"<td><a href=\"scripts/switchysfreflector.php?reflector=$reflector[$i]\" title=\"Click to connect to\">$reflector[$i]</a>";
|
||||||
|
$i++;
|
||||||
|
if ($reflector[$i] !=="") {
|
||||||
|
if (startsWith($reflector[$i],"http"))
|
||||||
|
echo ' <a target="_new" href="'.$reflector[$i].'"><img src="images/dashboard.png" /></a>';
|
||||||
|
else
|
||||||
|
echo ' <a target="_new" href="http://'.$reflector[$i].'"><img src="images/dashboard.png" /></a>';
|
||||||
|
}
|
||||||
|
echo"</td>";
|
||||||
|
} else {
|
||||||
|
if ($i == 0) {
|
||||||
|
echo"<td>$reflector[$i]";
|
||||||
|
$i++;
|
||||||
|
if ($reflector[$i] !=="") {
|
||||||
|
if (startsWith($reflector[$i],"http"))
|
||||||
|
echo ' <a target="_new" href="'.$reflector[$i].'"><img src="images/dashboard.png" /></a>';
|
||||||
|
else
|
||||||
|
echo ' <a target="_new" href="http://'.$reflector[$i].'"><img src="images/dashboard.png" /></a>';
|
||||||
|
}
|
||||||
|
echo"</td>";
|
||||||
|
} else {
|
||||||
|
echo"<td>$reflector[$i]</td>";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
echo "</tr>\n";
|
||||||
|
$counter++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
<tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
$(document).ready(function(){
|
||||||
|
var ysfGatewaysT = $('#ysfGateways').dataTable( {
|
||||||
|
"language": <?php echo DATATABLESTRANSLATION; ?>,
|
||||||
|
"aaSorting": [[0,'asc']]
|
||||||
|
} );
|
||||||
|
});
|
||||||
|
</script>
|
52
html/index.lighttpd.html
Executable file
|
@ -0,0 +1,52 @@
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||||
|
<title>Welcome page</title>
|
||||||
|
<style type="text/css" media="screen">
|
||||||
|
body { background: #e7e7e7; font-family: Verdana, sans-serif; font-size: 11pt; }
|
||||||
|
#page { background: #ffffff; margin: 50px; border: 2px solid #c0c0c0; padding: 10px; }
|
||||||
|
#header { background: #4b6983; border: 2px solid #7590ae; text-align: center; padding: 10px; color: #ffffff; }
|
||||||
|
#header h1 { color: #ffffff; }
|
||||||
|
#body { padding: 10px; }
|
||||||
|
span.tt { font-family: monospace; }
|
||||||
|
span.bold { font-weight: bold; }
|
||||||
|
a:link { text-decoration: none; font-weight: bold; color: #C00; background: #ffc; }
|
||||||
|
a:visited { text-decoration: none; font-weight: bold; color: #999; background: #ffc; }
|
||||||
|
a:active { text-decoration: none; font-weight: bold; color: #F00; background: #FC0; }
|
||||||
|
a:hover { text-decoration: none; color: #C00; background: #FC0; }
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="page">
|
||||||
|
<div id="header">
|
||||||
|
<h1> Placeholder page </h1>
|
||||||
|
The owner of this web site has not put up any web pages yet. Please come back later.
|
||||||
|
</div>
|
||||||
|
<div id="body">
|
||||||
|
<h2>You should replace this page with your own web pages as soon as possible.</h2>
|
||||||
|
Unless you changed its configuration, your new server is configured as follows:
|
||||||
|
<ul>
|
||||||
|
<li>Configuration files can be found in <span class="tt">/etc/lighttpd</span>. Please read <span class="tt">/etc/lighttpd/conf-available/README</span> file.</li>
|
||||||
|
<li>The DocumentRoot, which is the directory under which all your HTML files should exist, is set to <span class="tt">/var/www/html</span>.</li>
|
||||||
|
<li>CGI scripts are looked for in <span class="tt">/usr/www/cgi-bin</span>, which is where Debian packages will place their scripts. You can enable cgi module by using command <span class="bold tt">"lighty-enable-mod cgi"</span>.</li>
|
||||||
|
<li>Log files are placed in <span class="tt">/var/log/lighttpd</span>, and will be rotated weekly. The frequency of rotation can be easily changed by editing <span class="tt">/etc/logrotate.d/lighttpd</span>.</li>
|
||||||
|
<li>The default directory index is <span class="tt">index.html</span>, meaning that requests for a directory <span class="tt">/foo/bar/</span> will give the contents of the file /var/www/foo/bar/index.html if it exists (assuming that <span class="tt">/var/www</span> is your DocumentRoot).</li>
|
||||||
|
<li>You can enable user directories by using command <span class="bold tt">"lighty-enable-mod userdir"</span></li>
|
||||||
|
</ul>
|
||||||
|
<h2>About this page</h2>
|
||||||
|
<p>
|
||||||
|
This is a placeholder page installed by the Debian release of the <a href="http://packages.debian.org/lighttpd">Lighttpd server package.</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
This computer has installed the Debian GNU/Linux operating system, but it has nothing to do with the Debian Project. Please do not contact the Debian Project about it.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
If you find a bug in this Lighttpd package, or in Lighttpd itself, please file a bug report on it. Instructions on doing this, and the list of known bugs of this package, can be found in the
|
||||||
|
<a href="http://bugs.debian.org/cgi-bin/pkgreport.cgi?pkg=lighttpd">Debian Bug Tracking System.</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- s:853e9a42efca88ae0dd1a83aeb215047 -->
|
||||||
|
</body>
|
||||||
|
</html>
|
267
html/index.php
Executable file
|
@ -0,0 +1,267 @@
|
||||||
|
<?php
|
||||||
|
header("Cache-Control: no-cache, must-revalidate");
|
||||||
|
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");
|
||||||
|
// do not touch this includes!!! Never ever!!!
|
||||||
|
include "config/config.php";
|
||||||
|
|
||||||
|
if (!defined("LOCALE"))
|
||||||
|
define("LOCALE", "en_GB");
|
||||||
|
|
||||||
|
include "locale/".LOCALE."/settings.php";
|
||||||
|
$codeset = "UTF8";
|
||||||
|
putenv('LANG='.LANG_LOCALE.'.'.$codeset);
|
||||||
|
putenv('LANGUAGE='.LANG_LOCALE.'.'.$codeset);
|
||||||
|
bind_textdomain_codeset('messages', $codeset);
|
||||||
|
bindtextdomain('messages', dirname(__FILE__).'/locale/');
|
||||||
|
setlocale(LC_ALL, LANG_LOCALE.'.'.$codeset);
|
||||||
|
textdomain('messages');
|
||||||
|
|
||||||
|
|
||||||
|
include("config/networks.php");
|
||||||
|
include "include/tools.php";
|
||||||
|
startStopwatch();
|
||||||
|
showLapTime("Start of page");
|
||||||
|
include "include/functions.php";
|
||||||
|
include "include/init.php";
|
||||||
|
include "version.php";
|
||||||
|
?>
|
||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=0.6,maximum-scale=1, user-scalable=yes">
|
||||||
|
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
|
||||||
|
<!-- Das neueste kompilierte und minimierte CSS -->
|
||||||
|
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/latest/css/bootstrap.min.css">
|
||||||
|
<!-- Optionales Theme -->
|
||||||
|
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/latest/css/bootstrap-theme.min.css">
|
||||||
|
<!-- Das neueste kompilierte und minimierte JavaScript -->
|
||||||
|
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/latest/js/bootstrap.min.js"></script>
|
||||||
|
<link rel="stylesheet" href="https://cdn.datatables.net/1.10.13/css/jquery.dataTables.min.css">
|
||||||
|
<script type="text/javascript" src="https://cdn.datatables.net/1.10.13/js/jquery.dataTables.min.js"></script>
|
||||||
|
<!-- Default-CSS -->
|
||||||
|
<link rel="stylesheet" href="css/style.css">
|
||||||
|
<!-- CSS for tooltip display -->
|
||||||
|
<link rel="stylesheet" href="css/tooltip.css">
|
||||||
|
<!-- CSS for monospaced fonts in tables -->
|
||||||
|
<link rel="stylesheet" href="css/monospacetables.css">
|
||||||
|
<style>
|
||||||
|
.nowrap {
|
||||||
|
white-space:nowrap
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<title><?php echo getCallsign($mmdvmconfigs) ?> - MMDVM-Dashboard by DG9VH</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="page-header" style="position:relative;">
|
||||||
|
<h1><small>MMDVM-Dashboard <?php
|
||||||
|
echo _("for");
|
||||||
|
if (getConfigItem("General", "Duplex", $mmdvmconfigs) == "1") {
|
||||||
|
echo " "._("Repeater");
|
||||||
|
} else {
|
||||||
|
echo " "._("Hotspot");
|
||||||
|
}
|
||||||
|
?>:</small> <?php echo getCallsign($mmdvmconfigs) ?><br>
|
||||||
|
<small>DMR-Id: <?php echo getDMRId($mmdvmconfigs) ?></small></h1><hr>
|
||||||
|
<h5>MMDVMHost Version: <?php echo getMMDVMHostVersion() ?><br>Firmware: <?php echo getFirmwareVersion();
|
||||||
|
if (defined("ENABLEDMRGATEWAY")) {
|
||||||
|
?>
|
||||||
|
<br>DMRGateway Version: <?php echo getDMRGatewayVersion();
|
||||||
|
} ?>
|
||||||
|
<?php
|
||||||
|
if (defined("JSONNETWORK")) {
|
||||||
|
$key = recursive_array_search(getDMRNetwork(),$networks);
|
||||||
|
$network = $networks[$key];
|
||||||
|
echo "<br>";
|
||||||
|
echo _("Configuration").": ".$network['label'];
|
||||||
|
|
||||||
|
} else {
|
||||||
|
if (strlen(getDMRNetwork()) > 0 ) {
|
||||||
|
echo "<br>";
|
||||||
|
echo _("DMR-Network: ").getDMRNetwork();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
?></h5>
|
||||||
|
<?php
|
||||||
|
$logourl = "";
|
||||||
|
if (defined("JSONNETWORK")) {
|
||||||
|
$key = recursive_array_search(getDMRNetwork(),$networks);
|
||||||
|
$network = $networks[$key];
|
||||||
|
$logourl = $network['logo'];
|
||||||
|
} else {
|
||||||
|
if (getDMRNetwork() == "BrandMeister") {
|
||||||
|
if (constant('BRANDMEISTERLOGO') !== NULL) {
|
||||||
|
$logourl = BRANDMEISTERLOGO;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (getDMRNetwork() == "DMRplus") {
|
||||||
|
if (constant('DMRPLUSLOGO') !== NULL) {
|
||||||
|
$logourl = DMRPLUSLOGO;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($logourl == "") {
|
||||||
|
$logourl = LOGO;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($logourl !== "") {
|
||||||
|
?>
|
||||||
|
<div id="Logo" style="position:absolute;top:-43px;right:10px;"><img src="FRA1OD.png" width="250px" style="width:250px; border-radius:10px;box-shadow:2px 2px 2px #808080; padding:1px;background:#FFFFFF;border:1px solid #808080;" border="0" hspace="10" vspace="50" align="absmiddle"></div>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
</div>
|
||||||
|
<?php
|
||||||
|
if (defined("ENABLEMANAGEMENT")) {
|
||||||
|
?>
|
||||||
|
<button onclick="window.location.href='./scripts/log.php'" type="button" class="btn btn-default navbar-btn"><span class="glyphicon glyphicon-folder-open" aria-hidden="true"></span> <?php echo _("View Log"); ?></button>
|
||||||
|
<button onclick="window.location.href='./scripts/rebootmmdvm.php'" type="button" class="btn btn-default navbar-btn"><span class="glyphicon glyphicon-refresh" aria-hidden="true"></span> <?php echo _("Reboot MMDVMHost"); ?></button>
|
||||||
|
<button onclick="window.location.href='./scripts/reboot.php'" type="button" class="btn btn-default navbar-btn"><span class="glyphicon glyphicon-repeat" aria-hidden="true"></span> <?php echo _("Reboot System"); ?></button>
|
||||||
|
<button onclick="window.location.href='./scripts/halt.php'" type="button" class="btn btn-default navbar-btn"><span class="glyphicon glyphicon-off" aria-hidden="true"></span> <?php echo _("ShutDown System"); ?></button>
|
||||||
|
<button onclick="window.location.href='editor.php'" type="button" class="btn btn-default navbar-btn"><span class="glyphicon glyphicon-folder-open" aria-hidden="true"></span> <?php echo _("Config"); ?></button>
|
||||||
|
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
if (defined("ENABLENETWORKSWITCHING")) {
|
||||||
|
if (defined("JSONNETWORK")) {
|
||||||
|
echo ' <br>';
|
||||||
|
foreach ($networks as $network) {
|
||||||
|
echo ' <button onclick="window.location.href=\'./scripts/switchnetwork.php?network='.$network['ini'].'\'" type="button" ';
|
||||||
|
if (getDMRNetwork() == $network['label'] )
|
||||||
|
echo 'class="btn btn-active navbar-btn">';
|
||||||
|
else
|
||||||
|
echo 'class="btn btn-default navbar-btn">';
|
||||||
|
echo '<span class="glyphicon glyphicon-link" aria-hidden="true"></span> '.$network['label'].'</button>';
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
?>
|
||||||
|
<button onclick="window.location.href='./scripts/switchnetwork.php?network=DMRPLUS'" type="button" <?php
|
||||||
|
if (getDMRNetwork() == "DMRplus" )
|
||||||
|
echo 'class="btn btn-active navbar-btn">';
|
||||||
|
else
|
||||||
|
echo 'class="btn btn-default navbar-btn">'; ?><span class="glyphicon glyphicon-plus" aria-hidden="true"></span> <?php echo _("DMRplus"); ?></button>
|
||||||
|
<button onclick="window.location.href='./scripts/switchnetwork.php?network=BRANDMEISTER'" type="button" <?php
|
||||||
|
if (getDMRNetwork() == "BrandMeister" )
|
||||||
|
echo 'class="btn btn-active navbar-btn">';
|
||||||
|
else
|
||||||
|
echo 'class="btn btn-default navbar-btn">'; ?><span class="glyphicon glyphicon-fire" aria-hidden="true"></span> <?php echo _("BrandMeister"); ?></button>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
if (defined("ENABLEREFLECTORSWITCHING") && (getEnabled("DMR Network", $mmdvmconfigs) == 1) && recursive_array_search(gethostbyname(getConfigItem("DMR Network", "Address", $mmdvmconfigs)),getDMRplusDMRMasterList()) ) {
|
||||||
|
$reflectors = getDMRReflectors();
|
||||||
|
?>
|
||||||
|
<form method = "get" action ="./scripts/switchreflector.php" class="form-inline" role="form">
|
||||||
|
<div class="form-group">
|
||||||
|
<select id="reflector" name="reflector" class="form-control" style="width: 80px;">
|
||||||
|
<?php
|
||||||
|
foreach ($reflectors as $reflector) {
|
||||||
|
if (isset($reflector[1]))
|
||||||
|
echo'<option value="'.$reflector[0].'">'.mb_convert_encoding($reflector[1], "UTF-8", "ISO-8859-1").'</option>';
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
</select>
|
||||||
|
<button type="submit" class="btn btn-default navbar-btn"><span class="glyphicon glyphicon-refresh" aria-hidden="true"></span> <?php echo _("ReflSwitch"); ?></button>
|
||||||
|
|
||||||
|
</div></form>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
}
|
||||||
|
checkSetup();
|
||||||
|
// Here you can feel free to disable info-sections by commenting out with // before include
|
||||||
|
include "include/txinfo.php";
|
||||||
|
showLapTime("txinfo");
|
||||||
|
if (!defined("SHOWCPU") AND !defined("SHOWDISK") AND !defined("SHOWRPTINFO") AND !defined("SHOWMODES") AND !defined("SHOWLH") AND !defined("SHOWLOCALTX")) {
|
||||||
|
define("SHOWCPU", "on");
|
||||||
|
define("SHOWDISK", "on");
|
||||||
|
define("SHOWRPTINFO", "on");
|
||||||
|
define("SHOWMODES", "on");
|
||||||
|
define("SHOWLH", "on");
|
||||||
|
define("SHOWLOCALTX", "on");
|
||||||
|
}
|
||||||
|
if (defined("SHOWCUSTOM")) {
|
||||||
|
print "<div class=\"panel panel-default\">\n";
|
||||||
|
print "<div class=\"panel-heading\">";
|
||||||
|
echo _("Custom Info");
|
||||||
|
print "<span class=\"pull-right clickable\"><i class=\"glyphicon glyphicon-chevron-up\"></i></span></div>\n";
|
||||||
|
print "<div class=\"panel-body\">\n";
|
||||||
|
$custom = 'custom.php';
|
||||||
|
if (file_exists($custom)) {
|
||||||
|
include $custom;
|
||||||
|
} else {
|
||||||
|
print "<div class=\"alert alert-danger\" role=\"alert\">";
|
||||||
|
echo _("File custom.php not found! Did you forget to create it?");
|
||||||
|
print "</div>\n";
|
||||||
|
}
|
||||||
|
print "</div>\n";
|
||||||
|
print "</div>\n";
|
||||||
|
}
|
||||||
|
if (defined("SHOWCPU")) {
|
||||||
|
include "include/sysinfo_ajax.php";
|
||||||
|
showLapTime("sysinfo");
|
||||||
|
}
|
||||||
|
if (defined("SHOWDISK")) {
|
||||||
|
include "include/disk.php";
|
||||||
|
showLapTime("disk");
|
||||||
|
}
|
||||||
|
if (defined("SHOWRPTINFO")) {
|
||||||
|
include "include/repeaterinfo.php";
|
||||||
|
showLapTime("repeaterinfo");
|
||||||
|
}
|
||||||
|
if (defined("SHOWMODES")) {
|
||||||
|
include "include/modes.php";
|
||||||
|
showLapTime("modes");
|
||||||
|
}
|
||||||
|
if (defined("SHOWLH")) {
|
||||||
|
include "include/lh_ajax.php";
|
||||||
|
showLapTime("lh_ajax");
|
||||||
|
}
|
||||||
|
if (defined("SHOWLOCALTX")) {
|
||||||
|
include "include/localtx_ajax.php";
|
||||||
|
showLapTime("localtx_ajax");
|
||||||
|
}
|
||||||
|
if (defined("ENABLEYSFGATEWAY")) {
|
||||||
|
include "include/ysfgatewayinfo.php";
|
||||||
|
showLapTime("ysfgatewayinfo");
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
<div class="panel panel-info">
|
||||||
|
<?php
|
||||||
|
$lastReload = new DateTime();
|
||||||
|
$lastReload->setTimezone(new DateTimeZone(TIMEZONE));
|
||||||
|
echo "MMDVMHost-Dashboard V ".VERSION." | "._("Last Reload")." ".$lastReload->format('Y-m-d, H:i:s')." (".TIMEZONE.")";
|
||||||
|
echo '<!--Page generated in '.getLapTime().' seconds.-->';
|
||||||
|
?> |
|
||||||
|
<?php
|
||||||
|
if (!isset($_GET['stoprefresh'])) {
|
||||||
|
echo '<a href="?stoprefresh">'._("stop refreshing").'</a>';
|
||||||
|
} else {
|
||||||
|
echo '<a href=".">'._("start refreshing").'</a>';
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
| <?php echo _("get your own at:");?> <a href="https://github.com/dg9vh/MMDVMHost-Dashboard">https://github.com/dg9vh/MMDVMHost-Dashboard</a> | <?php echo _("Follow me");?> <a href="https://twitter.com/DG9VH">@DG9VH</a> | <a href="credits.php"><?php echo _("Credits");?></a>
|
||||||
|
</div>
|
||||||
|
<noscript>
|
||||||
|
For full functionality of this site it is necessary to enable JavaScript.
|
||||||
|
Here are the <a href="http://www.enable-javascript.com/" target="_blank">
|
||||||
|
instructions how to enable JavaScript in your web browser</a>.
|
||||||
|
</noscript>
|
||||||
|
</body>
|
||||||
|
<script>
|
||||||
|
$(document).on('click', '.panel-heading span.clickable', function(e){
|
||||||
|
var $this = $(this);
|
||||||
|
if(!$this.hasClass('panel-collapsed')) {
|
||||||
|
$this.parents('.panel').find('.panel-body').slideUp();
|
||||||
|
$this.addClass('panel-collapsed');
|
||||||
|
$this.find('i').removeClass('glyphicon-chevron-up').addClass('glyphicon-chevron-down');
|
||||||
|
} else {
|
||||||
|
$this.parents('.panel').find('.panel-body').slideDown();
|
||||||
|
$this.removeClass('panel-collapsed');
|
||||||
|
$this.find('i').removeClass('glyphicon-chevron-down').addClass('glyphicon-chevron-up');
|
||||||
|
}
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
</html>
|
||||||
|
<?php
|
||||||
|
showLapTime("End of Page");
|
||||||
|
?>
|
18
html/internationalization.md
Executable file
|
@ -0,0 +1,18 @@
|
||||||
|
# Internationalization
|
||||||
|
If you want to have the static-text-output in other languages than default
|
||||||
|
(english), you have to do following steps:
|
||||||
|
* activate your locale with raspi-config, it must not be default
|
||||||
|
* restart your webserver for loading new locale-configuration
|
||||||
|
* set your locale within setup.php
|
||||||
|
|
||||||
|
# Be a part of translators!
|
||||||
|
To be a part of the translators-community, feel free to copy an existing
|
||||||
|
locale-tree within the locale-directory to your own locale, modify the
|
||||||
|
settings.php-file within this directory and modify the messages.po within
|
||||||
|
the LC_MESSAGES-directory. After this, you should generate a messages.mo
|
||||||
|
with the command 'msgfmt messages.po -o messages.mo'. The command is part
|
||||||
|
of the gettext-package to be installed before with 'apt-get install gettext'.
|
||||||
|
|
||||||
|
To get the translations for DataTables, take a look at
|
||||||
|
https://datatables.net/plug-ins/i18n/ - here you'll find links to translations
|
||||||
|
you can copy&paste into settings.php of the locale-directory.
|
88
html/linux-step-by-step.md
Executable file
|
@ -0,0 +1,88 @@
|
||||||
|
# Linux Step-By-Step
|
||||||
|
This short howto describes step-by-step how to install the MMDVMHost-Dashboard on a Raspberry Pi (or similar) system using a Debian Linux distribution like Raspbian.
|
||||||
|
|
||||||
|
##Installation Steps
|
||||||
|
1. Update your system:
|
||||||
|
|
||||||
|
>sudo apt-get update && sudo apt-get upgrade
|
||||||
|
|
||||||
|
2. Install a lightweight webserver:
|
||||||
|
|
||||||
|
>sudo apt-get install lighttpd
|
||||||
|
|
||||||
|
3. Create a group for the webserver and add yourself to it:
|
||||||
|
|
||||||
|
>sudo groupadd www-data
|
||||||
|
|
||||||
|
>sudo usermod -G www-data -a pi
|
||||||
|
|
||||||
|
4. Set permissions so you and the webserver have full access to the files:
|
||||||
|
|
||||||
|
If you use a current Raspbian Jessie and Raspian Stretch, use following commands:
|
||||||
|
|
||||||
|
>sudo chown -R www-data:www-data /var/www/html
|
||||||
|
|
||||||
|
>sudo chmod -R 775 /var/www/html
|
||||||
|
|
||||||
|
If you use a Raspian Wheezy use:
|
||||||
|
|
||||||
|
>sudo chown -R www-data:www-data /var/www
|
||||||
|
|
||||||
|
>sudo chmod -R 775 /var/www
|
||||||
|
|
||||||
|
5. Install PHP and enable the required modules:
|
||||||
|
|
||||||
|
If you use a Raspian Wheezy and Raspbian Jessie use:
|
||||||
|
|
||||||
|
>sudo apt-get install php5-common php5-cgi php5
|
||||||
|
|
||||||
|
If you use a Raspian Stretch use:
|
||||||
|
|
||||||
|
>sudo apt-get install php7.3-common php7.3-cgi php
|
||||||
|
|
||||||
|
if you want to use the sqlite3-database based resolving of the operator-names you need following, too Raspian Wheezy and Raspbian Jessie:
|
||||||
|
|
||||||
|
>sudo apt-get install sqlite3 php5-sqlite
|
||||||
|
|
||||||
|
Raspian Stretch:
|
||||||
|
|
||||||
|
>sudo apt-get install sqlite3 php7.0-sqlite
|
||||||
|
|
||||||
|
Now continue with:
|
||||||
|
|
||||||
|
>sudo lighty-enable-mod fastcgi
|
||||||
|
|
||||||
|
>sudo lighty-enable-mod fastcgi-php
|
||||||
|
|
||||||
|
>sudo service lighttpd force-reload
|
||||||
|
|
||||||
|
6. To install the dashboard you should use git for easy updates:
|
||||||
|
|
||||||
|
>sudo apt-get install git
|
||||||
|
|
||||||
|
7. Now you can clone the dashboard into your home directory:
|
||||||
|
|
||||||
|
>cd ~
|
||||||
|
|
||||||
|
>git clone https://github.com/dg9vh/MMDVMHost-Dashboard.git
|
||||||
|
|
||||||
|
8. Next, you need to copy the files into the webroot so they can be served by lighttpd:
|
||||||
|
|
||||||
|
If you are using Raspbian Jessie and Raspian Stretch, run:
|
||||||
|
|
||||||
|
>sudo cp -R /home/pi/MMDVMHost-Dashboard/* /var/www/html/
|
||||||
|
|
||||||
|
If you are using Raspbian Wheezy, run:
|
||||||
|
|
||||||
|
>sudo cp -R /home/pi/MMDVMHost-Dashboard/* /var/www/
|
||||||
|
|
||||||
|
9. To make sure the dashboard is served instead of the default "index.html", cd into the webroot /var/www/html respectively /var/www and remove that file:
|
||||||
|
|
||||||
|
>sudo rm index.html
|
||||||
|
|
||||||
|
10. Finally, you need to configure the dashboard by pointing your browser to http://IP-OF-YOUR-HOTSPOT/setup.php . This will create /var/www/html/config/config.php respectively /var/www/config/config.php which contains your custom settings.
|
||||||
|
|
||||||
|
Now the dashboard should be reachable via http://IP-OF-YOUR-HOTSPOT/
|
||||||
|
|
||||||
|
##Configuration Of Dashboard
|
||||||
|
When configuring the dashboard, make sure to set the correct paths for logs etc. If they are wrong, no last-heard or similar information will be shown on the dashboard!
|
3529
html/listing.csv
Executable file
BIN
html/locale/da_DK/LC_MESSAGES/messages.mo
Executable file
742
html/locale/da_DK/LC_MESSAGES/messages.po
Executable file
|
@ -0,0 +1,742 @@
|
||||||
|
# SOME DESCRIPTIVE TITLE.
|
||||||
|
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||||
|
# This file is distributed under the same license as the PACKAGE package.
|
||||||
|
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||||
|
#
|
||||||
|
#, fuzzy
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
|
"Report-Msgid-Bugs-To: dg9vh@darc.de\n"
|
||||||
|
"POT-Creation-Date: 2017-03-14 13:47+0000\n"
|
||||||
|
"PO-Revision-Date: 2017-03-15 19:45+0000\n"
|
||||||
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
"Language: Danish\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
|
||||||
|
#: index.php:183
|
||||||
|
msgid "Custom Info"
|
||||||
|
msgstr "Custom info"
|
||||||
|
|
||||||
|
#: index.php:191
|
||||||
|
msgid "File custom.php not found! Did you forget to create it?"
|
||||||
|
msgstr "File custom.php not found! Did you forget to create it?"
|
||||||
|
|
||||||
|
#: include/sysinfo_ajax.php:3
|
||||||
|
msgid "System Info"
|
||||||
|
msgstr "System Information"
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:5
|
||||||
|
msgid "YSFGateway-Infos"
|
||||||
|
msgstr "YSFGateway-Information"
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:13
|
||||||
|
msgid "YSFGateway Process is running"
|
||||||
|
msgstr "YSFGateway processen er startet"
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:16
|
||||||
|
msgid "YSFGateway Process is down!"
|
||||||
|
msgstr "YSFGateway processen kører ikke"
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:25
|
||||||
|
msgid "YSFReflectors reported active"
|
||||||
|
msgstr "Aktive YSFReflectorer"
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:37
|
||||||
|
msgid "No."
|
||||||
|
msgstr "Nej"
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:38 include/localtx_ajax.php:19
|
||||||
|
#: include/lh_ajax.php:19 include/txinfo.php:16
|
||||||
|
msgid "Name"
|
||||||
|
msgstr "Navn"
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:39
|
||||||
|
msgid "Description"
|
||||||
|
msgstr "Beskrivelse"
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:40
|
||||||
|
msgid "ID"
|
||||||
|
msgstr "ID"
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:41
|
||||||
|
msgid "Connections"
|
||||||
|
msgstr "Forbindelser"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:6
|
||||||
|
msgid "Today's local transmissions"
|
||||||
|
msgstr "Dagens lokale udsendelse"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:13 include/lh_ajax.php:13 include/txinfo.php:10
|
||||||
|
msgid "Time"
|
||||||
|
msgstr "Tid"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:14 include/lh_ajax.php:14 include/txinfo.php:11
|
||||||
|
msgid "Mode"
|
||||||
|
msgstr "Module/TS"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:15 include/lh_ajax.php:15 include/txinfo.php:12
|
||||||
|
msgid "Callsign"
|
||||||
|
msgstr "Kaldesignal"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:23 include/lh_ajax.php:23 include/txinfo.php:25
|
||||||
|
msgid "DSTAR-ID"
|
||||||
|
msgstr "D-STAR ID"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:24 include/lh_ajax.php:24 include/txinfo.php:26
|
||||||
|
msgid "Target"
|
||||||
|
msgstr "Til"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:25 include/lh_ajax.php:25 include/txinfo.php:27
|
||||||
|
msgid "Source"
|
||||||
|
msgstr "Fra"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:26 include/lh_ajax.php:26
|
||||||
|
msgid "Dur (s)"
|
||||||
|
msgstr "TX (s)"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:27 include/lh_ajax.php:27
|
||||||
|
msgid "Loss"
|
||||||
|
msgstr "Tab af data"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:28 include/lh_ajax.php:28
|
||||||
|
msgid "BER"
|
||||||
|
msgstr "BER%"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:30
|
||||||
|
msgid "RSSI (min)"
|
||||||
|
msgstr "RSSI"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:31
|
||||||
|
msgid "RSSI (max)"
|
||||||
|
msgstr "RSSI (max)"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:32 include/localtx_ajax.php:33
|
||||||
|
msgid "RSSI (avg)"
|
||||||
|
msgstr "RSSI (avg)"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:3
|
||||||
|
msgid "Repeater Info"
|
||||||
|
msgstr "Repeater Information"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:9
|
||||||
|
msgid "Current Mode"
|
||||||
|
msgstr "Aktuel module"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:13
|
||||||
|
msgid "D-Star linked to"
|
||||||
|
msgstr "D-Star forbundet med"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:18
|
||||||
|
msgid "YSF linked to"
|
||||||
|
msgstr "YSF forbundet med"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:23
|
||||||
|
msgid "DMR TS1 last linked to"
|
||||||
|
msgstr "DMR TS1 sidst forbundet med"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:24
|
||||||
|
msgid "DMR TS2 last linked to"
|
||||||
|
msgstr "DMR TS2 sidst forbundet med"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:48
|
||||||
|
msgid "Location"
|
||||||
|
msgstr "Sted/By"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:49
|
||||||
|
msgid "TX-Freq."
|
||||||
|
msgstr "TX-Freq."
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:50
|
||||||
|
msgid "RX-Freq."
|
||||||
|
msgstr "RX-Freq."
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:54
|
||||||
|
msgid "YSFGateway"
|
||||||
|
msgstr "YSFGateway"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:59
|
||||||
|
msgid "DMR CC"
|
||||||
|
msgstr "DMR CC"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:63
|
||||||
|
msgid "DMR-Master"
|
||||||
|
msgstr "DMR-Masterserver"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:64
|
||||||
|
msgid "TS1"
|
||||||
|
msgstr "TS1"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:65
|
||||||
|
msgid "TS2"
|
||||||
|
msgstr "TS2"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:97 include/repeaterinfo.php:104
|
||||||
|
msgid "enabled"
|
||||||
|
msgstr "aktiveret"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:99 include/repeaterinfo.php:106
|
||||||
|
msgid "disabled"
|
||||||
|
msgstr "deaktiveret"
|
||||||
|
|
||||||
|
#: include/tools.php:73
|
||||||
|
msgid ""
|
||||||
|
"You are using an old config.php. Please configure your Dashboard by calling "
|
||||||
|
"<a href=\"setup.php\">setup.php</a>!"
|
||||||
|
msgstr "Du bruger en gammel config.php. Vær venlig at konfigurere dit Dashboard via denne link "
|
||||||
|
"<a href=\"setup.php\">setup.php</a>!"
|
||||||
|
|
||||||
|
#: include/tools.php:79
|
||||||
|
msgid ""
|
||||||
|
"You forgot to remove setup.php in root-directory of your dashboard or you "
|
||||||
|
"forgot to configure it! Please delete the file or configure your Dashboard "
|
||||||
|
"by calling <a href=\"setup.php\">setup.php</a>!"
|
||||||
|
msgstr "Du har glemt at slette setup.php i root-mappen af dit Dashboard eller du har glemt at konfigurere det! Vær så venlig at slette denne fil eller konfigurer dit Dashboard"
|
||||||
|
" via denne link <a href=\"setup.php\">setup.php</a>!"
|
||||||
|
|
||||||
|
#: include/modes.php:3
|
||||||
|
msgid "Enabled Modes"
|
||||||
|
msgstr "Aktiverede moduler"
|
||||||
|
|
||||||
|
#: include/lh_ajax.php:6
|
||||||
|
msgid "Last Heard List of today's"
|
||||||
|
msgstr "Dagens liste af de sidste"
|
||||||
|
|
||||||
|
#: include/lh_ajax.php:6
|
||||||
|
msgid "callsigns."
|
||||||
|
msgstr "kaldesignaler"
|
||||||
|
|
||||||
|
#: include/disk.php:3
|
||||||
|
msgid "Disk Use"
|
||||||
|
msgstr "Anvendt plads"
|
||||||
|
|
||||||
|
#: include/disk.php:10
|
||||||
|
msgid "File System"
|
||||||
|
msgstr "Filsystem"
|
||||||
|
|
||||||
|
#: include/disk.php:11
|
||||||
|
msgid "Mount Point"
|
||||||
|
msgstr "Mount Point"
|
||||||
|
|
||||||
|
#: include/disk.php:12
|
||||||
|
msgid "Use"
|
||||||
|
msgstr "Optaget"
|
||||||
|
|
||||||
|
#: include/disk.php:13
|
||||||
|
msgid "Free"
|
||||||
|
msgstr "Ledig"
|
||||||
|
|
||||||
|
#: include/disk.php:14
|
||||||
|
msgid "Used"
|
||||||
|
msgstr "Brugt"
|
||||||
|
|
||||||
|
#: include/disk.php:15
|
||||||
|
msgid "Total"
|
||||||
|
msgstr "Total"
|
||||||
|
|
||||||
|
#: include/txinfo.php:3
|
||||||
|
msgid "Currently TXing"
|
||||||
|
msgstr "Aktuel udsendelse"
|
||||||
|
|
||||||
|
#: include/txinfo.php:21
|
||||||
|
msgid "Talker Alias"
|
||||||
|
msgstr "Talker Alias"
|
||||||
|
|
||||||
|
#: include/txinfo.php:28
|
||||||
|
msgid "TX-Time"
|
||||||
|
msgstr "TX-Tid"
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:50 scripts/halt.php:49 scripts/log.php:53
|
||||||
|
#: scripts/reboot.php:50 index.php:59
|
||||||
|
msgid "for"
|
||||||
|
msgstr "til"
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:52 scripts/halt.php:51 scripts/log.php:55
|
||||||
|
#: scripts/reboot.php:52 index.php:61
|
||||||
|
msgid "Repeater"
|
||||||
|
msgstr "Repeater"
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:54 scripts/halt.php:53 scripts/log.php:57
|
||||||
|
#: scripts/reboot.php:54 index.php:63
|
||||||
|
msgid "Hotspot"
|
||||||
|
msgstr "Hotspot"
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:58 scripts/reboot.php:58
|
||||||
|
msgid "Home"
|
||||||
|
msgstr "Startside"
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:67 scripts/reboot.php:66
|
||||||
|
msgid "Executing"
|
||||||
|
msgstr "Udfører"
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:67
|
||||||
|
msgid "Reboot MMDVMHost service in progress"
|
||||||
|
msgstr "Genstarter MMDVMHost process"
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:90 scripts/halt.php:89 scripts/log.php:134
|
||||||
|
#: scripts/reboot.php:89 index.php:174
|
||||||
|
msgid "get your own at:"
|
||||||
|
msgstr "få din egen hos"
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:90 scripts/halt.php:89 scripts/log.php:134
|
||||||
|
#: scripts/reboot.php:89 index.php:174 credits.php:13 credits.php:17
|
||||||
|
msgid "Credits"
|
||||||
|
msgstr "Medvirkende"
|
||||||
|
|
||||||
|
#: scripts/halt.php:66
|
||||||
|
msgid "Halt in progress...bye"
|
||||||
|
msgstr "Systemet stoppes.....farvel"
|
||||||
|
|
||||||
|
#: scripts/log.php:61 index.php:100
|
||||||
|
msgid "View Log"
|
||||||
|
msgstr "Se logfilen"
|
||||||
|
|
||||||
|
#: scripts/log.php:62 index.php:101
|
||||||
|
msgid "Reboot MMDVMHost"
|
||||||
|
msgstr "Genstart MMDVMHost"
|
||||||
|
|
||||||
|
#: scripts/log.php:63 index.php:102
|
||||||
|
msgid "Reboot System"
|
||||||
|
msgstr "Genstart systemet"
|
||||||
|
|
||||||
|
#: scripts/log.php:64 index.php:103
|
||||||
|
msgid "ShutDown System"
|
||||||
|
msgstr "Sluk systemet"
|
||||||
|
|
||||||
|
#: scripts/log.php:68 index.php:108
|
||||||
|
msgid "DMRplus"
|
||||||
|
msgstr "DMRplus"
|
||||||
|
|
||||||
|
#: scripts/log.php:69 index.php:109
|
||||||
|
msgid "BrandMeister"
|
||||||
|
msgstr "BrandMeister"
|
||||||
|
|
||||||
|
#: scripts/log.php:76
|
||||||
|
msgid "Viewing log"
|
||||||
|
msgstr "Se logfilen"
|
||||||
|
|
||||||
|
#: scripts/log.php:82
|
||||||
|
msgid "Level"
|
||||||
|
msgstr "Niveau"
|
||||||
|
|
||||||
|
#: scripts/log.php:83
|
||||||
|
msgid "Timestamp"
|
||||||
|
msgstr "Tidsstempel"
|
||||||
|
|
||||||
|
#: scripts/log.php:84
|
||||||
|
msgid "Info"
|
||||||
|
msgstr "Information"
|
||||||
|
|
||||||
|
#: scripts/reboot.php:66
|
||||||
|
msgid "Reboot system in progress"
|
||||||
|
msgstr "Systemet bliver genstartet"
|
||||||
|
|
||||||
|
#: ajax.php:214
|
||||||
|
msgid "Power"
|
||||||
|
msgstr "Power"
|
||||||
|
|
||||||
|
#: ajax.php:219
|
||||||
|
msgid "CPU-Temperature"
|
||||||
|
msgstr "CPU-temperatur"
|
||||||
|
|
||||||
|
#: ajax.php:224
|
||||||
|
msgid "CPU-Frequency"
|
||||||
|
msgstr "CPU-frekvens"
|
||||||
|
|
||||||
|
#: ajax.php:228
|
||||||
|
msgid "System-Load"
|
||||||
|
msgstr "Systemlast"
|
||||||
|
|
||||||
|
#: ajax.php:229
|
||||||
|
msgid "CPU-Usage"
|
||||||
|
msgstr "CPU-last"
|
||||||
|
|
||||||
|
#: ajax.php:230
|
||||||
|
msgid "Uptime"
|
||||||
|
msgstr "Driftstid"
|
||||||
|
|
||||||
|
#: ajax.php:231
|
||||||
|
msgid "Idle"
|
||||||
|
msgstr "Idle"
|
||||||
|
|
||||||
|
#: ajax.php:237
|
||||||
|
msgid "online"
|
||||||
|
msgstr "online"
|
||||||
|
|
||||||
|
#: ajax.php:237
|
||||||
|
msgid "on battery"
|
||||||
|
msgstr "på batterie"
|
||||||
|
|
||||||
|
#: index.php:70
|
||||||
|
msgid "DMR-Network: "
|
||||||
|
msgstr "DMR-Netværk: "
|
||||||
|
|
||||||
|
#: index.php:159
|
||||||
|
msgid "Last Reload"
|
||||||
|
msgstr "Aktualiseret sidst"
|
||||||
|
|
||||||
|
#: index.php:169
|
||||||
|
msgid "stop refreshing"
|
||||||
|
msgstr "stopper aktualiseringen"
|
||||||
|
|
||||||
|
#: index.php:171
|
||||||
|
msgid "start refreshing"
|
||||||
|
msgstr "starter aktualiseringen"
|
||||||
|
|
||||||
|
#: credits.php:20
|
||||||
|
msgid ""
|
||||||
|
"I think, after all the time this dashboard is developed mainly by myself, it "
|
||||||
|
"is time to say \"Thank you\" to all those, wo delivered some ideas or code "
|
||||||
|
"into this project."
|
||||||
|
msgstr "Jeg tror efter all den tid jeg har tilbragt med at programmere dette Dashboard, er det nu på tide at sige TAK til alle dem som er kommet med ideer og egen code til dette projekt."
|
||||||
|
|
||||||
|
#: credits.php:21
|
||||||
|
msgid "This are explicit named following persons:"
|
||||||
|
msgstr "Dette gælder specielt følgende personer"
|
||||||
|
|
||||||
|
#: credits.php:31
|
||||||
|
msgid "and some others..."
|
||||||
|
msgstr "og nogle andre...."
|
||||||
|
|
||||||
|
#: credits.php:33
|
||||||
|
msgid ""
|
||||||
|
"Those, who felt forgotten, feel free to commit a change into github of this "
|
||||||
|
"file."
|
||||||
|
msgstr "Alle de som føler sig glemt er velkommen at skrive en commit i denne fil."
|
||||||
|
|
||||||
|
#: credits.php:34
|
||||||
|
msgid "Many thanks to you all!"
|
||||||
|
msgstr "Tusind tak til jer alle!"
|
||||||
|
|
||||||
|
#: credits.php:35
|
||||||
|
msgid "Best 73, Kim, DG9VH"
|
||||||
|
msgstr "73, Kim, DG9VH"
|
||||||
|
|
||||||
|
#: setup.php:26
|
||||||
|
msgid ""
|
||||||
|
"You forgot to give write-permissions to your webserver-user, see point 3 in "
|
||||||
|
"<a href=\"linux-step-by-step.md\">linux-step-by-step.md</a>!"
|
||||||
|
msgstr "Du har glemt at give skrive rettigheder til din webserver-bruger, se venligst skridt 3 i"
|
||||||
|
"<a href=\"linux-step-by-step.md\">linux-step-by-step.md</a>!"
|
||||||
|
|
||||||
|
#: setup.php:41 setup.php:50
|
||||||
|
msgid "Setup-Process"
|
||||||
|
msgstr "Setup-Process"
|
||||||
|
|
||||||
|
#: setup.php:42
|
||||||
|
msgid ""
|
||||||
|
"Your config-file is written in config/config.php, please remove setup.php "
|
||||||
|
"for security reasons!"
|
||||||
|
msgstr "Din config-file er blevet placeret i config/config.php, vær venlig at slette setup.php pga. sikkerheds skyld"
|
||||||
|
|
||||||
|
#: setup.php:43
|
||||||
|
msgid "Your dashboard is now available."
|
||||||
|
msgstr "Dit Dashboard er nu klar til brug"
|
||||||
|
|
||||||
|
#: setup.php:51
|
||||||
|
msgid "Please give necessary information below"
|
||||||
|
msgstr "Vær så venlig at fyld i nødvendig information"
|
||||||
|
|
||||||
|
#: setup.php:56
|
||||||
|
msgid "MMDVMHost-Configuration"
|
||||||
|
msgstr "MMDVMHost-Konfiguration"
|
||||||
|
|
||||||
|
#: setup.php:58
|
||||||
|
msgid "Path to MMDVMHost-logfile"
|
||||||
|
msgstr "Sti til MMDVMHost-logfil"
|
||||||
|
|
||||||
|
#: setup.php:62
|
||||||
|
msgid "Path to MMDVM.ini"
|
||||||
|
msgstr "Sti til MMDVM.ini"
|
||||||
|
|
||||||
|
#: setup.php:66
|
||||||
|
msgid "MMDVM.ini-filename"
|
||||||
|
msgstr "MMDVM.ini-filnavn"
|
||||||
|
|
||||||
|
#: setup.php:70
|
||||||
|
msgid "Path to MMDVMHost-executable"
|
||||||
|
msgstr "Sti til MMDVMHost-eksekverbare fil"
|
||||||
|
|
||||||
|
#: setup.php:74
|
||||||
|
msgid "Enable extended lookup (show names)"
|
||||||
|
msgstr "Aktiver udvidet opslag (vis navn)"
|
||||||
|
|
||||||
|
#: setup.php:78
|
||||||
|
msgid "Show Talker Alias"
|
||||||
|
msgstr "Vis Talker Alias"
|
||||||
|
|
||||||
|
#: setup.php:82
|
||||||
|
msgid "Path to DMR-ID-Database-File (including filename)"
|
||||||
|
msgstr "Sti til DMR-ID-Database-File (inklusive filename)"
|
||||||
|
|
||||||
|
#: setup.php:87
|
||||||
|
msgid "YSFGateway-Configuration"
|
||||||
|
msgstr "YSFGateway-Configuration"
|
||||||
|
|
||||||
|
#: setup.php:89
|
||||||
|
msgid "Enable YSFGateway"
|
||||||
|
msgstr "Aktiver YSFGateway"
|
||||||
|
|
||||||
|
#: setup.php:93
|
||||||
|
msgid "Path to YSFGateway-logfile"
|
||||||
|
msgstr "Sti til YSFGateway-logfil"
|
||||||
|
|
||||||
|
#: setup.php:97
|
||||||
|
msgid "Logfile-prefix"
|
||||||
|
msgstr "Logfil-prefix"
|
||||||
|
|
||||||
|
#: setup.php:101
|
||||||
|
msgid "Path to YSFGateway.ini"
|
||||||
|
msgstr "Sti til YSFGateway-ini"
|
||||||
|
|
||||||
|
#: setup.php:105
|
||||||
|
msgid "YSFGateway.ini-filename"
|
||||||
|
msgstr "YSFGateway.ini-filnavn"
|
||||||
|
|
||||||
|
#: setup.php:109
|
||||||
|
msgid "Path to YSFHosts.txt"
|
||||||
|
msgstr "Sti til YSFHosts.txt"
|
||||||
|
|
||||||
|
#: setup.php:113
|
||||||
|
msgid "YSFHosts.txt-filename"
|
||||||
|
msgstr "YSFHost.txt-filnavn"
|
||||||
|
|
||||||
|
#: setup.php:118
|
||||||
|
msgid "ircddbgateway-Configuration"
|
||||||
|
msgstr "ircddbgateway-Konfiguration"
|
||||||
|
|
||||||
|
#: setup.php:120
|
||||||
|
msgid "Path to Links.log"
|
||||||
|
msgstr "Sti til Links.log"
|
||||||
|
|
||||||
|
#: setup.php:124
|
||||||
|
msgid "Name of ircddbgateway-executeable"
|
||||||
|
msgstr "Navn fra ircddbgateway-executeable"
|
||||||
|
|
||||||
|
#: setup.php:129
|
||||||
|
msgid "Global Configuration"
|
||||||
|
msgstr "Globale konfiguration"
|
||||||
|
|
||||||
|
#: setup.php:188
|
||||||
|
msgid "Locale"
|
||||||
|
msgstr "Sprog"
|
||||||
|
|
||||||
|
#: setup.php:192
|
||||||
|
msgid "URL to Logo"
|
||||||
|
msgstr "URL til Logo (Billede)"
|
||||||
|
|
||||||
|
#: setup.php:196
|
||||||
|
msgid "URL to DMRplus-Logo"
|
||||||
|
msgstr "URL til DMRplus billede"
|
||||||
|
|
||||||
|
#: setup.php:200
|
||||||
|
msgid "URL to BrandMeister-Logo"
|
||||||
|
msgstr "URL til BrandMeister billede"
|
||||||
|
|
||||||
|
#: setup.php:204
|
||||||
|
msgid "Refresh page after in seconds"
|
||||||
|
msgstr "Aktualiser siden efter sekunder"
|
||||||
|
|
||||||
|
#: setup.php:208
|
||||||
|
msgid "Show System Info"
|
||||||
|
msgstr "Vis system information"
|
||||||
|
|
||||||
|
#: setup.php:212
|
||||||
|
msgid "Show Disk Use"
|
||||||
|
msgstr "Vis disk status"
|
||||||
|
|
||||||
|
#: setup.php:216
|
||||||
|
msgid "Show Repeater Info"
|
||||||
|
msgstr "Vis Repeater information"
|
||||||
|
|
||||||
|
#: setup.php:220
|
||||||
|
msgid "Show Enabled Modes"
|
||||||
|
msgstr "Vis aktiverede moduler"
|
||||||
|
|
||||||
|
#: setup.php:224
|
||||||
|
msgid "Show Last Heard List of today's"
|
||||||
|
msgstr "Vis dagens Last Heard udsendelse"
|
||||||
|
|
||||||
|
#: setup.php:228
|
||||||
|
msgid "Show Today's local transmissions"
|
||||||
|
msgstr "Vis dagens lokale udsendelse"
|
||||||
|
|
||||||
|
#: setup.php:232
|
||||||
|
msgid "Show progressbars"
|
||||||
|
msgstr "Vis progressbars"
|
||||||
|
|
||||||
|
#: setup.php:236
|
||||||
|
msgid "Enable CPU-temperature-warning"
|
||||||
|
msgstr "Aktiver CPU-temperatur-advarsel"
|
||||||
|
|
||||||
|
#: setup.php:240
|
||||||
|
msgid "Warning temperature"
|
||||||
|
msgstr "Advarsel temperatur"
|
||||||
|
|
||||||
|
#: setup.php:244
|
||||||
|
msgid "Enable Network-Switching-Function"
|
||||||
|
msgstr "Aktiver switching mellem netværk"
|
||||||
|
|
||||||
|
#: setup.php:248
|
||||||
|
msgid "Username for switching networks:"
|
||||||
|
msgstr "Brugernavn til netværk-switch"
|
||||||
|
|
||||||
|
#: setup.php:252
|
||||||
|
msgid "Password for switching networks:"
|
||||||
|
msgstr "Pasord til netværk-switch"
|
||||||
|
|
||||||
|
#: setup.php:257
|
||||||
|
msgid "Enable Management-Functions below"
|
||||||
|
msgstr "Aktiver Management-Functions"
|
||||||
|
|
||||||
|
#: setup.php:261
|
||||||
|
msgid "Username for view log:"
|
||||||
|
msgstr "Brugernavn for at kunne se loggen"
|
||||||
|
|
||||||
|
#: setup.php:265
|
||||||
|
msgid "Password for view log:"
|
||||||
|
msgstr "Pasord for at kunne se loggen"
|
||||||
|
|
||||||
|
#: setup.php:269
|
||||||
|
msgid "Username for halt:"
|
||||||
|
msgstr "Brugernavn til system stop"
|
||||||
|
|
||||||
|
#: setup.php:273
|
||||||
|
msgid "Password for halt:"
|
||||||
|
msgstr "Pasord til system stop"
|
||||||
|
|
||||||
|
#: setup.php:277
|
||||||
|
msgid "Username for reboot:"
|
||||||
|
msgstr "Brugernavn til system omstart"
|
||||||
|
|
||||||
|
#: setup.php:281
|
||||||
|
msgid "Password for reboot:"
|
||||||
|
msgstr "Pasord til system omstart"
|
||||||
|
|
||||||
|
#: setup.php:285
|
||||||
|
msgid "Username for restart:"
|
||||||
|
msgstr "Brugernavn til MMDVMHost omstart"
|
||||||
|
|
||||||
|
#: setup.php:289
|
||||||
|
msgid "Password for restart:"
|
||||||
|
msgstr "pasord till MMDVMHost omstart"
|
||||||
|
|
||||||
|
#: setup.php:293
|
||||||
|
msgid "Reboot MMDVMHost command:"
|
||||||
|
msgstr "Kommando til omstart af MMDVMHost"
|
||||||
|
|
||||||
|
#: setup.php:297
|
||||||
|
msgid "Reboot system command:"
|
||||||
|
msgstr "Kommando til omstart af systemet"
|
||||||
|
|
||||||
|
#: setup.php:301
|
||||||
|
msgid "Halt system command:"
|
||||||
|
msgstr "Kommando til at stoppe systemet"
|
||||||
|
|
||||||
|
#: setup.php:305
|
||||||
|
msgid "Show Powerstate (online or battery, wiringpi needed)"
|
||||||
|
msgstr "Strømforsyning (Fast eller batterie, wiringpi bruges)"
|
||||||
|
|
||||||
|
#: setup.php:309
|
||||||
|
msgid "GPIO pin to monitor:"
|
||||||
|
msgstr "GPIO pin for analyse"
|
||||||
|
|
||||||
|
#: setup.php:313
|
||||||
|
msgid "State that signalizes online-state:"
|
||||||
|
msgstr "Tilstand, som signalerer Online-status"
|
||||||
|
|
||||||
|
#: setup.php:317
|
||||||
|
msgid "Show link to QRZ.com on Callsigns"
|
||||||
|
msgstr "Vis link til QRZ.com på kaldesignal"
|
||||||
|
|
||||||
|
#: setup.php:321
|
||||||
|
msgid "RSSI value"
|
||||||
|
msgstr "RSSI værdier"
|
||||||
|
|
||||||
|
#: setup.php:323
|
||||||
|
msgid "minimal"
|
||||||
|
msgstr "minimal"
|
||||||
|
|
||||||
|
#: setup.php:324
|
||||||
|
msgid "maximal"
|
||||||
|
msgstr "maximal"
|
||||||
|
|
||||||
|
#: setup.php:325
|
||||||
|
msgid "average"
|
||||||
|
msgstr "gennemsnit"
|
||||||
|
|
||||||
|
#: setup.php:331
|
||||||
|
msgid "Save configuration"
|
||||||
|
msgstr "Gem konfigurationen"
|
||||||
|
|
||||||
|
#: include/functions.php:13 include/functions.php:15
|
||||||
|
msgid "compiled"
|
||||||
|
msgstr "kompileret"
|
||||||
|
|
||||||
|
#: include/functions.php:161
|
||||||
|
msgid "ircddbgateway is down!"
|
||||||
|
msgstr "ircddbgateway er inaktiv"
|
||||||
|
|
||||||
|
#: include/functions.php:164 include/functions.php:175
|
||||||
|
msgid "Remote gateway configured - not checked!"
|
||||||
|
msgstr "Remote gateway konfigureret - ikke kontrolleret"
|
||||||
|
|
||||||
|
#: include/functions.php:172
|
||||||
|
msgid "YSFGateway is down!"
|
||||||
|
msgstr "YSFGateway er inaktiv"
|
||||||
|
|
||||||
|
#: include/functions.php:182
|
||||||
|
msgid "MMDVMHost is down!"
|
||||||
|
msgstr "MMDVMHost er inaktiv"
|
||||||
|
|
||||||
|
#: include/functions.php:550
|
||||||
|
msgid "idle"
|
||||||
|
msgstr "idle"
|
||||||
|
|
||||||
|
#: include/functions.php:623
|
||||||
|
msgid "ircddbgateway not running!"
|
||||||
|
msgstr "ircddbgateway er ikke startet"
|
||||||
|
|
||||||
|
#: include/functions.php:640 include/functions.php:656
|
||||||
|
#: include/functions.php:741
|
||||||
|
msgid "not linked"
|
||||||
|
msgstr "ikke forbundet"
|
||||||
|
|
||||||
|
#: include/functions.php:692
|
||||||
|
msgid "something went wrong!"
|
||||||
|
msgstr "noget gik galt"
|
||||||
|
|
||||||
|
#: include/functions.php:706 include/functions.php:724
|
||||||
|
msgid "Reflector not linked"
|
||||||
|
msgstr "Reflector ikke forbundet"
|
||||||
|
|
||||||
|
#: include/functions.php:708 include/functions.php:719
|
||||||
|
msgid "Reflector"
|
||||||
|
msgstr "Reflector"
|
||||||
|
|
||||||
|
#: include/functions.php:719
|
||||||
|
msgid "not cfmd"
|
||||||
|
msgstr "ikke bekræftet"
|
||||||
|
|
||||||
|
#: include/functions.php:743
|
||||||
|
msgid "YSFGateway not running"
|
||||||
|
msgstr "YSFGateway er ikke startet"
|
||||||
|
|
||||||
|
#: include/functions.php:830
|
||||||
|
msgid "DMRIDs.dat not correct!"
|
||||||
|
msgstr "DMRIDs.dat er ikke rigtigt"
|
||||||
|
|
||||||
|
#: index.php:78
|
||||||
|
msgid "Configuration"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:209
|
||||||
|
msgid "Use networks.php instead of configuration below"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/lh_ajax.php:6
|
||||||
|
msgid "Cached"
|
||||||
|
msgstr ""
|
23
html/locale/da_DK/settings.php
Executable file
|
@ -0,0 +1,23 @@
|
||||||
|
<?php
|
||||||
|
define("LANG_NAME", "Danish");
|
||||||
|
define("LANG_LOCALE", "da_DK");
|
||||||
|
define("LANG", "da");
|
||||||
|
define("LANGCODE", "da");
|
||||||
|
define("DATATABLESTRANSLATION", '{
|
||||||
|
"sProcessing": "Henter...",
|
||||||
|
"sLengthMenu": "Vis _MENU_ linjer",
|
||||||
|
"sZeroRecords": "Ingen linjer matcher søgningen",
|
||||||
|
"sInfo": "Viser _START_ til _END_ af _TOTAL_ linjer",
|
||||||
|
"sInfoEmpty": "Viser 0 til 0 af 0 linjer",
|
||||||
|
"sInfoFiltered": "(filtreret fra _MAX_ linjer)",
|
||||||
|
"sInfoPostFix": "",
|
||||||
|
"sSearch": "Søg:",
|
||||||
|
"sUrl": "",
|
||||||
|
"oPaginate": {
|
||||||
|
"sFirst": "Første",
|
||||||
|
"sPrevious": "Forrige",
|
||||||
|
"sNext": "Næste",
|
||||||
|
"sLast": "Sidste"
|
||||||
|
}
|
||||||
|
}');
|
||||||
|
?>
|
BIN
html/locale/de_DE/LC_MESSAGES/messages.mo
Executable file
748
html/locale/de_DE/LC_MESSAGES/messages.po
Executable file
|
@ -0,0 +1,748 @@
|
||||||
|
# Translation-Template
|
||||||
|
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||||
|
# This file is distributed under the same license as the PACKAGE package.
|
||||||
|
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||||
|
#
|
||||||
|
#, fuzzy
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: 2017-03-13\n"
|
||||||
|
"Report-Msgid-Bugs-To: dg9vh@darc.de\n"
|
||||||
|
"POT-Creation-Date: 2017-03-14 13:47+0000\n"
|
||||||
|
"PO-Revision-Date: 2017-03-14 14:47+0000\n"
|
||||||
|
"Last-Translator: Kim - DG9VH <dg9vh@darc.de>\n"
|
||||||
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
"Language: de\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
|
||||||
|
#: index.php:183
|
||||||
|
msgid "Custom Info"
|
||||||
|
msgstr "Benutzerdefinierte Informationen"
|
||||||
|
|
||||||
|
#: index.php:191
|
||||||
|
msgid "File custom.php not found! Did you forget to create it?"
|
||||||
|
msgstr "Datei custom.php nicht gefunden. Hast du vergessen, diese anzulegen?"
|
||||||
|
|
||||||
|
#: include/sysinfo_ajax.php:3
|
||||||
|
msgid "System Info"
|
||||||
|
msgstr "System Informationen"
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:5
|
||||||
|
msgid "YSFGateway-Infos"
|
||||||
|
msgstr "YSFGateway-Informationen"
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:13
|
||||||
|
msgid "YSFGateway Process is running"
|
||||||
|
msgstr "YSFGateway läuft"
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:16
|
||||||
|
msgid "YSFGateway Process is down!"
|
||||||
|
msgstr "YSFGateway beendet!"
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:25
|
||||||
|
msgid "YSFReflectors reported active"
|
||||||
|
msgstr "YSFReflektoren, die aktiv gemeldet sind"
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:37
|
||||||
|
msgid "No."
|
||||||
|
msgstr "Nr."
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:38 include/localtx_ajax.php:19
|
||||||
|
#: include/lh_ajax.php:19 include/txinfo.php:16
|
||||||
|
msgid "Name"
|
||||||
|
msgstr "Name"
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:39
|
||||||
|
msgid "Description"
|
||||||
|
msgstr "Beschreibung"
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:40
|
||||||
|
msgid "ID"
|
||||||
|
msgstr "ID"
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:41
|
||||||
|
msgid "Connections"
|
||||||
|
msgstr "Verbindungen"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:6
|
||||||
|
msgid "Today's local transmissions"
|
||||||
|
msgstr "Heute lokal gehört"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:13 include/lh_ajax.php:13 include/txinfo.php:10
|
||||||
|
msgid "Time"
|
||||||
|
msgstr "Zeit"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:14 include/lh_ajax.php:14 include/txinfo.php:11
|
||||||
|
msgid "Mode"
|
||||||
|
msgstr "Modus"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:15 include/lh_ajax.php:15 include/txinfo.php:12
|
||||||
|
msgid "Callsign"
|
||||||
|
msgstr "Rufzeichen"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:23 include/lh_ajax.php:23 include/txinfo.php:25
|
||||||
|
msgid "DSTAR-ID"
|
||||||
|
msgstr "DSTAR-ID"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:24 include/lh_ajax.php:24 include/txinfo.php:26
|
||||||
|
msgid "Target"
|
||||||
|
msgstr "Ziel"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:25 include/lh_ajax.php:25 include/txinfo.php:27
|
||||||
|
msgid "Source"
|
||||||
|
msgstr "Quelle"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:26 include/lh_ajax.php:26
|
||||||
|
msgid "Dur (s)"
|
||||||
|
msgstr "Dauer (s)"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:27 include/lh_ajax.php:27
|
||||||
|
msgid "Loss"
|
||||||
|
msgstr "Verlust"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:28 include/lh_ajax.php:28
|
||||||
|
msgid "BER"
|
||||||
|
msgstr "BER"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:30
|
||||||
|
msgid "RSSI (min)"
|
||||||
|
msgstr "RSSI (min)"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:31
|
||||||
|
msgid "RSSI (max)"
|
||||||
|
msgstr "RSSI (max)"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:32 include/localtx_ajax.php:33
|
||||||
|
msgid "RSSI (avg)"
|
||||||
|
msgstr "RSSI (Mittel)"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:3
|
||||||
|
msgid "Repeater Info"
|
||||||
|
msgstr "Repeater Informationen"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:9
|
||||||
|
msgid "Current Mode"
|
||||||
|
msgstr "Aktueller Mode"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:13
|
||||||
|
msgid "D-Star linked to"
|
||||||
|
msgstr "D-Star verlinkt mit"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:18
|
||||||
|
msgid "YSF linked to"
|
||||||
|
msgstr "YSF verlinkt mit"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:23
|
||||||
|
msgid "DMR TS1 last linked to"
|
||||||
|
msgstr "DMR TS1 zuletzt verlinkt mit"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:24
|
||||||
|
msgid "DMR TS2 last linked to"
|
||||||
|
msgstr "DMR TS2 zuletzt verlinkt mit"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:48
|
||||||
|
msgid "Location"
|
||||||
|
msgstr "Standort"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:49
|
||||||
|
msgid "TX-Freq."
|
||||||
|
msgstr "TX-Freq."
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:50
|
||||||
|
msgid "RX-Freq."
|
||||||
|
msgstr "RX-Freq."
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:54
|
||||||
|
msgid "YSFGateway"
|
||||||
|
msgstr "YSFGateway"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:59
|
||||||
|
msgid "DMR CC"
|
||||||
|
msgstr "DMR CC"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:63
|
||||||
|
msgid "DMR-Master"
|
||||||
|
msgstr "DMR-Master"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:64
|
||||||
|
msgid "TS1"
|
||||||
|
msgstr "TS1"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:65
|
||||||
|
msgid "TS2"
|
||||||
|
msgstr "TS2"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:97 include/repeaterinfo.php:104
|
||||||
|
msgid "enabled"
|
||||||
|
msgstr "aktiviert"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:99 include/repeaterinfo.php:106
|
||||||
|
msgid "disabled"
|
||||||
|
msgstr "deaktiviert"
|
||||||
|
|
||||||
|
#: include/tools.php:73
|
||||||
|
msgid ""
|
||||||
|
"You are using an old config.php. Please configure your Dashboard by calling "
|
||||||
|
"<a href=\"setup.php\">setup.php</a>!"
|
||||||
|
msgstr "Du benutzt eine alte config.php. Bitte das Dashboard noch einmal konfigurieren mit <a href=\"setup.php\">setup.php</a>!"
|
||||||
|
|
||||||
|
#: include/tools.php:79
|
||||||
|
msgid ""
|
||||||
|
"You forgot to remove setup.php in root-directory of your dashboard or you "
|
||||||
|
"forgot to configure it! Please delete the file or configure your Dashboard "
|
||||||
|
"by calling <a href=\"setup.php\">setup.php</a>!"
|
||||||
|
msgstr "Du hast vergessen, die setup.php im Hauptverzeichnis des Dashboards zu löschen oder du hast das Dashboard vergessen zu konfigurieren. Bitte die Datei löschen oder das Dashboard konfigurieren unter <a href=\"setup.php\">setup.php</a>!"
|
||||||
|
|
||||||
|
#: include/modes.php:3
|
||||||
|
msgid "Enabled Modes"
|
||||||
|
msgstr "Aktive Modi"
|
||||||
|
|
||||||
|
#: include/lh_ajax.php:6
|
||||||
|
msgid "Last Heard List of today's"
|
||||||
|
msgstr "Zuletzt gehörte"
|
||||||
|
|
||||||
|
#: include/lh_ajax.php:6
|
||||||
|
msgid "callsigns."
|
||||||
|
msgstr "Rufzeichen von heute."
|
||||||
|
|
||||||
|
#: include/disk.php:3
|
||||||
|
msgid "Disk Use"
|
||||||
|
msgstr "Plattennutzung"
|
||||||
|
|
||||||
|
#: include/disk.php:10
|
||||||
|
msgid "File System"
|
||||||
|
msgstr "Dateisystem"
|
||||||
|
|
||||||
|
#: include/disk.php:11
|
||||||
|
msgid "Mount Point"
|
||||||
|
msgstr "Einhängepunkt"
|
||||||
|
|
||||||
|
#: include/disk.php:12
|
||||||
|
msgid "Use"
|
||||||
|
msgstr "Benutzt"
|
||||||
|
|
||||||
|
#: include/disk.php:13
|
||||||
|
msgid "Free"
|
||||||
|
msgstr "Frei"
|
||||||
|
|
||||||
|
#: include/disk.php:14
|
||||||
|
msgid "Used"
|
||||||
|
msgstr "Benutzt"
|
||||||
|
|
||||||
|
#: include/disk.php:15
|
||||||
|
msgid "Total"
|
||||||
|
msgstr "Gesamt"
|
||||||
|
|
||||||
|
#: include/txinfo.php:3
|
||||||
|
msgid "Currently TXing"
|
||||||
|
msgstr "Aktuelle Aussendung"
|
||||||
|
|
||||||
|
#: include/txinfo.php:21
|
||||||
|
msgid "Talker Alias"
|
||||||
|
msgstr "Talker Alias"
|
||||||
|
|
||||||
|
#: include/txinfo.php:28
|
||||||
|
msgid "TX-Time"
|
||||||
|
msgstr "TX-Zeit"
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:50 scripts/halt.php:49 scripts/log.php:53
|
||||||
|
#: scripts/reboot.php:50 index.php:59
|
||||||
|
msgid "for"
|
||||||
|
msgstr "für"
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:52 scripts/halt.php:51 scripts/log.php:55
|
||||||
|
#: scripts/reboot.php:52 index.php:61
|
||||||
|
msgid "Repeater"
|
||||||
|
msgstr "Repeater"
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:54 scripts/halt.php:53 scripts/log.php:57
|
||||||
|
#: scripts/reboot.php:54 index.php:63
|
||||||
|
msgid "Hotspot"
|
||||||
|
msgstr "Hotspot"
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:58 scripts/reboot.php:58
|
||||||
|
msgid "Home"
|
||||||
|
msgstr "Startseite"
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:67 scripts/reboot.php:66
|
||||||
|
msgid "Executing"
|
||||||
|
msgstr "Ausführung von"
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:67
|
||||||
|
msgid "Reboot MMDVMHost service in progress"
|
||||||
|
msgstr "Neustart des MMDVMHost läuft"
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:90 scripts/halt.php:89 scripts/log.php:134
|
||||||
|
#: scripts/reboot.php:89 index.php:174
|
||||||
|
msgid "get your own at:"
|
||||||
|
msgstr "herunterladen unter:"
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:90 scripts/halt.php:89 scripts/log.php:134
|
||||||
|
#: scripts/reboot.php:89 index.php:174 credits.php:13 credits.php:17
|
||||||
|
msgid "Credits"
|
||||||
|
msgstr "Dankesworte"
|
||||||
|
|
||||||
|
#: scripts/halt.php:66
|
||||||
|
msgid "Halt in progress...bye"
|
||||||
|
msgstr "System wird heruntergefahen ... Tschüss"
|
||||||
|
|
||||||
|
#: scripts/log.php:61 index.php:100
|
||||||
|
msgid "View Log"
|
||||||
|
msgstr "Log anzeigen"
|
||||||
|
|
||||||
|
#: scripts/log.php:62 index.php:101
|
||||||
|
msgid "Reboot MMDVMHost"
|
||||||
|
msgstr "MMDVMHost neustarten"
|
||||||
|
|
||||||
|
#: scripts/log.php:63 index.php:102
|
||||||
|
msgid "Reboot System"
|
||||||
|
msgstr "System neustarten"
|
||||||
|
|
||||||
|
#: scripts/log.php:64 index.php:103
|
||||||
|
msgid "ShutDown System"
|
||||||
|
msgstr "System herunterfahren"
|
||||||
|
|
||||||
|
#: scripts/log.php:68 index.php:108
|
||||||
|
msgid "DMRplus"
|
||||||
|
msgstr "DMRplus"
|
||||||
|
|
||||||
|
#: scripts/log.php:69 index.php:109
|
||||||
|
msgid "BrandMeister"
|
||||||
|
msgstr "BrandMeister"
|
||||||
|
|
||||||
|
#: scripts/log.php:76
|
||||||
|
msgid "Viewing log"
|
||||||
|
msgstr "Zeige Log"
|
||||||
|
|
||||||
|
#: scripts/log.php:82
|
||||||
|
msgid "Level"
|
||||||
|
msgstr "Niveau"
|
||||||
|
|
||||||
|
#: scripts/log.php:83
|
||||||
|
msgid "Timestamp"
|
||||||
|
msgstr "Zeitstempel"
|
||||||
|
|
||||||
|
#: scripts/log.php:84
|
||||||
|
msgid "Info"
|
||||||
|
msgstr "Information"
|
||||||
|
|
||||||
|
#: scripts/reboot.php:66
|
||||||
|
msgid "Reboot system in progress"
|
||||||
|
msgstr "System wird neugestartet"
|
||||||
|
|
||||||
|
#: ajax.php:214
|
||||||
|
msgid "Power"
|
||||||
|
msgstr "Stromversorgung"
|
||||||
|
|
||||||
|
#: ajax.php:219
|
||||||
|
msgid "CPU-Temperature"
|
||||||
|
msgstr "CPU-Temperatur"
|
||||||
|
|
||||||
|
#: ajax.php:224
|
||||||
|
msgid "CPU-Frequency"
|
||||||
|
msgstr "CPU-Frequenz"
|
||||||
|
|
||||||
|
#: ajax.php:228
|
||||||
|
msgid "System-Load"
|
||||||
|
msgstr "System-Last"
|
||||||
|
|
||||||
|
#: ajax.php:229
|
||||||
|
msgid "CPU-Usage"
|
||||||
|
msgstr "CPU-Nutzung"
|
||||||
|
|
||||||
|
#: ajax.php:230
|
||||||
|
msgid "Uptime"
|
||||||
|
msgstr "Laufzeit"
|
||||||
|
|
||||||
|
#: ajax.php:231
|
||||||
|
msgid "Idle"
|
||||||
|
msgstr "wartend"
|
||||||
|
|
||||||
|
#: ajax.php:237
|
||||||
|
msgid "online"
|
||||||
|
msgstr "Netzbetrieb"
|
||||||
|
|
||||||
|
#: ajax.php:237
|
||||||
|
msgid "on battery"
|
||||||
|
msgstr "Batteriebetrieb"
|
||||||
|
|
||||||
|
#: index.php:70
|
||||||
|
msgid "DMR-Network: "
|
||||||
|
msgstr "DMR-Netzwerk: "
|
||||||
|
|
||||||
|
#: index.php:159
|
||||||
|
msgid "Last Reload"
|
||||||
|
msgstr "Letzte Aktualisierung"
|
||||||
|
|
||||||
|
#: index.php:169
|
||||||
|
msgid "stop refreshing"
|
||||||
|
msgstr "Neuladen stoppen"
|
||||||
|
|
||||||
|
#: index.php:171
|
||||||
|
msgid "start refreshing"
|
||||||
|
msgstr "Neuladen aktivieren"
|
||||||
|
|
||||||
|
#: credits.php:20
|
||||||
|
msgid ""
|
||||||
|
"I think, after all the time this dashboard is developed mainly by myself, it "
|
||||||
|
"is time to say \"Thank you\" to all those, wo delivered some ideas or code "
|
||||||
|
"into this project."
|
||||||
|
msgstr "Ich denke, nach all der Zeit, die dieses Dashboard hauptsächlich durch mich entwickelt wurde, ist es Zeit, einmal \"Danke\" all denen zu sagen, die Ideen oder Code diesem Projekt beisteuerten."
|
||||||
|
|
||||||
|
#: credits.php:21
|
||||||
|
msgid "This are explicit named following persons:"
|
||||||
|
msgstr "Da wären im speziellen folgende Personen:"
|
||||||
|
|
||||||
|
#: credits.php:31
|
||||||
|
msgid "and some others..."
|
||||||
|
msgstr "und weitere..."
|
||||||
|
|
||||||
|
#: credits.php:33
|
||||||
|
msgid ""
|
||||||
|
"Those, who felt forgotten, feel free to commit a change into github of this "
|
||||||
|
"file."
|
||||||
|
msgstr "Die, die ich vergessen habe, dürfen sich gerne per Commit über Github hier eintragen."
|
||||||
|
|
||||||
|
#: credits.php:34
|
||||||
|
msgid "Many thanks to you all!"
|
||||||
|
msgstr "Vielen Dank euch allen!"
|
||||||
|
|
||||||
|
#: credits.php:35
|
||||||
|
msgid "Best 73, Kim, DG9VH"
|
||||||
|
msgstr "Beste 73, Kim, DG9VH"
|
||||||
|
|
||||||
|
#: setup.php:26
|
||||||
|
msgid ""
|
||||||
|
"You forgot to give write-permissions to your webserver-user, see point 3 in "
|
||||||
|
"<a href=\"linux-step-by-step.md\">linux-step-by-step.md</a>!"
|
||||||
|
msgstr "Bitte Schreibrechte für den Webserver geben, siehe Punkt 3 in <a href=\"linux-step-by-step.md\">linux-step-by-step.md</a>!"
|
||||||
|
|
||||||
|
#: setup.php:41 setup.php:50
|
||||||
|
msgid "Setup-Process"
|
||||||
|
msgstr "Setup-Prozess"
|
||||||
|
|
||||||
|
#: setup.php:42
|
||||||
|
msgid ""
|
||||||
|
"Your config-file is written in config/config.php, please remove setup.php "
|
||||||
|
"for security reasons!"
|
||||||
|
msgstr "Deine Konfiguration ist in config/config.php, bitte setup.php entfernen!"
|
||||||
|
|
||||||
|
#: setup.php:43
|
||||||
|
msgid "Your dashboard is now available."
|
||||||
|
msgstr "Dein Dashboard ist nun verfügbar."
|
||||||
|
|
||||||
|
#: setup.php:51
|
||||||
|
msgid "Please give necessary information below"
|
||||||
|
msgstr "Bitte unten die notwendigen Informationen ausfüllen"
|
||||||
|
|
||||||
|
#: setup.php:56
|
||||||
|
msgid "MMDVMHost-Configuration"
|
||||||
|
msgstr "MMDVMHost-Einstellungen"
|
||||||
|
|
||||||
|
#: setup.php:58
|
||||||
|
msgid "Path to MMDVMHost-logfile"
|
||||||
|
msgstr "Pfad zur MMDVMHost-Logdatei"
|
||||||
|
|
||||||
|
#: setup.php:62
|
||||||
|
msgid "Path to MMDVM.ini"
|
||||||
|
msgstr "PFad zur MMDVM.ini"
|
||||||
|
|
||||||
|
#: setup.php:66
|
||||||
|
msgid "MMDVM.ini-filename"
|
||||||
|
msgstr "MMDVM.ini-Dateiname"
|
||||||
|
|
||||||
|
#: setup.php:70
|
||||||
|
msgid "Path to MMDVMHost-executable"
|
||||||
|
msgstr "Pfad zum MMDVMHost-Programm"
|
||||||
|
|
||||||
|
#: setup.php:74
|
||||||
|
msgid "Enable extended lookup (show names)"
|
||||||
|
msgstr "Aktiviere Namensauflösung"
|
||||||
|
|
||||||
|
#: setup.php:78
|
||||||
|
msgid "Show Talker Alias"
|
||||||
|
msgstr "Zeige Talker Alias"
|
||||||
|
|
||||||
|
#: setup.php:82
|
||||||
|
msgid "Path to DMR-ID-Database-File (including filename)"
|
||||||
|
msgstr "Pfad zur DMRIDs.dat (inkl. Dateiname)"
|
||||||
|
|
||||||
|
#: setup.php:87
|
||||||
|
msgid "YSFGateway-Configuration"
|
||||||
|
msgstr "YSFGateway-Einstellungen"
|
||||||
|
|
||||||
|
#: setup.php:89
|
||||||
|
msgid "Enable YSFGateway"
|
||||||
|
msgstr "YSFGateway aktiv"
|
||||||
|
|
||||||
|
#: setup.php:93
|
||||||
|
msgid "Path to YSFGateway-logfile"
|
||||||
|
msgstr "Pfad zu YSFGateway-Logdatei"
|
||||||
|
|
||||||
|
#: setup.php:97
|
||||||
|
msgid "Logfile-prefix"
|
||||||
|
msgstr "Logdatei-Prefix"
|
||||||
|
|
||||||
|
#: setup.php:101
|
||||||
|
msgid "Path to YSFGateway.ini"
|
||||||
|
msgstr "Pfat zu YSFGateway.ini"
|
||||||
|
|
||||||
|
#: setup.php:105
|
||||||
|
msgid "YSFGateway.ini-filename"
|
||||||
|
msgstr "YSFGateway.ini-Dateiname"
|
||||||
|
|
||||||
|
#: setup.php:109
|
||||||
|
msgid "Path to YSFHosts.txt"
|
||||||
|
msgstr "Pfad zu YSFHosts.txt"
|
||||||
|
|
||||||
|
#: setup.php:113
|
||||||
|
msgid "YSFHosts.txt-filename"
|
||||||
|
msgstr "YSFHosts.txt-Dateiname"
|
||||||
|
|
||||||
|
#: setup.php:118
|
||||||
|
msgid "ircddbgateway-Configuration"
|
||||||
|
msgstr "ircddbgateway-Einstellungen"
|
||||||
|
|
||||||
|
#: setup.php:120
|
||||||
|
msgid "Path to Links.log"
|
||||||
|
msgstr "Pfad zu Links.log"
|
||||||
|
|
||||||
|
#: setup.php:124
|
||||||
|
msgid "Name of ircddbgateway-executeable"
|
||||||
|
msgstr "Name des ircddbgateway-Prozesses"
|
||||||
|
|
||||||
|
#: setup.php:129
|
||||||
|
msgid "Global Configuration"
|
||||||
|
msgstr "Globale Einstellungen"
|
||||||
|
|
||||||
|
#: setup.php:188
|
||||||
|
msgid "Locale"
|
||||||
|
msgstr "Locale"
|
||||||
|
|
||||||
|
#: setup.php:192
|
||||||
|
msgid "URL to Logo"
|
||||||
|
msgstr "URL zu allg. Logo"
|
||||||
|
|
||||||
|
#: setup.php:196
|
||||||
|
msgid "URL to DMRplus-Logo"
|
||||||
|
msgstr "URL zu DMRplus-Logo"
|
||||||
|
|
||||||
|
#: setup.php:200
|
||||||
|
msgid "URL to BrandMeister-Logo"
|
||||||
|
msgstr "URL zu BrandMeister-Logo"
|
||||||
|
|
||||||
|
#: setup.php:204
|
||||||
|
msgid "Refresh page after in seconds"
|
||||||
|
msgstr "Seite neuladen nach ... Sekunden"
|
||||||
|
|
||||||
|
#: setup.php:208
|
||||||
|
msgid "Show System Info"
|
||||||
|
msgstr "Zeige System Informationen"
|
||||||
|
|
||||||
|
#: setup.php:212
|
||||||
|
msgid "Show Disk Use"
|
||||||
|
msgstr "Zeige Disk-Nutzung"
|
||||||
|
|
||||||
|
#: setup.php:216
|
||||||
|
msgid "Show Repeater Info"
|
||||||
|
msgstr "Zeige Repeater Informationen"
|
||||||
|
|
||||||
|
#: setup.php:220
|
||||||
|
msgid "Show Enabled Modes"
|
||||||
|
msgstr "Zeige aktive Modi"
|
||||||
|
|
||||||
|
#: setup.php:224
|
||||||
|
msgid "Show Last Heard List of today's"
|
||||||
|
msgstr "Zeige Zuletzt-gehört-Liste"
|
||||||
|
|
||||||
|
#: setup.php:228
|
||||||
|
msgid "Show Today's local transmissions"
|
||||||
|
msgstr "Zeige heutige lokale Aussendungen"
|
||||||
|
|
||||||
|
#: setup.php:232
|
||||||
|
msgid "Show progressbars"
|
||||||
|
msgstr "Fortschrittsbalken"
|
||||||
|
|
||||||
|
#: setup.php:236
|
||||||
|
msgid "Enable CPU-temperature-warning"
|
||||||
|
msgstr "CPU-Temp. Warung aktivieren"
|
||||||
|
|
||||||
|
#: setup.php:240
|
||||||
|
msgid "Warning temperature"
|
||||||
|
msgstr "Warn-Temperatur"
|
||||||
|
|
||||||
|
#: setup.php:244
|
||||||
|
msgid "Enable Network-Switching-Function"
|
||||||
|
msgstr "Netzwerk-Umschaltung aktivieren"
|
||||||
|
|
||||||
|
#: setup.php:248
|
||||||
|
msgid "Username for switching networks:"
|
||||||
|
msgstr "Netzwerk-Umschalten-Benutzer:"
|
||||||
|
|
||||||
|
#: setup.php:252
|
||||||
|
msgid "Password for switching networks:"
|
||||||
|
msgstr "Netzwerk-Umschalten-Passwort:"
|
||||||
|
|
||||||
|
#: setup.php:257
|
||||||
|
msgid "Enable Management-Functions below"
|
||||||
|
msgstr "Wartungs-Funktionen unten aktivieren"
|
||||||
|
|
||||||
|
#: setup.php:261
|
||||||
|
msgid "Username for view log:"
|
||||||
|
msgstr "Log-Anzeigen-Benutzer:"
|
||||||
|
|
||||||
|
#: setup.php:265
|
||||||
|
msgid "Password for view log:"
|
||||||
|
msgstr "Log-Anzeigen-Passwort:"
|
||||||
|
|
||||||
|
#: setup.php:269
|
||||||
|
msgid "Username for halt:"
|
||||||
|
msgstr "Ausschalten-Benutzer:"
|
||||||
|
|
||||||
|
#: setup.php:273
|
||||||
|
msgid "Password for halt:"
|
||||||
|
msgstr "Ausschalten-Passwort:"
|
||||||
|
|
||||||
|
#: setup.php:277
|
||||||
|
msgid "Username for reboot:"
|
||||||
|
msgstr "Reboot-Benutzer:"
|
||||||
|
|
||||||
|
#: setup.php:281
|
||||||
|
msgid "Password for reboot:"
|
||||||
|
msgstr "Reboot-Passwort:"
|
||||||
|
|
||||||
|
#: setup.php:285
|
||||||
|
msgid "Username for restart:"
|
||||||
|
msgstr "Neustart-Benutzer:"
|
||||||
|
|
||||||
|
#: setup.php:289
|
||||||
|
msgid "Password for restart:"
|
||||||
|
msgstr "Neustart-Passwort:"
|
||||||
|
|
||||||
|
#: setup.php:293
|
||||||
|
msgid "Reboot MMDVMHost command:"
|
||||||
|
msgstr "MMDVMHost-Neustart Kommando:"
|
||||||
|
|
||||||
|
#: setup.php:297
|
||||||
|
msgid "Reboot system command:"
|
||||||
|
msgstr "Reboot-Kommando:"
|
||||||
|
|
||||||
|
#: setup.php:301
|
||||||
|
msgid "Halt system command:"
|
||||||
|
msgstr "Herunterfahren-Kommando:"
|
||||||
|
|
||||||
|
#: setup.php:305
|
||||||
|
msgid "Show Powerstate (online or battery, wiringpi needed)"
|
||||||
|
msgstr "Stromversorgung (Netz oder Batterie, wiringpi notwendig)"
|
||||||
|
|
||||||
|
#: setup.php:309
|
||||||
|
msgid "GPIO pin to monitor:"
|
||||||
|
msgstr "GPIO-Pin zur Auswertung:"
|
||||||
|
|
||||||
|
#: setup.php:313
|
||||||
|
msgid "State that signalizes online-state:"
|
||||||
|
msgstr "Status für Netzversorgung:"
|
||||||
|
|
||||||
|
#: setup.php:317
|
||||||
|
msgid "Show link to QRZ.com on Callsigns"
|
||||||
|
msgstr "QRZ.com-Link auf Rufzeichen"
|
||||||
|
|
||||||
|
#: setup.php:321
|
||||||
|
msgid "RSSI value"
|
||||||
|
msgstr "RSSI Wert"
|
||||||
|
|
||||||
|
#: setup.php:323
|
||||||
|
msgid "minimal"
|
||||||
|
msgstr "Minimum"
|
||||||
|
|
||||||
|
#: setup.php:324
|
||||||
|
msgid "maximal"
|
||||||
|
msgstr "Maximum"
|
||||||
|
|
||||||
|
#: setup.php:325
|
||||||
|
msgid "average"
|
||||||
|
msgstr "Mittelwert"
|
||||||
|
|
||||||
|
#: setup.php:331
|
||||||
|
msgid "Save configuration"
|
||||||
|
msgstr "Konfiguration speichern"
|
||||||
|
|
||||||
|
#: include/functions.php:13 include/functions.php:15
|
||||||
|
msgid "compiled"
|
||||||
|
msgstr "übersetzt am"
|
||||||
|
|
||||||
|
#: include/functions.php:161
|
||||||
|
msgid "ircddbgateway is down!"
|
||||||
|
msgstr "ircddbgateway läuft nicht!"
|
||||||
|
|
||||||
|
#: include/functions.php:164 include/functions.php:175
|
||||||
|
msgid "Remote gateway configured - not checked!"
|
||||||
|
msgstr "Entferntes Gateway konfiguriert - wird nicht geprüft!"
|
||||||
|
|
||||||
|
#: include/functions.php:172
|
||||||
|
msgid "YSFGateway is down!"
|
||||||
|
msgstr "YSFGateway läuft nicht!"
|
||||||
|
|
||||||
|
#: include/functions.php:182
|
||||||
|
msgid "MMDVMHost is down!"
|
||||||
|
msgstr "MMDVMHost läuft nicht!"
|
||||||
|
|
||||||
|
#: include/functions.php:550
|
||||||
|
msgid "idle"
|
||||||
|
msgstr "wartend"
|
||||||
|
|
||||||
|
#: include/functions.php:623
|
||||||
|
msgid "ircddbgateway not running!"
|
||||||
|
msgstr "ircddbgateway läuft nicht!"
|
||||||
|
|
||||||
|
#: include/functions.php:640 include/functions.php:656
|
||||||
|
#: include/functions.php:741
|
||||||
|
msgid "not linked"
|
||||||
|
msgstr "nicht verbunden"
|
||||||
|
|
||||||
|
#: include/functions.php:692
|
||||||
|
msgid "something went wrong!"
|
||||||
|
msgstr "Irgendwas lief schief!"
|
||||||
|
|
||||||
|
#: include/functions.php:706 include/functions.php:724
|
||||||
|
msgid "Reflector not linked"
|
||||||
|
msgstr "Reflektor nicht verbunden"
|
||||||
|
|
||||||
|
#: include/functions.php:708 include/functions.php:719
|
||||||
|
msgid "Reflector"
|
||||||
|
msgstr "Reflektor"
|
||||||
|
|
||||||
|
#: include/functions.php:719
|
||||||
|
msgid "not cfmd"
|
||||||
|
msgstr "unbestätigt"
|
||||||
|
|
||||||
|
#: include/functions.php:743
|
||||||
|
msgid "YSFGateway not running"
|
||||||
|
msgstr "YSFGateway läuft nicht"
|
||||||
|
|
||||||
|
#: include/functions.php:830
|
||||||
|
msgid "DMRIDs.dat not correct!"
|
||||||
|
msgstr "DMRIDs.dat nicht korrekt!"
|
||||||
|
|
||||||
|
#: index.php:78
|
||||||
|
msgid "Configuration"
|
||||||
|
msgstr "Konfiguration"
|
||||||
|
|
||||||
|
#: setup.php:209
|
||||||
|
msgid "Use networks.php instead of configuration below"
|
||||||
|
msgstr "Nutze networks.php statt d. Konfig. unten"
|
||||||
|
|
||||||
|
#: include/lh_ajax.php:6
|
||||||
|
msgid "Cached"
|
||||||
|
msgstr "Zwischengespeichert"
|
||||||
|
|
||||||
|
#: index.php:144
|
||||||
|
msgid "ReflSwitch"
|
||||||
|
msgstr "Reflektor umschalten"
|
||||||
|
|
||||||
|
#: setup.php:146
|
||||||
|
msgid "Timezone"
|
||||||
|
msgstr "Zeitzone"
|
||||||
|
|
29
html/locale/de_DE/settings.php
Executable file
|
@ -0,0 +1,29 @@
|
||||||
|
<?php
|
||||||
|
define("LANG_NAME", "Deutsch");
|
||||||
|
define("LANG_LOCALE", "de_DE");
|
||||||
|
define("LANG", "de");
|
||||||
|
define("LANGCODE", "de");
|
||||||
|
define("DATATABLESTRANSLATION", '{
|
||||||
|
"sEmptyTable": "Keine Daten in der Tabelle vorhanden",
|
||||||
|
"sInfo": "_START_ bis _END_ von _TOTAL_ Einträgen",
|
||||||
|
"sInfoEmpty": "0 bis 0 von 0 Einträgen",
|
||||||
|
"sInfoFiltered": "(gefiltert von _MAX_ Einträgen)",
|
||||||
|
"sInfoPostFix": "",
|
||||||
|
"sInfoThousands": ".",
|
||||||
|
"sLengthMenu": "_MENU_ Einträge anzeigen",
|
||||||
|
"sLoadingRecords": "Wird geladen...",
|
||||||
|
"sProcessing": "Bitte warten...",
|
||||||
|
"sSearch": "Suchen",
|
||||||
|
"sZeroRecords": "Keine Einträge vorhanden.",
|
||||||
|
"oPaginate": {
|
||||||
|
"sFirst": "Erste",
|
||||||
|
"sPrevious": "Zurück",
|
||||||
|
"sNext": "Nächste",
|
||||||
|
"sLast": "Letzte"
|
||||||
|
},
|
||||||
|
"oAria": {
|
||||||
|
"sSortAscending": ": aktivieren, um Spalte aufsteigend zu sortieren",
|
||||||
|
"sSortDescending": ": aktivieren, um Spalte absteigend zu sortieren"
|
||||||
|
}
|
||||||
|
}');
|
||||||
|
?>
|
BIN
html/locale/en_GB/LC_MESSAGES/messages.mo
Executable file
740
html/locale/en_GB/LC_MESSAGES/messages.po
Executable file
|
@ -0,0 +1,740 @@
|
||||||
|
# SOME DESCRIPTIVE TITLE.
|
||||||
|
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||||
|
# This file is distributed under the same license as the PACKAGE package.
|
||||||
|
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||||
|
#
|
||||||
|
#, fuzzy
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2017-03-14 13:47+0000\n"
|
||||||
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
"Language: \n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=CHARSET\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
|
||||||
|
#: index.php:183
|
||||||
|
msgid "Custom Info"
|
||||||
|
msgstr "Custom info"
|
||||||
|
|
||||||
|
#: index.php:191
|
||||||
|
msgid "File custom.php not found! Did you forget to create it?"
|
||||||
|
msgstr "File custom.php not found! Did you forget to create it?"
|
||||||
|
|
||||||
|
#: include/sysinfo_ajax.php:3
|
||||||
|
msgid "System Info"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:5
|
||||||
|
msgid "YSFGateway-Infos"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:13
|
||||||
|
msgid "YSFGateway Process is running"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:16
|
||||||
|
msgid "YSFGateway Process is down!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:25
|
||||||
|
msgid "YSFReflectors reported active"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:37
|
||||||
|
msgid "No."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:38 include/localtx_ajax.php:19
|
||||||
|
#: include/lh_ajax.php:19 include/txinfo.php:16
|
||||||
|
msgid "Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:39
|
||||||
|
msgid "Description"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:40
|
||||||
|
msgid "ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:41
|
||||||
|
msgid "Connections"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:6
|
||||||
|
msgid "Today's local transmissions"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:13 include/lh_ajax.php:13 include/txinfo.php:10
|
||||||
|
msgid "Time"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:14 include/lh_ajax.php:14 include/txinfo.php:11
|
||||||
|
msgid "Mode"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:15 include/lh_ajax.php:15 include/txinfo.php:12
|
||||||
|
msgid "Callsign"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:23 include/lh_ajax.php:23 include/txinfo.php:25
|
||||||
|
msgid "DSTAR-ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:24 include/lh_ajax.php:24 include/txinfo.php:26
|
||||||
|
msgid "Target"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:25 include/lh_ajax.php:25 include/txinfo.php:27
|
||||||
|
msgid "Source"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:26 include/lh_ajax.php:26
|
||||||
|
msgid "Dur (s)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:27 include/lh_ajax.php:27
|
||||||
|
msgid "Loss"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:28 include/lh_ajax.php:28
|
||||||
|
msgid "BER"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:30
|
||||||
|
msgid "RSSI (min)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:31
|
||||||
|
msgid "RSSI (max)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:32 include/localtx_ajax.php:33
|
||||||
|
msgid "RSSI (avg)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:3
|
||||||
|
msgid "Repeater Info"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:9
|
||||||
|
msgid "Current Mode"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:13
|
||||||
|
msgid "D-Star linked to"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:18
|
||||||
|
msgid "YSF linked to"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:23
|
||||||
|
msgid "DMR TS1 last linked to"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:24
|
||||||
|
msgid "DMR TS2 last linked to"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:48
|
||||||
|
msgid "Location"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:49
|
||||||
|
msgid "TX-Freq."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:50
|
||||||
|
msgid "RX-Freq."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:54
|
||||||
|
msgid "YSFGateway"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:59
|
||||||
|
msgid "DMR CC"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:63
|
||||||
|
msgid "DMR-Master"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:64
|
||||||
|
msgid "TS1"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:65
|
||||||
|
msgid "TS2"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:97 include/repeaterinfo.php:104
|
||||||
|
msgid "enabled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:99 include/repeaterinfo.php:106
|
||||||
|
msgid "disabled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/tools.php:73
|
||||||
|
msgid ""
|
||||||
|
"You are using an old config.php. Please configure your Dashboard by calling "
|
||||||
|
"<a href=\"setup.php\">setup.php</a>!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/tools.php:79
|
||||||
|
msgid ""
|
||||||
|
"You forgot to remove setup.php in root-directory of your dashboard or you "
|
||||||
|
"forgot to configure it! Please delete the file or configure your Dashboard "
|
||||||
|
"by calling <a href=\"setup.php\">setup.php</a>!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/modes.php:3
|
||||||
|
msgid "Enabled Modes"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/lh_ajax.php:6
|
||||||
|
msgid "Last Heard List of today's"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/lh_ajax.php:6
|
||||||
|
msgid "callsigns."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/disk.php:3
|
||||||
|
msgid "Disk Use"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/disk.php:10
|
||||||
|
msgid "File System"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/disk.php:11
|
||||||
|
msgid "Mount Point"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/disk.php:12
|
||||||
|
msgid "Use"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/disk.php:13
|
||||||
|
msgid "Free"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/disk.php:14
|
||||||
|
msgid "Used"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/disk.php:15
|
||||||
|
msgid "Total"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/txinfo.php:3
|
||||||
|
msgid "Currently TXing"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/txinfo.php:21
|
||||||
|
msgid "Talker Alias"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/txinfo.php:28
|
||||||
|
msgid "TX-Time"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:50 scripts/halt.php:49 scripts/log.php:53
|
||||||
|
#: scripts/reboot.php:50 index.php:59
|
||||||
|
msgid "for"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:52 scripts/halt.php:51 scripts/log.php:55
|
||||||
|
#: scripts/reboot.php:52 index.php:61
|
||||||
|
msgid "Repeater"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:54 scripts/halt.php:53 scripts/log.php:57
|
||||||
|
#: scripts/reboot.php:54 index.php:63
|
||||||
|
msgid "Hotspot"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:58 scripts/reboot.php:58
|
||||||
|
msgid "Home"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:67 scripts/reboot.php:66
|
||||||
|
msgid "Executing"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:67
|
||||||
|
msgid "Reboot MMDVMHost service in progress"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:90 scripts/halt.php:89 scripts/log.php:134
|
||||||
|
#: scripts/reboot.php:89 index.php:174
|
||||||
|
msgid "get your own at:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:90 scripts/halt.php:89 scripts/log.php:134
|
||||||
|
#: scripts/reboot.php:89 index.php:174 credits.php:13 credits.php:17
|
||||||
|
msgid "Credits"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/halt.php:66
|
||||||
|
msgid "Halt in progress...bye"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/log.php:61 index.php:100
|
||||||
|
msgid "View Log"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/log.php:62 index.php:101
|
||||||
|
msgid "Reboot MMDVMHost"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/log.php:63 index.php:102
|
||||||
|
msgid "Reboot System"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/log.php:64 index.php:103
|
||||||
|
msgid "ShutDown System"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/log.php:68 index.php:108
|
||||||
|
msgid "DMRplus"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/log.php:69 index.php:109
|
||||||
|
msgid "BrandMeister"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/log.php:76
|
||||||
|
msgid "Viewing log"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/log.php:82
|
||||||
|
msgid "Level"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/log.php:83
|
||||||
|
msgid "Timestamp"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/log.php:84
|
||||||
|
msgid "Info"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/reboot.php:66
|
||||||
|
msgid "Reboot system in progress"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ajax.php:214
|
||||||
|
msgid "Power"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ajax.php:219
|
||||||
|
msgid "CPU-Temperature"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ajax.php:224
|
||||||
|
msgid "CPU-Frequency"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ajax.php:228
|
||||||
|
msgid "System-Load"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ajax.php:229
|
||||||
|
msgid "CPU-Usage"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ajax.php:230
|
||||||
|
msgid "Uptime"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ajax.php:231
|
||||||
|
msgid "Idle"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ajax.php:237
|
||||||
|
msgid "online"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ajax.php:237
|
||||||
|
msgid "on battery"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: index.php:70
|
||||||
|
msgid "DMR-Network: "
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: index.php:159
|
||||||
|
msgid "Last Reload"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: index.php:169
|
||||||
|
msgid "stop refreshing"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: index.php:171
|
||||||
|
msgid "start refreshing"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: credits.php:20
|
||||||
|
msgid ""
|
||||||
|
"I think, after all the time this dashboard is developed mainly by myself, it "
|
||||||
|
"is time to say \"Thank you\" to all those, wo delivered some ideas or code "
|
||||||
|
"into this project."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: credits.php:21
|
||||||
|
msgid "This are explicit named following persons:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: credits.php:31
|
||||||
|
msgid "and some others..."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: credits.php:33
|
||||||
|
msgid ""
|
||||||
|
"Those, who felt forgotten, feel free to commit a change into github of this "
|
||||||
|
"file."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: credits.php:34
|
||||||
|
msgid "Many thanks to you all!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: credits.php:35
|
||||||
|
msgid "Best 73, Kim, DG9VH"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:26
|
||||||
|
msgid ""
|
||||||
|
"You forgot to give write-permissions to your webserver-user, see point 3 in "
|
||||||
|
"<a href=\"linux-step-by-step.md\">linux-step-by-step.md</a>!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:41 setup.php:50
|
||||||
|
msgid "Setup-Process"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:42
|
||||||
|
msgid ""
|
||||||
|
"Your config-file is written in config/config.php, please remove setup.php "
|
||||||
|
"for security reasons!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:43
|
||||||
|
msgid "Your dashboard is now available."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:51
|
||||||
|
msgid "Please give necessary information below"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:56
|
||||||
|
msgid "MMDVMHost-Configuration"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:58
|
||||||
|
msgid "Path to MMDVMHost-logfile"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:62
|
||||||
|
msgid "Path to MMDVM.ini"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:66
|
||||||
|
msgid "MMDVM.ini-filename"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:70
|
||||||
|
msgid "Path to MMDVMHost-executable"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:74
|
||||||
|
msgid "Enable extended lookup (show names)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:78
|
||||||
|
msgid "Show Talker Alias"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:82
|
||||||
|
msgid "Path to DMR-ID-Database-File (including filename)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:87
|
||||||
|
msgid "YSFGateway-Configuration"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:89
|
||||||
|
msgid "Enable YSFGateway"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:93
|
||||||
|
msgid "Path to YSFGateway-logfile"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:97
|
||||||
|
msgid "Logfile-prefix"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:101
|
||||||
|
msgid "Path to YSFGateway.ini"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:105
|
||||||
|
msgid "YSFGateway.ini-filename"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:109
|
||||||
|
msgid "Path to YSFHosts.txt"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:113
|
||||||
|
msgid "YSFHosts.txt-filename"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:118
|
||||||
|
msgid "ircddbgateway-Configuration"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:120
|
||||||
|
msgid "Path to Links.log"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:124
|
||||||
|
msgid "Name of ircddbgateway-executeable"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:129
|
||||||
|
msgid "Global Configuration"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:188
|
||||||
|
msgid "Locale"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:192
|
||||||
|
msgid "URL to Logo"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:196
|
||||||
|
msgid "URL to DMRplus-Logo"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:200
|
||||||
|
msgid "URL to BrandMeister-Logo"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:204
|
||||||
|
msgid "Refresh page after in seconds"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:208
|
||||||
|
msgid "Show System Info"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:212
|
||||||
|
msgid "Show Disk Use"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:216
|
||||||
|
msgid "Show Repeater Info"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:220
|
||||||
|
msgid "Show Enabled Modes"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:224
|
||||||
|
msgid "Show Last Heard List of today's"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:228
|
||||||
|
msgid "Show Today's local transmissions"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:232
|
||||||
|
msgid "Show progressbars"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:236
|
||||||
|
msgid "Enable CPU-temperature-warning"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:240
|
||||||
|
msgid "Warning temperature"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:244
|
||||||
|
msgid "Enable Network-Switching-Function"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:248
|
||||||
|
msgid "Username for switching networks:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:252
|
||||||
|
msgid "Password for switching networks:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:257
|
||||||
|
msgid "Enable Management-Functions below"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:261
|
||||||
|
msgid "Username for view log:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:265
|
||||||
|
msgid "Password for view log:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:269
|
||||||
|
msgid "Username for halt:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:273
|
||||||
|
msgid "Password for halt:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:277
|
||||||
|
msgid "Username for reboot:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:281
|
||||||
|
msgid "Password for reboot:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:285
|
||||||
|
msgid "Username for restart:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:289
|
||||||
|
msgid "Password for restart:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:293
|
||||||
|
msgid "Reboot MMDVMHost command:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:297
|
||||||
|
msgid "Reboot system command:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:301
|
||||||
|
msgid "Halt system command:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:305
|
||||||
|
msgid "Show Powerstate (online or battery, wiringpi needed)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:309
|
||||||
|
msgid "GPIO pin to monitor:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:313
|
||||||
|
msgid "State that signalizes online-state:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:317
|
||||||
|
msgid "Show link to QRZ.com on Callsigns"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:321
|
||||||
|
msgid "RSSI value"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:323
|
||||||
|
msgid "minimal"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:324
|
||||||
|
msgid "maximal"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:325
|
||||||
|
msgid "average"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:331
|
||||||
|
msgid "Save configuration"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/functions.php:13 include/functions.php:15
|
||||||
|
msgid "compiled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/functions.php:161
|
||||||
|
msgid "ircddbgateway is down!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/functions.php:164 include/functions.php:175
|
||||||
|
msgid "Remote gateway configured - not checked!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/functions.php:172
|
||||||
|
msgid "YSFGateway is down!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/functions.php:182
|
||||||
|
msgid "MMDVMHost is down!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/functions.php:550
|
||||||
|
msgid "idle"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/functions.php:623
|
||||||
|
msgid "ircddbgateway not running!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/functions.php:640 include/functions.php:656
|
||||||
|
#: include/functions.php:741
|
||||||
|
msgid "not linked"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/functions.php:692
|
||||||
|
msgid "something went wrong!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/functions.php:706 include/functions.php:724
|
||||||
|
msgid "Reflector not linked"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/functions.php:708 include/functions.php:719
|
||||||
|
msgid "Reflector"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/functions.php:719
|
||||||
|
msgid "not cfmd"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/functions.php:743
|
||||||
|
msgid "YSFGateway not running"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/functions.php:830
|
||||||
|
msgid "DMRIDs.dat not correct!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: index.php:78
|
||||||
|
msgid "Configuration"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:209
|
||||||
|
msgid "Use networks.php instead of configuration below"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/lh_ajax.php:6
|
||||||
|
msgid "Cached"
|
||||||
|
msgstr ""
|
||||||
|
|
29
html/locale/en_GB/settings.php
Executable file
|
@ -0,0 +1,29 @@
|
||||||
|
<?php
|
||||||
|
define("LANG_NAME", "English");
|
||||||
|
define("LANG_LOCALE", "en_GB");
|
||||||
|
define("LANG", "en");
|
||||||
|
define("LANGCODE", "en");
|
||||||
|
define("DATATABLESTRANSLATION", '{
|
||||||
|
"sEmptyTable": "No data available in table",
|
||||||
|
"sInfo": "Showing _START_ to _END_ of _TOTAL_ entries",
|
||||||
|
"sInfoEmpty": "Showing 0 to 0 of 0 entries",
|
||||||
|
"sInfoFiltered": "(filtered from _MAX_ total entries)",
|
||||||
|
"sInfoPostFix": "",
|
||||||
|
"sInfoThousands": ",",
|
||||||
|
"sLengthMenu": "Show _MENU_ entries",
|
||||||
|
"sLoadingRecords": "Loading...",
|
||||||
|
"sProcessing": "Processing...",
|
||||||
|
"sSearch": "Search:",
|
||||||
|
"sZeroRecords": "No matching records found",
|
||||||
|
"oPaginate": {
|
||||||
|
"sFirst": "First",
|
||||||
|
"sLast": "Last",
|
||||||
|
"sNext": "Next",
|
||||||
|
"sPrevious": "Previous"
|
||||||
|
},
|
||||||
|
"oAria": {
|
||||||
|
"sSortAscending": ": activate to sort column ascending",
|
||||||
|
"sSortDescending": ": activate to sort column descending"
|
||||||
|
}
|
||||||
|
}');
|
||||||
|
?>
|
BIN
html/locale/en_US/LC_MESSAGES/messages.mo
Executable file
740
html/locale/en_US/LC_MESSAGES/messages.po
Executable file
|
@ -0,0 +1,740 @@
|
||||||
|
# SOME DESCRIPTIVE TITLE.
|
||||||
|
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||||
|
# This file is distributed under the same license as the PACKAGE package.
|
||||||
|
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||||
|
#
|
||||||
|
#, fuzzy
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
|
"Report-Msgid-Bugs-To: \n"
|
||||||
|
"POT-Creation-Date: 2017-03-14 13:47+0000\n"
|
||||||
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
"Language: \n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=CHARSET\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
|
||||||
|
#: index.php:183
|
||||||
|
msgid "Custom Info"
|
||||||
|
msgstr "Custom info"
|
||||||
|
|
||||||
|
#: index.php:191
|
||||||
|
msgid "File custom.php not found! Did you forget to create it?"
|
||||||
|
msgstr "File custom.php not found! Did you forget to create it?"
|
||||||
|
|
||||||
|
#: include/sysinfo_ajax.php:3
|
||||||
|
msgid "System Info"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:5
|
||||||
|
msgid "YSFGateway-Infos"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:13
|
||||||
|
msgid "YSFGateway Process is running"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:16
|
||||||
|
msgid "YSFGateway Process is down!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:25
|
||||||
|
msgid "YSFReflectors reported active"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:37
|
||||||
|
msgid "No."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:38 include/localtx_ajax.php:19
|
||||||
|
#: include/lh_ajax.php:19 include/txinfo.php:16
|
||||||
|
msgid "Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:39
|
||||||
|
msgid "Description"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:40
|
||||||
|
msgid "ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:41
|
||||||
|
msgid "Connections"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:6
|
||||||
|
msgid "Today's local transmissions"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:13 include/lh_ajax.php:13 include/txinfo.php:10
|
||||||
|
msgid "Time"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:14 include/lh_ajax.php:14 include/txinfo.php:11
|
||||||
|
msgid "Mode"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:15 include/lh_ajax.php:15 include/txinfo.php:12
|
||||||
|
msgid "Callsign"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:23 include/lh_ajax.php:23 include/txinfo.php:25
|
||||||
|
msgid "DSTAR-ID"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:24 include/lh_ajax.php:24 include/txinfo.php:26
|
||||||
|
msgid "Target"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:25 include/lh_ajax.php:25 include/txinfo.php:27
|
||||||
|
msgid "Source"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:26 include/lh_ajax.php:26
|
||||||
|
msgid "Dur (s)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:27 include/lh_ajax.php:27
|
||||||
|
msgid "Loss"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:28 include/lh_ajax.php:28
|
||||||
|
msgid "BER"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:30
|
||||||
|
msgid "RSSI (min)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:31
|
||||||
|
msgid "RSSI (max)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:32 include/localtx_ajax.php:33
|
||||||
|
msgid "RSSI (avg)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:3
|
||||||
|
msgid "Repeater Info"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:9
|
||||||
|
msgid "Current Mode"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:13
|
||||||
|
msgid "D-Star linked to"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:18
|
||||||
|
msgid "YSF linked to"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:23
|
||||||
|
msgid "DMR TS1 last linked to"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:24
|
||||||
|
msgid "DMR TS2 last linked to"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:48
|
||||||
|
msgid "Location"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:49
|
||||||
|
msgid "TX-Freq."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:50
|
||||||
|
msgid "RX-Freq."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:54
|
||||||
|
msgid "YSFGateway"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:59
|
||||||
|
msgid "DMR CC"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:63
|
||||||
|
msgid "DMR-Master"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:64
|
||||||
|
msgid "TS1"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:65
|
||||||
|
msgid "TS2"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:97 include/repeaterinfo.php:104
|
||||||
|
msgid "enabled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:99 include/repeaterinfo.php:106
|
||||||
|
msgid "disabled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/tools.php:73
|
||||||
|
msgid ""
|
||||||
|
"You are using an old config.php. Please configure your Dashboard by calling "
|
||||||
|
"<a href=\"setup.php\">setup.php</a>!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/tools.php:79
|
||||||
|
msgid ""
|
||||||
|
"You forgot to remove setup.php in root-directory of your dashboard or you "
|
||||||
|
"forgot to configure it! Please delete the file or configure your Dashboard "
|
||||||
|
"by calling <a href=\"setup.php\">setup.php</a>!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/modes.php:3
|
||||||
|
msgid "Enabled Modes"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/lh_ajax.php:6
|
||||||
|
msgid "Last Heard List of today's"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/lh_ajax.php:6
|
||||||
|
msgid "callsigns."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/disk.php:3
|
||||||
|
msgid "Disk Use"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/disk.php:10
|
||||||
|
msgid "File System"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/disk.php:11
|
||||||
|
msgid "Mount Point"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/disk.php:12
|
||||||
|
msgid "Use"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/disk.php:13
|
||||||
|
msgid "Free"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/disk.php:14
|
||||||
|
msgid "Used"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/disk.php:15
|
||||||
|
msgid "Total"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/txinfo.php:3
|
||||||
|
msgid "Currently TXing"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/txinfo.php:21
|
||||||
|
msgid "Talker Alias"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/txinfo.php:28
|
||||||
|
msgid "TX-Time"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:50 scripts/halt.php:49 scripts/log.php:53
|
||||||
|
#: scripts/reboot.php:50 index.php:59
|
||||||
|
msgid "for"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:52 scripts/halt.php:51 scripts/log.php:55
|
||||||
|
#: scripts/reboot.php:52 index.php:61
|
||||||
|
msgid "Repeater"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:54 scripts/halt.php:53 scripts/log.php:57
|
||||||
|
#: scripts/reboot.php:54 index.php:63
|
||||||
|
msgid "Hotspot"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:58 scripts/reboot.php:58
|
||||||
|
msgid "Home"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:67 scripts/reboot.php:66
|
||||||
|
msgid "Executing"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:67
|
||||||
|
msgid "Reboot MMDVMHost service in progress"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:90 scripts/halt.php:89 scripts/log.php:134
|
||||||
|
#: scripts/reboot.php:89 index.php:174
|
||||||
|
msgid "get your own at:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:90 scripts/halt.php:89 scripts/log.php:134
|
||||||
|
#: scripts/reboot.php:89 index.php:174 credits.php:13 credits.php:17
|
||||||
|
msgid "Credits"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/halt.php:66
|
||||||
|
msgid "Halt in progress...bye"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/log.php:61 index.php:100
|
||||||
|
msgid "View Log"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/log.php:62 index.php:101
|
||||||
|
msgid "Reboot MMDVMHost"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/log.php:63 index.php:102
|
||||||
|
msgid "Reboot System"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/log.php:64 index.php:103
|
||||||
|
msgid "ShutDown System"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/log.php:68 index.php:108
|
||||||
|
msgid "DMRplus"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/log.php:69 index.php:109
|
||||||
|
msgid "BrandMeister"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/log.php:76
|
||||||
|
msgid "Viewing log"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/log.php:82
|
||||||
|
msgid "Level"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/log.php:83
|
||||||
|
msgid "Timestamp"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/log.php:84
|
||||||
|
msgid "Info"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: scripts/reboot.php:66
|
||||||
|
msgid "Reboot system in progress"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ajax.php:214
|
||||||
|
msgid "Power"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ajax.php:219
|
||||||
|
msgid "CPU-Temperature"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ajax.php:224
|
||||||
|
msgid "CPU-Frequency"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ajax.php:228
|
||||||
|
msgid "System-Load"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ajax.php:229
|
||||||
|
msgid "CPU-Usage"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ajax.php:230
|
||||||
|
msgid "Uptime"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ajax.php:231
|
||||||
|
msgid "Idle"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ajax.php:237
|
||||||
|
msgid "online"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ajax.php:237
|
||||||
|
msgid "on battery"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: index.php:70
|
||||||
|
msgid "DMR-Network: "
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: index.php:159
|
||||||
|
msgid "Last Reload"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: index.php:169
|
||||||
|
msgid "stop refreshing"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: index.php:171
|
||||||
|
msgid "start refreshing"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: credits.php:20
|
||||||
|
msgid ""
|
||||||
|
"I think, after all the time this dashboard is developed mainly by myself, it "
|
||||||
|
"is time to say \"Thank you\" to all those, wo delivered some ideas or code "
|
||||||
|
"into this project."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: credits.php:21
|
||||||
|
msgid "This are explicit named following persons:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: credits.php:31
|
||||||
|
msgid "and some others..."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: credits.php:33
|
||||||
|
msgid ""
|
||||||
|
"Those, who felt forgotten, feel free to commit a change into github of this "
|
||||||
|
"file."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: credits.php:34
|
||||||
|
msgid "Many thanks to you all!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: credits.php:35
|
||||||
|
msgid "Best 73, Kim, DG9VH"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:26
|
||||||
|
msgid ""
|
||||||
|
"You forgot to give write-permissions to your webserver-user, see point 3 in "
|
||||||
|
"<a href=\"linux-step-by-step.md\">linux-step-by-step.md</a>!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:41 setup.php:50
|
||||||
|
msgid "Setup-Process"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:42
|
||||||
|
msgid ""
|
||||||
|
"Your config-file is written in config/config.php, please remove setup.php "
|
||||||
|
"for security reasons!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:43
|
||||||
|
msgid "Your dashboard is now available."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:51
|
||||||
|
msgid "Please give necessary information below"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:56
|
||||||
|
msgid "MMDVMHost-Configuration"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:58
|
||||||
|
msgid "Path to MMDVMHost-logfile"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:62
|
||||||
|
msgid "Path to MMDVM.ini"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:66
|
||||||
|
msgid "MMDVM.ini-filename"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:70
|
||||||
|
msgid "Path to MMDVMHost-executable"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:74
|
||||||
|
msgid "Enable extended lookup (show names)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:78
|
||||||
|
msgid "Show Talker Alias"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:82
|
||||||
|
msgid "Path to DMR-ID-Database-File (including filename)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:87
|
||||||
|
msgid "YSFGateway-Configuration"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:89
|
||||||
|
msgid "Enable YSFGateway"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:93
|
||||||
|
msgid "Path to YSFGateway-logfile"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:97
|
||||||
|
msgid "Logfile-prefix"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:101
|
||||||
|
msgid "Path to YSFGateway.ini"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:105
|
||||||
|
msgid "YSFGateway.ini-filename"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:109
|
||||||
|
msgid "Path to YSFHosts.txt"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:113
|
||||||
|
msgid "YSFHosts.txt-filename"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:118
|
||||||
|
msgid "ircddbgateway-Configuration"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:120
|
||||||
|
msgid "Path to Links.log"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:124
|
||||||
|
msgid "Name of ircddbgateway-executeable"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:129
|
||||||
|
msgid "Global Configuration"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:188
|
||||||
|
msgid "Locale"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:192
|
||||||
|
msgid "URL to Logo"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:196
|
||||||
|
msgid "URL to DMRplus-Logo"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:200
|
||||||
|
msgid "URL to BrandMeister-Logo"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:204
|
||||||
|
msgid "Refresh page after in seconds"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:208
|
||||||
|
msgid "Show System Info"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:212
|
||||||
|
msgid "Show Disk Use"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:216
|
||||||
|
msgid "Show Repeater Info"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:220
|
||||||
|
msgid "Show Enabled Modes"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:224
|
||||||
|
msgid "Show Last Heard List of today's"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:228
|
||||||
|
msgid "Show Today's local transmissions"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:232
|
||||||
|
msgid "Show progressbars"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:236
|
||||||
|
msgid "Enable CPU-temperature-warning"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:240
|
||||||
|
msgid "Warning temperature"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:244
|
||||||
|
msgid "Enable Network-Switching-Function"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:248
|
||||||
|
msgid "Username for switching networks:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:252
|
||||||
|
msgid "Password for switching networks:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:257
|
||||||
|
msgid "Enable Management-Functions below"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:261
|
||||||
|
msgid "Username for view log:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:265
|
||||||
|
msgid "Password for view log:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:269
|
||||||
|
msgid "Username for halt:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:273
|
||||||
|
msgid "Password for halt:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:277
|
||||||
|
msgid "Username for reboot:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:281
|
||||||
|
msgid "Password for reboot:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:285
|
||||||
|
msgid "Username for restart:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:289
|
||||||
|
msgid "Password for restart:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:293
|
||||||
|
msgid "Reboot MMDVMHost command:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:297
|
||||||
|
msgid "Reboot system command:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:301
|
||||||
|
msgid "Halt system command:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:305
|
||||||
|
msgid "Show Powerstate (online or battery, wiringpi needed)"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:309
|
||||||
|
msgid "GPIO pin to monitor:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:313
|
||||||
|
msgid "State that signalizes online-state:"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:317
|
||||||
|
msgid "Show link to QRZ.com on Callsigns"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:321
|
||||||
|
msgid "RSSI value"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:323
|
||||||
|
msgid "minimal"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:324
|
||||||
|
msgid "maximal"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:325
|
||||||
|
msgid "average"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:331
|
||||||
|
msgid "Save configuration"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/functions.php:13 include/functions.php:15
|
||||||
|
msgid "compiled"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/functions.php:161
|
||||||
|
msgid "ircddbgateway is down!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/functions.php:164 include/functions.php:175
|
||||||
|
msgid "Remote gateway configured - not checked!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/functions.php:172
|
||||||
|
msgid "YSFGateway is down!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/functions.php:182
|
||||||
|
msgid "MMDVMHost is down!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/functions.php:550
|
||||||
|
msgid "idle"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/functions.php:623
|
||||||
|
msgid "ircddbgateway not running!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/functions.php:640 include/functions.php:656
|
||||||
|
#: include/functions.php:741
|
||||||
|
msgid "not linked"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/functions.php:692
|
||||||
|
msgid "something went wrong!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/functions.php:706 include/functions.php:724
|
||||||
|
msgid "Reflector not linked"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/functions.php:708 include/functions.php:719
|
||||||
|
msgid "Reflector"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/functions.php:719
|
||||||
|
msgid "not cfmd"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/functions.php:743
|
||||||
|
msgid "YSFGateway not running"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/functions.php:830
|
||||||
|
msgid "DMRIDs.dat not correct!"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: index.php:78
|
||||||
|
msgid "Configuration"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:209
|
||||||
|
msgid "Use networks.php instead of configuration below"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/lh_ajax.php:6
|
||||||
|
msgid "Cached"
|
||||||
|
msgstr ""
|
||||||
|
|
29
html/locale/en_US/settings.php
Executable file
|
@ -0,0 +1,29 @@
|
||||||
|
<?php
|
||||||
|
define("LANG_NAME", "American English");
|
||||||
|
define("LANG_LOCALE", "en_US");
|
||||||
|
define("LANG", "en");
|
||||||
|
define("LANGCODE", "en");
|
||||||
|
define("DATATABLESTRANSLATION", '{
|
||||||
|
"sEmptyTable": "No data available in table",
|
||||||
|
"sInfo": "Showing _START_ to _END_ of _TOTAL_ entries",
|
||||||
|
"sInfoEmpty": "Showing 0 to 0 of 0 entries",
|
||||||
|
"sInfoFiltered": "(filtered from _MAX_ total entries)",
|
||||||
|
"sInfoPostFix": "",
|
||||||
|
"sInfoThousands": ",",
|
||||||
|
"sLengthMenu": "Show _MENU_ entries",
|
||||||
|
"sLoadingRecords": "Loading...",
|
||||||
|
"sProcessing": "Processing...",
|
||||||
|
"sSearch": "Search:",
|
||||||
|
"sZeroRecords": "No matching records found",
|
||||||
|
"oPaginate": {
|
||||||
|
"sFirst": "First",
|
||||||
|
"sLast": "Last",
|
||||||
|
"sNext": "Next",
|
||||||
|
"sPrevious": "Previous"
|
||||||
|
},
|
||||||
|
"oAria": {
|
||||||
|
"sSortAscending": ": activate to sort column ascending",
|
||||||
|
"sSortDescending": ": activate to sort column descending"
|
||||||
|
}
|
||||||
|
}');
|
||||||
|
?>
|
BIN
html/locale/es_ES/LC_MESSAGES/messages.mo
Executable file
755
html/locale/es_ES/LC_MESSAGES/messages.po
Executable file
|
@ -0,0 +1,755 @@
|
||||||
|
# Translation-Template
|
||||||
|
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||||
|
# This file is distributed under the same license as the PACKAGE package.
|
||||||
|
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||||
|
#
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: MMDVMHost Dashboard Spanish\n"
|
||||||
|
"Report-Msgid-Bugs-To: dg9vh@darc.de\n"
|
||||||
|
"POT-Creation-Date: 2017-03-14 13:47+0000\n"
|
||||||
|
"PO-Revision-Date: 2017-03-15 21:20+0100\n"
|
||||||
|
"Last-Translator: Pablo - EA4FVB <ea4fvb@gmail.com>\n"
|
||||||
|
"Language: es\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"Language-Team: ea4fvb@gmail.com\n"
|
||||||
|
"X-Generator: Poedit 1.8.12\n"
|
||||||
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
|
|
||||||
|
#: index.php:183
|
||||||
|
msgid "Custom Info"
|
||||||
|
msgstr "Custom info"
|
||||||
|
|
||||||
|
#: index.php:191
|
||||||
|
msgid "File custom.php not found! Did you forget to create it?"
|
||||||
|
msgstr "File custom.php not found! Did you forget to create it?"
|
||||||
|
|
||||||
|
#: include/sysinfo_ajax.php:3
|
||||||
|
msgid "System Info"
|
||||||
|
msgstr "Información de Sistema"
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:5
|
||||||
|
msgid "YSFGateway-Infos"
|
||||||
|
msgstr "Información del YSFGateway"
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:13
|
||||||
|
msgid "YSFGateway Process is running"
|
||||||
|
msgstr "YSFGateway activo"
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:16
|
||||||
|
msgid "YSFGateway Process is down!"
|
||||||
|
msgstr "YSFGateway detenido"
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:25
|
||||||
|
msgid "YSFReflectors reported active"
|
||||||
|
msgstr "Reporte ReflectoresYSF activo"
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:37
|
||||||
|
msgid "No."
|
||||||
|
msgstr "Nº"
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:38 include/localtx_ajax.php:19
|
||||||
|
#: include/lh_ajax.php:19 include/txinfo.php:16
|
||||||
|
msgid "Name"
|
||||||
|
msgstr "Nombre"
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:39
|
||||||
|
msgid "Description"
|
||||||
|
msgstr "Descripción"
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:40
|
||||||
|
msgid "ID"
|
||||||
|
msgstr "ID"
|
||||||
|
|
||||||
|
#: include/ysfgatewayinfo.php:41
|
||||||
|
msgid "Connections"
|
||||||
|
msgstr "Conexiones"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:6
|
||||||
|
msgid "Today's local transmissions"
|
||||||
|
msgstr "Transmisiones locales hoy"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:13 include/lh_ajax.php:13 include/txinfo.php:10
|
||||||
|
msgid "Time"
|
||||||
|
msgstr "Hora"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:14 include/lh_ajax.php:14 include/txinfo.php:11
|
||||||
|
msgid "Mode"
|
||||||
|
msgstr "Modo"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:15 include/lh_ajax.php:15 include/txinfo.php:12
|
||||||
|
msgid "Callsign"
|
||||||
|
msgstr "Indicativo"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:23 include/lh_ajax.php:23 include/txinfo.php:25
|
||||||
|
msgid "DSTAR-ID"
|
||||||
|
msgstr "DSTAR-ID"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:24 include/lh_ajax.php:24 include/txinfo.php:26
|
||||||
|
msgid "Target"
|
||||||
|
msgstr "Destino"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:25 include/lh_ajax.php:25 include/txinfo.php:27
|
||||||
|
msgid "Source"
|
||||||
|
msgstr "Origen"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:26 include/lh_ajax.php:26
|
||||||
|
msgid "Dur (s)"
|
||||||
|
msgstr "Duración (s)"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:27 include/lh_ajax.php:27
|
||||||
|
msgid "Loss"
|
||||||
|
msgstr "Pérdidas"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:28 include/lh_ajax.php:28
|
||||||
|
msgid "BER"
|
||||||
|
msgstr "BER"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:30
|
||||||
|
msgid "RSSI (min)"
|
||||||
|
msgstr "RSSI (min)"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:31
|
||||||
|
msgid "RSSI (max)"
|
||||||
|
msgstr "RSSI (max)"
|
||||||
|
|
||||||
|
#: include/localtx_ajax.php:32 include/localtx_ajax.php:33
|
||||||
|
msgid "RSSI (avg)"
|
||||||
|
msgstr "RSSI (med)"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:3
|
||||||
|
msgid "Repeater Info"
|
||||||
|
msgstr "Información del Repetidor / HotSpot"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:9
|
||||||
|
msgid "Current Mode"
|
||||||
|
msgstr "Modo actual"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:13
|
||||||
|
msgid "D-Star linked to"
|
||||||
|
msgstr "D-Star conectado a"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:18
|
||||||
|
msgid "YSF linked to"
|
||||||
|
msgstr "YSF conectado a"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:23
|
||||||
|
msgid "DMR TS1 last linked to"
|
||||||
|
msgstr "DMR TS1 conectado a"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:24
|
||||||
|
msgid "DMR TS2 last linked to"
|
||||||
|
msgstr "DMR TS2 conectado a"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:48
|
||||||
|
msgid "Location"
|
||||||
|
msgstr "Ubicación"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:49
|
||||||
|
msgid "TX-Freq."
|
||||||
|
msgstr "TX-Freq."
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:50
|
||||||
|
msgid "RX-Freq."
|
||||||
|
msgstr "RX-Freq."
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:54
|
||||||
|
msgid "YSFGateway"
|
||||||
|
msgstr "YSFGateway"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:59
|
||||||
|
msgid "DMR CC"
|
||||||
|
msgstr "DMR CC"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:63
|
||||||
|
msgid "DMR-Master"
|
||||||
|
msgstr "DMR-Master"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:64
|
||||||
|
msgid "TS1"
|
||||||
|
msgstr "TS1"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:65
|
||||||
|
msgid "TS2"
|
||||||
|
msgstr "TS2"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:97 include/repeaterinfo.php:104
|
||||||
|
msgid "enabled"
|
||||||
|
msgstr "activo"
|
||||||
|
|
||||||
|
#: include/repeaterinfo.php:99 include/repeaterinfo.php:106
|
||||||
|
msgid "disabled"
|
||||||
|
msgstr "desconectado"
|
||||||
|
|
||||||
|
#: include/tools.php:73
|
||||||
|
msgid ""
|
||||||
|
"You are using an old config.php. Please configure your Dashboard by calling "
|
||||||
|
"<a href=\"setup.php\">setup.php</a>!"
|
||||||
|
msgstr ""
|
||||||
|
"Estás usando una configuracion antigua. Configura tu Dashboard a través de "
|
||||||
|
"<a href=\"setup.php\">setup.php</a>!"
|
||||||
|
|
||||||
|
#: include/tools.php:79
|
||||||
|
msgid ""
|
||||||
|
"You forgot to remove setup.php in root-directory of your dashboard or you "
|
||||||
|
"forgot to configure it! Please delete the file or configure your Dashboard "
|
||||||
|
"by calling <a href=\"setup.php\">setup.php</a>!"
|
||||||
|
msgstr ""
|
||||||
|
"Olvidaste eliminar setup.php del directorio raíz de tu Dashboards o has "
|
||||||
|
"olvidado configurarlo, por favor borra el fichero o configura el Dashboard "
|
||||||
|
"mediante el fichero <a href=\"setup.php\">setup.php</a>!"
|
||||||
|
|
||||||
|
#: include/modes.php:3
|
||||||
|
msgid "Enabled Modes"
|
||||||
|
msgstr "Modos Activos"
|
||||||
|
|
||||||
|
#: include/lh_ajax.php:6
|
||||||
|
msgid "Last Heard List of today's"
|
||||||
|
msgstr "Últimos escuchados hoy"
|
||||||
|
|
||||||
|
#: include/lh_ajax.php:6
|
||||||
|
msgid "callsigns."
|
||||||
|
msgstr "indicativos."
|
||||||
|
|
||||||
|
#: include/disk.php:3
|
||||||
|
msgid "Disk Use"
|
||||||
|
msgstr "Uso de disco"
|
||||||
|
|
||||||
|
#: include/disk.php:10
|
||||||
|
msgid "File System"
|
||||||
|
msgstr "Sistema de archivos"
|
||||||
|
|
||||||
|
#: include/disk.php:11
|
||||||
|
msgid "Mount Point"
|
||||||
|
msgstr "Montado desde"
|
||||||
|
|
||||||
|
#: include/disk.php:12
|
||||||
|
msgid "Use"
|
||||||
|
msgstr "Uso"
|
||||||
|
|
||||||
|
#: include/disk.php:13
|
||||||
|
msgid "Free"
|
||||||
|
msgstr "Libre"
|
||||||
|
|
||||||
|
#: include/disk.php:14
|
||||||
|
msgid "Used"
|
||||||
|
msgstr "Utilizado"
|
||||||
|
|
||||||
|
#: include/disk.php:15
|
||||||
|
msgid "Total"
|
||||||
|
msgstr "Total"
|
||||||
|
|
||||||
|
#: include/txinfo.php:3
|
||||||
|
msgid "Currently TXing"
|
||||||
|
msgstr "Actualmente en TX..."
|
||||||
|
|
||||||
|
#: include/txinfo.php:21
|
||||||
|
msgid "Talker Alias"
|
||||||
|
msgstr "Talker Alias"
|
||||||
|
|
||||||
|
#: include/txinfo.php:28
|
||||||
|
msgid "TX-Time"
|
||||||
|
msgstr "Duración"
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:50 scripts/halt.php:49 scripts/log.php:53
|
||||||
|
#: scripts/reboot.php:50 index.php:59
|
||||||
|
msgid "for"
|
||||||
|
msgstr "para"
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:52 scripts/halt.php:51 scripts/log.php:55
|
||||||
|
#: scripts/reboot.php:52 index.php:61
|
||||||
|
msgid "Repeater"
|
||||||
|
msgstr "Repetidor"
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:54 scripts/halt.php:53 scripts/log.php:57
|
||||||
|
#: scripts/reboot.php:54 index.php:63
|
||||||
|
msgid "Hotspot"
|
||||||
|
msgstr "HotSpot"
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:58 scripts/reboot.php:58
|
||||||
|
msgid "Home"
|
||||||
|
msgstr "Inicio"
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:67 scripts/reboot.php:66
|
||||||
|
msgid "Executing"
|
||||||
|
msgstr "Activo"
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:67
|
||||||
|
msgid "Reboot MMDVMHost service in progress"
|
||||||
|
msgstr "Reiniciando servicio MMDVMHost"
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:90 scripts/halt.php:89 scripts/log.php:134
|
||||||
|
#: scripts/reboot.php:89 index.php:174
|
||||||
|
msgid "get your own at:"
|
||||||
|
msgstr "obtenlo en:"
|
||||||
|
|
||||||
|
#: scripts/rebootmmdvm.php:90 scripts/halt.php:89 scripts/log.php:134
|
||||||
|
#: scripts/reboot.php:89 index.php:174 credits.php:13 credits.php:17
|
||||||
|
msgid "Credits"
|
||||||
|
msgstr "Créditos"
|
||||||
|
|
||||||
|
#: scripts/halt.php:66
|
||||||
|
msgid "Halt in progress...bye"
|
||||||
|
msgstr "Detención en progreso ... adiós"
|
||||||
|
|
||||||
|
#: scripts/log.php:61 index.php:100
|
||||||
|
msgid "View Log"
|
||||||
|
msgstr "Ver Log"
|
||||||
|
|
||||||
|
#: scripts/log.php:62 index.php:101
|
||||||
|
msgid "Reboot MMDVMHost"
|
||||||
|
msgstr "Reiniciar MMDVMHost"
|
||||||
|
|
||||||
|
#: scripts/log.php:63 index.php:102
|
||||||
|
msgid "Reboot System"
|
||||||
|
msgstr "Reiniciar Sistema"
|
||||||
|
|
||||||
|
#: scripts/log.php:64 index.php:103
|
||||||
|
msgid "ShutDown System"
|
||||||
|
msgstr "Apagar Sistema"
|
||||||
|
|
||||||
|
#: scripts/log.php:68 index.php:108
|
||||||
|
msgid "DMRplus"
|
||||||
|
msgstr "DMRplus"
|
||||||
|
|
||||||
|
#: scripts/log.php:69 index.php:109
|
||||||
|
msgid "BrandMeister"
|
||||||
|
msgstr "BrandMeister"
|
||||||
|
|
||||||
|
#: scripts/log.php:76
|
||||||
|
msgid "Viewing log"
|
||||||
|
msgstr "Viendo Log"
|
||||||
|
|
||||||
|
#: scripts/log.php:82
|
||||||
|
msgid "Level"
|
||||||
|
msgstr "Nivel"
|
||||||
|
|
||||||
|
#: scripts/log.php:83
|
||||||
|
msgid "Timestamp"
|
||||||
|
msgstr "Fecha y Hora"
|
||||||
|
|
||||||
|
#: scripts/log.php:84
|
||||||
|
msgid "Info"
|
||||||
|
msgstr "Información"
|
||||||
|
|
||||||
|
#: scripts/reboot.php:66
|
||||||
|
msgid "Reboot system in progress"
|
||||||
|
msgstr "Reiniciando el Sistema"
|
||||||
|
|
||||||
|
#: ajax.php:214
|
||||||
|
msgid "Power"
|
||||||
|
msgstr "Power"
|
||||||
|
|
||||||
|
#: ajax.php:219
|
||||||
|
msgid "CPU-Temperature"
|
||||||
|
msgstr "Temperatura CPU"
|
||||||
|
|
||||||
|
#: ajax.php:224
|
||||||
|
msgid "CPU-Frequency"
|
||||||
|
msgstr "Frecuencia CPU"
|
||||||
|
|
||||||
|
#: ajax.php:228
|
||||||
|
msgid "System-Load"
|
||||||
|
msgstr "Carga de Sistema"
|
||||||
|
|
||||||
|
#: ajax.php:229
|
||||||
|
msgid "CPU-Usage"
|
||||||
|
msgstr "Uso CPU"
|
||||||
|
|
||||||
|
#: ajax.php:230
|
||||||
|
msgid "Uptime"
|
||||||
|
msgstr "Tiempo activo"
|
||||||
|
|
||||||
|
#: ajax.php:231
|
||||||
|
msgid "Idle"
|
||||||
|
msgstr "Idle"
|
||||||
|
|
||||||
|
#: ajax.php:237
|
||||||
|
msgid "online"
|
||||||
|
msgstr "online"
|
||||||
|
|
||||||
|
#: ajax.php:237
|
||||||
|
msgid "on battery"
|
||||||
|
msgstr "funcionamiento de la batería"
|
||||||
|
|
||||||
|
#: index.php:70
|
||||||
|
msgid "DMR-Network: "
|
||||||
|
msgstr "Red DMR: "
|
||||||
|
|
||||||
|
#: index.php:159
|
||||||
|
msgid "Last Reload"
|
||||||
|
msgstr "Ultima actualización"
|
||||||
|
|
||||||
|
#: index.php:169
|
||||||
|
msgid "stop refreshing"
|
||||||
|
msgstr "detener refresco"
|
||||||
|
|
||||||
|
#: index.php:171
|
||||||
|
msgid "start refreshing"
|
||||||
|
msgstr "iniciar refresco"
|
||||||
|
|
||||||
|
#: credits.php:20
|
||||||
|
msgid ""
|
||||||
|
"I think, after all the time this dashboard is developed mainly by myself, it "
|
||||||
|
"is time to say \"Thank you\" to all those, wo delivered some ideas or code "
|
||||||
|
"into this project."
|
||||||
|
msgstr ""
|
||||||
|
"Creo que, después de todo este tiempo que he estado desarrollando "
|
||||||
|
"principalmente yo este Dashboard, es el momento de decir \"Gracias\" a todos "
|
||||||
|
"aquellos que han aportado ideas o código a este proyecto."
|
||||||
|
|
||||||
|
#: credits.php:21
|
||||||
|
msgid "This are explicit named following persons:"
|
||||||
|
msgstr "Deseo nombrar explícitamente a las personas siguientes:"
|
||||||
|
|
||||||
|
#: credits.php:31
|
||||||
|
msgid "and some others..."
|
||||||
|
msgstr "bueno y algunos más..."
|
||||||
|
|
||||||
|
#: credits.php:33
|
||||||
|
msgid ""
|
||||||
|
"Those, who felt forgotten, feel free to commit a change into github of this "
|
||||||
|
"file."
|
||||||
|
msgstr ""
|
||||||
|
"Aquellos que se sientan olvidados, sois libres actualizar este fichero en el "
|
||||||
|
"github."
|
||||||
|
|
||||||
|
#: credits.php:34
|
||||||
|
msgid "Many thanks to you all!"
|
||||||
|
msgstr "Muchas gracias a todos!"
|
||||||
|
|
||||||
|
#: credits.php:35
|
||||||
|
msgid "Best 73, Kim, DG9VH"
|
||||||
|
msgstr "73, Kim, DG9VH"
|
||||||
|
|
||||||
|
#: setup.php:26
|
||||||
|
msgid ""
|
||||||
|
"You forgot to give write-permissions to your webserver-user, see point 3 in "
|
||||||
|
"<a href=\"linux-step-by-step.md\">linux-step-by-step.md</a>!"
|
||||||
|
msgstr ""
|
||||||
|
"Has olvidado dar permisos de escritura al usuario web, revisa e apartado 3 "
|
||||||
|
"en <a href=\"linux-step-by-step.md\">linux-step-by-step.md</a>!"
|
||||||
|
|
||||||
|
#: setup.php:41 setup.php:50
|
||||||
|
msgid "Setup-Process"
|
||||||
|
msgstr "Setup en proceso"
|
||||||
|
|
||||||
|
#: setup.php:42
|
||||||
|
msgid ""
|
||||||
|
"Your config-file is written in config/config.php, please remove setup.php "
|
||||||
|
"for security reasons!"
|
||||||
|
msgstr ""
|
||||||
|
"La configuración se ha guardado en config/config.php, por favor elimina el "
|
||||||
|
"fichero setup.php"
|
||||||
|
|
||||||
|
#: setup.php:43
|
||||||
|
msgid "Your dashboard is now available."
|
||||||
|
msgstr "Ya esta listo tu Dashboard."
|
||||||
|
|
||||||
|
#: setup.php:51
|
||||||
|
msgid "Please give necessary information below"
|
||||||
|
msgstr "Por favor incuye la información requerida más abajo"
|
||||||
|
|
||||||
|
#: setup.php:56
|
||||||
|
msgid "MMDVMHost-Configuration"
|
||||||
|
msgstr "Configuración MMDVMHost"
|
||||||
|
|
||||||
|
#: setup.php:58
|
||||||
|
msgid "Path to MMDVMHost-logfile"
|
||||||
|
msgstr "Ruta del fichero log de MMDVMHost"
|
||||||
|
|
||||||
|
#: setup.php:62
|
||||||
|
msgid "Path to MMDVM.ini"
|
||||||
|
msgstr "Ruta del MMDVM.ini"
|
||||||
|
|
||||||
|
#: setup.php:66
|
||||||
|
msgid "MMDVM.ini-filename"
|
||||||
|
msgstr "Nombre del MMDVM.ini"
|
||||||
|
|
||||||
|
#: setup.php:70
|
||||||
|
msgid "Path to MMDVMHost-executable"
|
||||||
|
msgstr "Ruta de la Aplicación MMDVMHost"
|
||||||
|
|
||||||
|
#: setup.php:74
|
||||||
|
msgid "Enable extended lookup (show names)"
|
||||||
|
msgstr "Activar vision extendida (mostrar nombres)"
|
||||||
|
|
||||||
|
#: setup.php:78
|
||||||
|
msgid "Show Talker Alias"
|
||||||
|
msgstr "Mostrar Talker Alias"
|
||||||
|
|
||||||
|
#: setup.php:82
|
||||||
|
msgid "Path to DMR-ID-Database-File (including filename)"
|
||||||
|
msgstr "Ruta del fichero de IDs DMRIDs.dat (incluyendo el fichero)"
|
||||||
|
|
||||||
|
#: setup.php:87
|
||||||
|
msgid "YSFGateway-Configuration"
|
||||||
|
msgstr "Configuración de YSFGateway"
|
||||||
|
|
||||||
|
#: setup.php:89
|
||||||
|
msgid "Enable YSFGateway"
|
||||||
|
msgstr "YSFGateway Activo"
|
||||||
|
|
||||||
|
#: setup.php:93
|
||||||
|
msgid "Path to YSFGateway-logfile"
|
||||||
|
msgstr "Ruta del log del YSFGateway"
|
||||||
|
|
||||||
|
#: setup.php:97
|
||||||
|
msgid "Logfile-prefix"
|
||||||
|
msgstr "Prefijo del fichero Log"
|
||||||
|
|
||||||
|
#: setup.php:101
|
||||||
|
msgid "Path to YSFGateway.ini"
|
||||||
|
msgstr "Ruta del YSFGateway.ini"
|
||||||
|
|
||||||
|
#: setup.php:105
|
||||||
|
msgid "YSFGateway.ini-filename"
|
||||||
|
msgstr "Nombre del fichero YSFGateway.ini"
|
||||||
|
|
||||||
|
#: setup.php:109
|
||||||
|
msgid "Path to YSFHosts.txt"
|
||||||
|
msgstr "Ruta del YSFHosts.txt"
|
||||||
|
|
||||||
|
#: setup.php:113
|
||||||
|
msgid "YSFHosts.txt-filename"
|
||||||
|
msgstr "Nombre del fichero YSFHosts.txt"
|
||||||
|
|
||||||
|
#: setup.php:118
|
||||||
|
msgid "ircddbgateway-Configuration"
|
||||||
|
msgstr "Configuración del ircddbgateway"
|
||||||
|
|
||||||
|
#: setup.php:120
|
||||||
|
msgid "Path to Links.log"
|
||||||
|
msgstr "Ruta del Links.log"
|
||||||
|
|
||||||
|
#: setup.php:124
|
||||||
|
msgid "Name of ircddbgateway-executeable"
|
||||||
|
msgstr "Nombre del ejecutable del ircDDBGateway"
|
||||||
|
|
||||||
|
#: setup.php:129
|
||||||
|
msgid "Global Configuration"
|
||||||
|
msgstr "Configuración Global"
|
||||||
|
|
||||||
|
#: setup.php:188
|
||||||
|
msgid "Locale"
|
||||||
|
msgstr "Local"
|
||||||
|
|
||||||
|
#: setup.php:192
|
||||||
|
msgid "URL to Logo"
|
||||||
|
msgstr "Logo de la URL"
|
||||||
|
|
||||||
|
#: setup.php:196
|
||||||
|
msgid "URL to DMRplus-Logo"
|
||||||
|
msgstr "Logo de la URL de DMRplus"
|
||||||
|
|
||||||
|
#: setup.php:200
|
||||||
|
msgid "URL to BrandMeister-Logo"
|
||||||
|
msgstr "Logo de la URL de BrandMeister"
|
||||||
|
|
||||||
|
#: setup.php:204
|
||||||
|
msgid "Refresh page after in seconds"
|
||||||
|
msgstr "Refresco de la página en segundos"
|
||||||
|
|
||||||
|
#: setup.php:208
|
||||||
|
msgid "Show System Info"
|
||||||
|
msgstr "Mostrar información del Sistema"
|
||||||
|
|
||||||
|
#: setup.php:212
|
||||||
|
msgid "Show Disk Use"
|
||||||
|
msgstr "Mostrar uso de disco"
|
||||||
|
|
||||||
|
#: setup.php:216
|
||||||
|
msgid "Show Repeater Info"
|
||||||
|
msgstr "Mostrar información del Repetidor"
|
||||||
|
|
||||||
|
#: setup.php:220
|
||||||
|
msgid "Show Enabled Modes"
|
||||||
|
msgstr "Mostrar modos activos"
|
||||||
|
|
||||||
|
#: setup.php:224
|
||||||
|
msgid "Show Last Heard List of today's"
|
||||||
|
msgstr "Mostrar listado de últimas estaciones escuchadas hoy"
|
||||||
|
|
||||||
|
#: setup.php:228
|
||||||
|
msgid "Show Today's local transmissions"
|
||||||
|
msgstr "Mostrar transmisiones locales de hoy"
|
||||||
|
|
||||||
|
#: setup.php:232
|
||||||
|
msgid "Show progressbars"
|
||||||
|
msgstr "Mostrar barra de progreso"
|
||||||
|
|
||||||
|
#: setup.php:236
|
||||||
|
msgid "Enable CPU-temperature-warning"
|
||||||
|
msgstr "Activar alarma de temperatura CPU"
|
||||||
|
|
||||||
|
#: setup.php:240
|
||||||
|
msgid "Warning temperature"
|
||||||
|
msgstr "Alarma de Temperatura"
|
||||||
|
|
||||||
|
#: setup.php:244
|
||||||
|
msgid "Enable Network-Switching-Function"
|
||||||
|
msgstr "Activar la función cambio de Red"
|
||||||
|
|
||||||
|
#: setup.php:248
|
||||||
|
msgid "Username for switching networks:"
|
||||||
|
msgstr "Nombre de usuario para cambiar de Red:"
|
||||||
|
|
||||||
|
#: setup.php:252
|
||||||
|
msgid "Password for switching networks:"
|
||||||
|
msgstr "Contraseña para cambiar de Red:"
|
||||||
|
|
||||||
|
#: setup.php:257
|
||||||
|
msgid "Enable Management-Functions below"
|
||||||
|
msgstr "Habilitar funciones de administración siguientes"
|
||||||
|
|
||||||
|
#: setup.php:261
|
||||||
|
msgid "Username for view log:"
|
||||||
|
msgstr "Usuario para ver el Log:"
|
||||||
|
|
||||||
|
#: setup.php:265
|
||||||
|
msgid "Password for view log:"
|
||||||
|
msgstr "Contraseña para ver el Log:"
|
||||||
|
|
||||||
|
#: setup.php:269
|
||||||
|
msgid "Username for halt:"
|
||||||
|
msgstr "Usuario para detener los servicios:"
|
||||||
|
|
||||||
|
#: setup.php:273
|
||||||
|
msgid "Password for halt:"
|
||||||
|
msgstr "Contraseña para detener los servicios:"
|
||||||
|
|
||||||
|
#: setup.php:277
|
||||||
|
msgid "Username for reboot:"
|
||||||
|
msgstr "Usuario para reiniciar el sistema:"
|
||||||
|
|
||||||
|
#: setup.php:281
|
||||||
|
msgid "Password for reboot:"
|
||||||
|
msgstr "Contraseña para reiniciar el sistema:"
|
||||||
|
|
||||||
|
#: setup.php:285
|
||||||
|
msgid "Username for restart:"
|
||||||
|
msgstr "Usuario para reiniciar los servicios:"
|
||||||
|
|
||||||
|
#: setup.php:289
|
||||||
|
msgid "Password for restart:"
|
||||||
|
msgstr "contraseña para reiniciar los servicios:"
|
||||||
|
|
||||||
|
#: setup.php:293
|
||||||
|
msgid "Reboot MMDVMHost command:"
|
||||||
|
msgstr "Comando para reiniciar MMDVMHost:"
|
||||||
|
|
||||||
|
#: setup.php:297
|
||||||
|
msgid "Reboot system command:"
|
||||||
|
msgstr "Comando para reiniciar el sistema:"
|
||||||
|
|
||||||
|
#: setup.php:301
|
||||||
|
msgid "Halt system command:"
|
||||||
|
msgstr "Comando para reiniciar servicios:"
|
||||||
|
|
||||||
|
#: setup.php:305
|
||||||
|
msgid "Show Powerstate (online or battery, wiringpi needed)"
|
||||||
|
msgstr "Mostrar nivel de carga (necesaria batería o wiringpi)"
|
||||||
|
|
||||||
|
#: setup.php:309
|
||||||
|
msgid "GPIO pin to monitor:"
|
||||||
|
msgstr "Pin GPIO a monitorizar:"
|
||||||
|
|
||||||
|
#: setup.php:313
|
||||||
|
msgid "State that signalizes online-state:"
|
||||||
|
msgstr "Estado que indica alimentación autonoma:"
|
||||||
|
|
||||||
|
#: setup.php:317
|
||||||
|
msgid "Show link to QRZ.com on Callsigns"
|
||||||
|
msgstr "Mostrar link a QRZ.com en indicativos"
|
||||||
|
|
||||||
|
#: setup.php:321
|
||||||
|
msgid "RSSI value"
|
||||||
|
msgstr "Valores RSSI"
|
||||||
|
|
||||||
|
#: setup.php:323
|
||||||
|
msgid "minimal"
|
||||||
|
msgstr "mínimo"
|
||||||
|
|
||||||
|
#: setup.php:324
|
||||||
|
msgid "maximal"
|
||||||
|
msgstr "máximo"
|
||||||
|
|
||||||
|
#: setup.php:325
|
||||||
|
msgid "average"
|
||||||
|
msgstr "media"
|
||||||
|
|
||||||
|
#: setup.php:331
|
||||||
|
msgid "Save configuration"
|
||||||
|
msgstr "Grabar configuración"
|
||||||
|
|
||||||
|
#: include/functions.php:13 include/functions.php:15
|
||||||
|
msgid "compiled"
|
||||||
|
msgstr "compilado"
|
||||||
|
|
||||||
|
#: include/functions.php:161
|
||||||
|
msgid "ircddbgateway is down!"
|
||||||
|
msgstr "ircDDBGateway apagado!"
|
||||||
|
|
||||||
|
#: include/functions.php:164 include/functions.php:175
|
||||||
|
msgid "Remote gateway configured - not checked!"
|
||||||
|
msgstr "Gateway remoto configurado - no chequeado!"
|
||||||
|
|
||||||
|
#: include/functions.php:172
|
||||||
|
msgid "YSFGateway is down!"
|
||||||
|
msgstr "YSFGateway apagado!"
|
||||||
|
|
||||||
|
#: include/functions.php:182
|
||||||
|
msgid "MMDVMHost is down!"
|
||||||
|
msgstr "MMDVMHost apagado!"
|
||||||
|
|
||||||
|
#: include/functions.php:550
|
||||||
|
msgid "idle"
|
||||||
|
msgstr "idle"
|
||||||
|
|
||||||
|
#: include/functions.php:623
|
||||||
|
msgid "ircddbgateway not running!"
|
||||||
|
msgstr "ircDDBGateway no funcionando!"
|
||||||
|
|
||||||
|
#: include/functions.php:640 include/functions.php:656
|
||||||
|
#: include/functions.php:741
|
||||||
|
msgid "not linked"
|
||||||
|
msgstr "no enlazado"
|
||||||
|
|
||||||
|
#: include/functions.php:692
|
||||||
|
msgid "something went wrong!"
|
||||||
|
msgstr "algo ha ido mal!"
|
||||||
|
|
||||||
|
#: include/functions.php:706 include/functions.php:724
|
||||||
|
msgid "Reflector not linked"
|
||||||
|
msgstr "Reflector no enlazado"
|
||||||
|
|
||||||
|
#: include/functions.php:708 include/functions.php:719
|
||||||
|
msgid "Reflector"
|
||||||
|
msgstr "Reflector"
|
||||||
|
|
||||||
|
#: include/functions.php:719
|
||||||
|
msgid "not cfmd"
|
||||||
|
msgstr "not cfmd"
|
||||||
|
|
||||||
|
#: include/functions.php:743
|
||||||
|
msgid "YSFGateway not running"
|
||||||
|
msgstr "YSFGateway no está funcionando"
|
||||||
|
|
||||||
|
#: include/functions.php:830
|
||||||
|
msgid "DMRIDs.dat not correct!"
|
||||||
|
msgstr "DMRIDs.dat incorrecto!"
|
||||||
|
|
||||||
|
#: index.php:78
|
||||||
|
msgid "Configuration"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: setup.php:209
|
||||||
|
msgid "Use networks.php instead of configuration below"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: include/lh_ajax.php:6
|
||||||
|
msgid "Cached"
|
||||||
|
msgstr "En caché"
|
||||||
|
|
30
html/locale/es_ES/settings.php
Executable file
|
@ -0,0 +1,30 @@
|
||||||
|
<?php
|
||||||
|
define("LANG_NAME", "Spanish");
|
||||||
|
define("LANG_LOCALE", "es_ES");
|
||||||
|
define("LANG", "es");
|
||||||
|
define("LANGCODE", "es");
|
||||||
|
define("DATATABLESTRANSLATION", '{
|
||||||
|
"sProcessing": "Procesando...",
|
||||||
|
"sLengthMenu": "Mostrar _MENU_ registros",
|
||||||
|
"sZeroRecords": "No se encontraron resultados",
|
||||||
|
"sEmptyTable": "Ningún dato disponible en esta tabla",
|
||||||
|
"sInfo": "Mostrando registros del _START_ al _END_ de un total de _TOTAL_ registros",
|
||||||
|
"sInfoEmpty": "Mostrando registros del 0 al 0 de un total de 0 registros",
|
||||||
|
"sInfoFiltered": "(filtrado de un total de _MAX_ registros)",
|
||||||
|
"sInfoPostFix": "",
|
||||||
|
"sSearch": "Buscar:",
|
||||||
|
"sUrl": "",
|
||||||
|
"sInfoThousands": ",",
|
||||||
|
"sLoadingRecords": "Cargando...",
|
||||||
|
"oPaginate": {
|
||||||
|
"sFirst": "Primero",
|
||||||
|
"sLast": "Último",
|
||||||
|
"sNext": "Siguiente",
|
||||||
|
"sPrevious": "Anterior"
|
||||||
|
},
|
||||||
|
"oAria": {
|
||||||
|
"sSortAscending": ": Activar para ordenar la columna de manera ascendente",
|
||||||
|
"sSortDescending": ": Activar para ordenar la columna de manera descendente"
|
||||||
|
}
|
||||||
|
}');
|
||||||
|
?>
|