-
Notifications
You must be signed in to change notification settings - Fork 1
/
channel_manager.h
131 lines (70 loc) · 1.76 KB
/
channel_manager.h
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#pragma mark - CHANNEL MANAGERS
// HELPER FUNCTIONS
void set_other_timeout() {
for (int i = 0; i < CHANNEL_COUNT; i++) {
if (channel_status[i].state == Wait_cont) {
DISPLAY_IF_DEBUG("set_other_timeout");
channel_status[i].state = Timeout;
}
}
}
void cleanup_timeout() {
for (int i = 0; i < CHANNEL_COUNT; i++) {
CHANNEL_STATUS &c = channel_status[i];
int m = millis();
if (c.state != Available) {
// hmmm... using U2FHID_TRANS_TIMEOUT for timeout as of now, but
// we may want to modify it later...
if ((m - c.last_millis) > U2FHID_TRANS_TIMEOUT) c.state = Available;
}
}
}
// channel allocation
int find_channel_index(int channel_id) {
for (int i = 0; i < CHANNEL_COUNT; i++) {
if (channel_status[i].channel_id == channel_id) {
channel_status[i].last_millis = millis();
return i;
}
}
return -1;
}
int allocate_new_channel() {
//alloace new channel_id
int channel_id = 1;
while (true) {
bool found = false;
for (int i = 0; i < CHANNEL_COUNT; i++) {
if (channel_status[i].state != Available) {
if (channel_status[i].channel_id == channel_id) {
found = true;
channel_id++;
break;
}
}
}
if (!found) break;
}
return channel_id;
}
int allocate_channel(int channel_id) {
bool free_slot = false;
if (channel_id==0) channel_id = allocate_new_channel();
for (int i = 0; i < CHANNEL_COUNT; i++) {
if (channel_status[i].state == Available) {
free_slot = true;
break;
}
}
if (!free_slot) cleanup_timeout();
for (int i = 0; i < CHANNEL_COUNT; i++) {
CHANNEL_STATUS &c = channel_status[i];
if (c.state == Available) {
c.channel_id = channel_id;
c.state = Wait_init;
c.last_millis = millis();
return channel_id;
}
}
return 0;
}