175 lines
5.0 KiB
C++
175 lines
5.0 KiB
C++
#pragma once
|
|
|
|
#include "commands.h"
|
|
|
|
#ifndef WIN32_LEAN_AND_MEAN
|
|
#define WIN32_LEAN_AND_MEAN
|
|
#endif
|
|
#include<iostream>
|
|
#include <windows.h>
|
|
#include <winsock2.h>
|
|
#include <ws2tcpip.h>
|
|
#include <iphlpapi.h>
|
|
#include <stdio.h>
|
|
|
|
#pragma comment(lib, "Ws2_32.lib")
|
|
|
|
#pragma pack(push,1)
|
|
|
|
/* Для всех команд:
|
|
*
|
|
* building - номер здания (нумерация по порядку с 0)
|
|
* strip - номер светодиодной ленты (ряда квартир) в здании (нумерация по порядку с 0)
|
|
* план нумерации зданий и лент будет предоставлен на чертежах в отдельных файлах
|
|
* floor - номер этажа (нумерация по порядку, номер нижнего этажа 0)
|
|
* приложение должно будет преобразовать номер квартиры в здании в пару чисел (strip,floor)
|
|
* в соответствии с планом нумерации светодиодных лент в здании
|
|
*
|
|
* state:
|
|
* 0 - выключить подсветку
|
|
* 1 - подсветка первым цветом (например, подсветка всего здания при его выборе)
|
|
* 2 - подсветка вторым цветом (например, подсветка выбранных квартир)
|
|
* 3 - подсветка белым цветом
|
|
*/
|
|
|
|
// Команда, предотвращающая переход в автоматический режим
|
|
|
|
#define CMD_NOP 0x00
|
|
struct CMD_NOP_T : public TCommand
|
|
{
|
|
};
|
|
|
|
/* Команда установки цвета
|
|
*
|
|
* code:
|
|
* 0 - цвет купола в режиме работы с приложением
|
|
* 1 - первый цвет подсветки квартир (например, подсветка всего здания при его выборе)
|
|
* 2 - второй цвет подсветки квартир (например, подсветка выбранных квартир)
|
|
*
|
|
* r,g,b - компоненты цвета
|
|
*/
|
|
|
|
#define OPT_COLOR_DOME 0
|
|
#define OPT_COLOR_ROOM_1 1
|
|
#define OPT_COLOR_ROOM_2 2
|
|
#define OPT_COLOR_ROOM_COUNT 2
|
|
#define OPT_COLOR_COUNT 3
|
|
|
|
#define CMD_GET_COLOR 0x01
|
|
struct CMD_GET_COLOR_T : public TCommand
|
|
{
|
|
byte code;
|
|
};
|
|
|
|
#define CMD_SET_COLOR 0x02
|
|
struct CMD_SET_COLOR_T : public TCommand
|
|
{
|
|
byte code;
|
|
byte r, g, b;
|
|
};
|
|
|
|
// Команда включения/выключения подсветки всего здания
|
|
|
|
#define CMD_SET_BUILDING_STATE 0x03
|
|
struct CMD_SET_BUILDING_STATE_T : public TCommand
|
|
{
|
|
byte building;
|
|
byte state;
|
|
};
|
|
|
|
// Команда включения/выключения подсветки отдельной квартиры
|
|
|
|
#define CMD_SET_ROOM_STATE 0x04
|
|
struct CMD_SET_ROOM_STATE_T : public TCommand
|
|
{
|
|
byte building;
|
|
byte strip;
|
|
byte floor;
|
|
byte state;
|
|
};
|
|
|
|
// Команда включения/выключения подсветки всего этажа
|
|
|
|
#define CMD_SET_FLOOR_STATE 0x05
|
|
struct CMD_SET_FLOOR_STATE_T : public TCommand
|
|
{
|
|
byte building;
|
|
byte floor;
|
|
byte state;
|
|
};
|
|
|
|
// Команда установки подсветки всех квартир
|
|
|
|
#define CMD_SET_ALL_STATE 0x06
|
|
struct CMD_SET_ALL_STATE_T : public TCommand
|
|
{
|
|
byte state;
|
|
};
|
|
|
|
// Команда установки скорости смены подсветки купола
|
|
// millisec - время в миллисекундах
|
|
|
|
#define CMD_SET_DOME_TIME 0x07
|
|
struct CMD_SET_DOME_TIME_T : public TCommand
|
|
{
|
|
word millisec;
|
|
};
|
|
|
|
// Команда включения/выключения отдельных частей макета
|
|
|
|
#define PART_ALL 0xFF
|
|
#define PART_DOME 0x01
|
|
#define PART_BUILDINGS 0x02
|
|
#define PART_STREET_LIGHT 0x04
|
|
#define PART_OFFICE_LIGHT 0x08
|
|
|
|
#define CMD_SET_PART_MODE 0x08
|
|
struct CMD_SET_PART_MODE_T : public TCommand
|
|
{
|
|
byte mode;
|
|
byte part;
|
|
};
|
|
|
|
//Пример отправки команды:
|
|
/*DECLARE_CMD(CMD_SET_BUILDING_STATE, cmd);
|
|
cmd.building = 1;
|
|
cmd.state = 1;
|
|
sendCommand(socket, cmd);*/
|
|
|
|
|
|
|
|
#pragma pack(pop)
|
|
|
|
class CSocket {
|
|
char* ipAddr_;
|
|
u_short port_;
|
|
|
|
public:
|
|
CSocket(char* ipAddr, u_short port) {
|
|
ipAddr_ = ipAddr;
|
|
port_ = port;
|
|
}
|
|
void write(const char* buffer, size_t size) {
|
|
int clientSocket = socket(AF_INET, SOCK_STREAM, 0);
|
|
if (clientSocket == -1) {
|
|
std::cerr << "Error creating socket" << std::endl;
|
|
return;
|
|
}
|
|
struct sockaddr_in serverAddress;
|
|
serverAddress.sin_family = AF_INET;
|
|
serverAddress.sin_port = htons(port_); // Порт сервера
|
|
serverAddress.sin_addr.s_addr = inet_addr(ipAddr_); // IP адрес сервера
|
|
|
|
if (connect(clientSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress)) == -1) {
|
|
std::cerr << "Error connecting to server" << std::endl;
|
|
return;
|
|
}
|
|
|
|
if (send(clientSocket, buffer, size, 0) == -1) {
|
|
std::cerr << "Error sending message" << std::endl;
|
|
return;
|
|
}
|
|
|
|
closesocket(clientSocket);
|
|
}
|
|
}; |