PsiSwarm Library  0.8
led.cpp
1 /* University of York Robotics Laboratory PsiSwarm Library: LED Functions Source File
2  *
3  * Copyright 2016 University of York
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
7  * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS
8  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9  * See the License for the specific language governing permissions and limitations under the License.
10  *
11  * File: led.cpp
12  *
13  * (C) Dept. Electronics & Computer Science, University of York
14  * James Hilder, Alan Millard, Alexander Horsfield, Homero Elizondo, Jon Timmis
15  *
16  * PsiSwarm Library Version: 0.8
17  *
18  * October 2016
19  *
20  *
21  */
22 
23 #include "psiswarm.h"
24 
25 char green_led_states;
26 char red_led_states;
27 char center_led_state;
28 
29 char held_red_states;
30 char held_green_states;
31 Timeout blink_led_timeout;
32 
33 unsigned short Led::get_led_states()
34 {
35  return (green_led_states << 8) + red_led_states;
36 }
37 
38 void Led::set_leds(char green, char red)
39 {
40  green_led_states = green;
41  red_led_states = red;
42  IF_update_leds();
43 }
44 
45 void Led::set_base_led(char state)
46 {
47  i2c_setup.IF_set_base_LED(state);
48 }
49 
50 void Led::set_green_leds(char green)
51 {
52  green_led_states = green;
53  IF_update_leds();
54 }
55 
56 void Led::set_red_leds(char red)
57 {
58  red_led_states = red;
59  IF_update_leds();
60 }
61 
62 void Led::set_led(char led, char state)
63 {
64  if(state % 2 == 1) red_led_states |= 1 << led;
65  else red_led_states &= ~(1 << led);
66  if(state / 2) green_led_states |= 1 << led;
67  else green_led_states &= ~(1 << led);
68  IF_update_leds();
69 }
70 
71 void Led::blink_leds(float timeout)
72 {
74  set_leds(0xFF,0xFF);
75  blink_led_timeout.attach(this,&Led::restore_led_states, timeout);
76 }
77 
78 void Led::set_center_led(char state)
79 {
80  set_center_led(state, center_led_brightness);
81 }
82 
83 void Led::set_center_led(char state, float brightness)
84 {
85  center_led_brightness = brightness;
86  center_led_state = state;
87  switch(center_led_state) {
88  case 0:
89  center_led_red.write(0);
90  center_led_green.write(0);
91  break;
92  case 1:
93  center_led_red.write(center_led_brightness / 4);
94  center_led_green.write(0);
95  break;
96  case 2:
97  center_led_red.write(0);
98  center_led_green.write(center_led_brightness);
99  break;
100  case 3:
101  center_led_red.write(center_led_brightness / 4);
102  center_led_green.write(center_led_brightness);
103  break;
104  }
105 }
106 
107 void Led::set_center_led_brightness(float brightness)
108 {
109  set_center_led(center_led_state,brightness);
110 }
111 
113 {
114  held_red_states = red_led_states;
115  held_green_states = green_led_states;
116 }
117 
119 {
120  set_leds(held_green_states,held_red_states);
121 }
122 
123 void Led::IF_init_leds()
124 {
125  green_led_states = 0;
126  red_led_states = 0;
127  center_led_red.period_us(100);
128  center_led_green.period_us(100);
129  set_center_led(0,0.2);
130 }
131 
132 void Led::IF_update_leds()
133 {
134  char led_byte_0 = (((green_led_states & (1 << 3)) == 0) << 7) +
135  (((green_led_states & (1 << 2)) == 0) << 5) +
136  (((green_led_states & (1 << 1)) == 0) << 3) +
137  (((green_led_states & (1)) == 0) << 1) +
138  (((red_led_states & (1 << 3)) == 0) << 6) +
139  (((red_led_states & (1 << 2)) == 0) << 4) +
140  (((red_led_states & (1 << 1)) == 0) << 2) +
141  (((red_led_states & (1)) == 0));
142  char led_byte_1 = (((green_led_states & (1 << 7)) == 0) << 7) +
143  (((green_led_states & (1 << 6)) == 0) << 5) +
144  (((green_led_states & (1 << 5)) == 0) << 3) +
145  (((green_led_states & (1 << 4)) == 0) << 1) +
146  (((red_led_states & (1 << 7)) == 0) << 6) +
147  (((red_led_states & (1 << 6)) == 0) << 4) +
148  (((red_led_states & (1 << 5)) == 0) << 2) +
149  (((red_led_states & (1 << 4)) == 0));
150  i2c_setup.IF_write_to_led_ic(led_byte_0,led_byte_1);
151 }
void set_leds(char green, char red)
Definition: led.cpp:38
void set_center_led_brightness(float brightness)
Definition: led.cpp:107
void set_center_led(char state)
Definition: led.cpp:78
unsigned short get_led_states(void)
Definition: led.cpp:33
void set_base_led(char state)
Definition: led.cpp:45
void set_led(char led, char state)
Definition: led.cpp:62
void set_green_leds(char green)
Definition: led.cpp:50
void save_led_states(void)
Definition: led.cpp:112
void restore_led_states(void)
Definition: led.cpp:118
void blink_leds(float timeout)
Definition: led.cpp:71
void set_red_leds(char red)
Definition: led.cpp:56