This repository has been archived on 2026-05-31. You can view files and clone it, but cannot push or open issues or pull requests.
2018-01-02 18:48:07 +01:00

99 lines
3.8 KiB
C++

#include "core.h"
#include "loggingcategory.h"
#include "QCoreApplication"
Core::Core(const QString &serialPort, const int &channel, QObject *parent) :
QObject(parent),
m_serialPort(serialPort)
{
m_manager = new ZigbeeNetworkManager(channel, m_serialPort, this);
// Set commands
TerminalCommand runCommand("run", "Run the zigbee controller in a normal non interactive mode.");
QStringList optionalParams;
optionalParams.append("router");
optionalParams.append("coordinator");
runCommand.setOptionalParameters(optionalParams);
m_commands.append(runCommand);
m_commands.append(TerminalCommand("start", "Start the zigbee network"));
m_commands.append(TerminalCommand("reset", "Reset the zigbee controller"));
m_commands.append(TerminalCommand("scan", "Start scanning for zigbee networks"));
m_commands.append(TerminalCommand("version", "Print the version of the zigbee controll bridge firmware"));
m_commands.append(TerminalCommand("list-nodes", "List all nodes and information of the current network"));
m_commands.append(TerminalCommand("permit-join", "Permit nodes to join the network"));
m_commands.append(TerminalCommand("touch-link", "Initiate touch link pairing"));
m_commands.append(TerminalCommand("reset-touchlink", "Touch link factory reset"));
m_commands.append(TerminalCommand("whitelist", "Enable the white list joining"));
TerminalCommander::instance()->setCommands(m_commands);
TerminalCommander::instance()->start();
connect(TerminalCommander::instance(), &TerminalCommander::commandReceived, this, &Core::onCommandReceived);
connect(TerminalCommander::instance(), &TerminalCommander::finished, QCoreApplication::instance(), &QCoreApplication::quit);
}
void Core::onCommandReceived(const QStringList &tokens)
{
TerminalCommand command;
foreach (const TerminalCommand &terminalCommand, m_commands) {
if (tokens.first() == terminalCommand.command()) {
command = terminalCommand;
break;
}
}
if (!command.isValid()) {
qCWarning(dcZigbee()) << "Unknown command" << tokens;
return;
}
// TODO: Process command
qCDebug(dcZigbee()) << "Executing" << tokens.join(" ");
if (command.command() == "run") {
ZigbeeNetworkManager::NodeType nodeType = ZigbeeNetworkManager::NodeTypeCoordinator;
if (tokens.count() > 1) {
if (!command.optionalParameters().contains(tokens.at(1))) {
qCWarning(dcZigbee()) << "Unknown paramter" << tokens.at(1);
return;
}
if (tokens.at(1) == "router") {
nodeType = ZigbeeNetworkManager::NodeTypeRouter;
}
}
m_manager->erasePersistentData();
m_manager->getVersion();
m_manager->setExtendedPanId(m_manager->extendedPanId());
m_manager->setChannelMask(0);
m_manager->setDeviceType(nodeType);
} else if (command.command() == "start") {
m_manager->startNetwork();
} else if (command.command() == "version") {
m_manager->getVersion();
} else if (command.command() == "scan") {
m_manager->startScan();
} else if (command.command() == "reset") {
m_manager->resetController();
} else if (command.command() == "permit-join") {
m_manager->permitJoining();
} else if (command.command() == "touch-link") {
m_manager->initiateTouchLink();
} else if (command.command() == "touch-link-reset") {
m_manager->touchLinkFactoryReset();
} else if (command.command() == "enable-whitelist") {
m_manager->enableWhitelist();
} else if (command.command() == "list-nodes") {
qCDebug(dcZigbee()) << "--> Host:" << m_manager;
foreach (ZigbeeNode *node, m_manager->nodeList()) {
qCDebug(dcZigbee()) << "-->" << node;
}
}
}