Управление контроллером(пинами) через команды, посылаемые с COM порта.
Возможно расширение списка команд. Файл Serial_Control.h
Команды:
getName; - Возвращает имя контроллера. (имя задается в конструкторе)
getPin(pin_number); - Возвращает digitalRead значение с пина pin_number
setPin(pin_number)(val); - Выполняет digitalWrite значения val на пин pin_number
Код:
//pin.h
//Класс пин
struct pin{
//Номер пина
int numb;
//-----------------------
//Конструктор
pin(){}
pin(int numb){
this->numb = numb;
}
//-----------------------
//Считать значение
int readVal(){
pinMode(numb, INPUT);
int val = digitalRead(numb);
return val;
}
//задать значение
public: void writeVal(int val){
pinMode(numb, OUTPUT);
digitalWrite(numb, val);
}
};
//controller.h
#include "pin.h"
//Контроллер
class controller{
//Имя
protected: String name;
//Пины
protected: pin *pins;
int k_pin;
public: String getName(){
return name;
}
int getK_pin(){
return k_pin;
}
public: void setPinVal(int numb, int val){
pins[numb].writeVal(val);
}
public: int getPinVal(int numb){
return pins[numb].readVal();
}
controller(String name, int k_pin){
this->name = "\0";
this->name = this->name + name;
pins = new pin[k_pin];
this->k_pin = k_pin;
for (int i = 0; i < k_pin; i++)
pins[i].numb = i;;
}
~controller(){
}
};
//Serial_Control.h
#include "controller.h"
//Текст комманд
#define S1 "getName"
#define S2 "getPin"
#define S3 "setPin"
class Serial_Control{
public: controller *c;
public : void getName(){
Serial.println(c->getName());
}
int test_pin_numb(int numb){
if ((numb >= 0) && (numb < c->getK_pin()))
return 1;
else
return 0;
}
//------------------------
int Command1(){
if (In_String == S1){
getName();
return 1;
}
return 0;
}
int Command2(){
if (In_String.indexOf(S2) >= 0){
//Значения параметров
int pos1;
int pos2;
String numb;
pos1 = In_String.indexOf('(');
pos2 = In_String.indexOf(')');
numb = In_String.substring(pos1 + 1, pos2);
int pin = numb.toInt();
Serial.println("Read");
if (test_pin_numb(pin)){
int val = c->getPinVal(pin);
Serial.println("Pin: " + String(pin) + " is val : " + String(val));
return 1;
}
else{
Serial.println("!Pins number Error!");
return -1;
}
}
else
return 0;
}
int Command3(){
if (In_String.indexOf(S3) >= 0){
//Значения параметров
int pos1;
int pos2;
String numb;
pos1 = In_String.indexOf('(');
pos2 = In_String.indexOf(')');
numb = In_String.substring(pos1 + 1, pos2);
int pin = numb.toInt();
pos1 = In_String.indexOf('(', pos2+1);
pos2 = In_String.indexOf(')', pos1);
numb = In_String.substring(pos1 + 1, pos2);
int val = numb.toInt();
Serial.println("Write");
if (test_pin_numb(pin)){
c->setPinVal(pin, val);
Serial.println("Pin: " + String(pin) + " is val : " + String(val));
return 1;
}
else{
Serial.println("!Pins number Error!");
return -1;
}
}
else
return 0;
}
protected:
String In_String;
public: void Serial_Listen(){
char In_char = Serial.read();
if (In_char != ';'){
In_String = In_String + In_char;
}
else{
In_String.trim();
Command1();
Command2();
Command3();
In_String = "\0";
}
}
//------------------------
Serial_Control(String name, int k_pin){
c = new controller(name, k_pin);
In_String = "\0";
}
};
Controller.ino
#include "Serial_Control.h"
Serial_Control *c1;
void setup() {
Serial.begin(9600);
c1 = new Serial_Control("My controller\0", 14);
c1->getName();
}
void loop() {
if (Serial.available() > 0){
c1->Serial_Listen();
}
}
|