first commit

This commit is contained in:
Xavier 2022-08-24 08:10:10 +02:00
commit d3b4ff8398
520 changed files with 223703 additions and 0 deletions

145242
DMRIds.dat Executable file

File diff suppressed because it is too large Load Diff

16
MMDVMCal/.gitignore vendored Executable file
View 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

File diff suppressed because it is too large Load Diff

57
MMDVMCal/BERCal.h Executable file
View 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
View 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
View 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
View 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
View 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

File diff suppressed because it is too large Load Diff

32
MMDVMCal/Golay24128.h Executable file
View 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
View 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
View 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
View 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

File diff suppressed because it is too large Load Diff

154
MMDVMCal/MMDVMCal.h Executable file
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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>&lt;space&gt;</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>&lt;space&gt;</td><td>Toggle transmit</td></tr>
</table>

516
MMDVMCal/SerialController.cpp Executable file
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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

1
README.md Executable file
View File

@ -0,0 +1 @@
Projet MMDVM for BANANA PI M2 ZERO

178
hd44780/I2C_LCD_driver.py Executable file
View 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

Binary file not shown.

120
hd44780/hd44780.py Executable file
View 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
View 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
View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

117
html/LICENSE Executable file
View 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
View 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
View 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","&Oslash;",$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","&Oslash;",$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; ?> &deg;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
View File

@ -0,0 +1 @@
Multimode DMRplus

63
html/config/config.php Executable file
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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

Binary file not shown.

11
html/database/dbupdate.sh Executable file
View 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

File diff suppressed because it is too large Load Diff

80
html/editor.php Executable file
View 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
View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 394 B

BIN
html/images/1.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 452 B

BIN
html/images/2.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 493 B

BIN
html/images/3.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 531 B

BIN
html/images/4.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 571 B

BIN
html/images/dashboard.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

61
html/include/disk.php Executable file
View 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

File diff suppressed because it is too large Load Diff

27
html/include/init.php Executable file
View 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
View 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
View 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
View 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
View 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
View 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
View 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) ? "&nbsp;day" : "&nbsp;days");
}
if ($hours > 0) {
$uptimeString .= (($days > 0) ? ", " : "") . $hours;
$uptimeString .= (($hours == 1) ? "&nbsp;hr" : "&nbsp;hrs");
}
if ($mins > 0) {
$uptimeString .= (($days > 0 || $hours > 0) ? ", " : "") . $mins;
$uptimeString .= (($mins == 1) ? "&nbsp;min" : "&nbsp;mins");
}
if ($secs > 0) {
$uptimeString .= (($days > 0 || $hours > 0 || $mins > 0) ? ", " : "") . $secs;
$uptimeString .= (($secs == 1) ? "&nbsp;s" : "&nbsp;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
View 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
View 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
View 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">&quot;lighty-enable-mod cgi&quot;</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">&quot;lighty-enable-mod userdir&quot;</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
View 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>&nbsp;<?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>&nbsp;<?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>&nbsp;<?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>&nbsp;<?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>&nbsp;<?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>&nbsp;'.$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>&nbsp;<?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>&nbsp;<?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>&nbsp;<?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
View 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
View 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

File diff suppressed because it is too large Load Diff

Binary file not shown.

View 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
View 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&oslash;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&oslash;g:",
"sUrl": "",
"oPaginate": {
"sFirst": "F&oslash;rste",
"sPrevious": "Forrige",
"sNext": "N&aelig;ste",
"sLast": "Sidste"
}
}');
?>

Binary file not shown.

View 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
View 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"
}
}');
?>

Binary file not shown.

View 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
View 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"
}
}');
?>

Binary file not shown.

View 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
View 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"
}
}');
?>

Binary file not shown.

View 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
View 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"
}
}');
?>

Some files were not shown because too many files have changed in this diff Show More