-
Notifications
You must be signed in to change notification settings - Fork 0
/
ChuckPlex.cpp
98 lines (83 loc) · 2.3 KB
/
ChuckPlex.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include "ChuckPlex.h"
// Set up a ChuckPlex instance
ChuckPlex::ChuckPlex(int * pins, int pinCount){
int pinsTemp[pinCount];
memcpy(pinsTemp, pins, sizeof(int)*pinCount);
this->pins = pinsTemp;
this->pinCount = pinCount;
this->maxNodes = pinCount*(pinCount-1);
}
// Enable (turn on) a node.
void ChuckPlex::enable(int node){
if(node>maxNodes) return; // really? fail silently?
int hiPin = pins[hi(node)];
int loPin = pins[lo(node)];
clear();
digitalWrite(hiPin,HIGH);
digitalWrite(loPin,LOW);
pinMode(hiPin,OUTPUT);
pinMode(loPin,OUTPUT);
}
// If you used PWM pins, this will work like analogWrite()
void ChuckPlex::write(int node, int value){
if(node>maxNodes) return; // hmm there should be an error...
int hiPin = pins[hi(node)];
int loPin = pins[lo(node)];
clear();
analogWrite(hiPin,value);
digitalWrite(loPin,LOW);
pinMode(hiPin,OUTPUT);
pinMode(loPin,OUTPUT);
}
// clear all nodes
void ChuckPlex::clear(){
for(int i=0; i<pinCount; i++){
pinMode(pins[i],INPUT);
}
}
// display the wiring between nodes and pins
void ChuckPlex::displayConnections(int nodeCount){
if(nodeCount > maxNodes){
Serial.println("not enough pins for that number of nodes.");
Serial.print("for ");
Serial.print(pinCount);
Serial.print(" pins, there's a maximum of ");
Serial.print(maxNodes);
Serial.println(" nodes.");
Serial.print("You'll need ");
Serial.print((int) ceil((1+sqrt(1+4*nodeCount))/2));
Serial.print(" pins.");
return;
}
for(int p = 0; p<pinCount; p++){
// print the pin number
Serial.print("Pin ");
Serial.print(pins[p]);
Serial.print(": ");
// print all anodes that it is connected to
for(int n=1; n<=nodeCount; n++){
if(hi(n) == p){
Serial.print(n);
Serial.print("+ ");
}
}
// print all cathodes that it is connected to
for(int n=1; n<=nodeCount; n++){
if(lo(n) == p){
Serial.print(n);
Serial.print("- ");
}
}
Serial.println("");
}
}
// private: returns the HIGH pin for a given node
int ChuckPlex::hi(int node){
return (node-1)/(this->pinCount-1);
}
// private: returns the LOW pin for a given node
int ChuckPlex::lo(int node){
int result = (node-1)%(this->pinCount-1);
if(result >= hi(node)) result++;
return result;
}