C++ Library for the PsiSwarm Robot - Version 0.8

Dependents:   PsiSwarm_V8_Blank_CPP Autonomia_RndmWlk

Fork of PsiSwarmV7_CPP by Psi Swarm Robot

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers led.cpp Source File

led.cpp

00001 /* University of York Robotics Laboratory PsiSwarm Library: LED Functions Source File
00002  *
00003  * Copyright 2016 University of York
00004  *
00005  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License.
00006  * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
00007  * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS
00008  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00009  * See the License for the specific language governing permissions and limitations under the License.
00010  *
00011  * File: led.cpp
00012  *
00013  * (C) Dept. Electronics & Computer Science, University of York
00014  * James Hilder, Alan Millard, Alexander Horsfield, Homero Elizondo, Jon Timmis
00015  *
00016  * PsiSwarm Library Version: 0.8
00017  *
00018  * October 2016
00019  *
00020  *
00021  */
00022 
00023 #include "psiswarm.h"
00024 
00025 char green_led_states;
00026 char red_led_states;
00027 char center_led_state;
00028 
00029 char held_red_states;
00030 char held_green_states;
00031 Timeout blink_led_timeout;
00032 
00033 unsigned short Led::get_led_states()
00034 {
00035     return (green_led_states << 8) + red_led_states;
00036 }
00037 
00038 void Led::set_leds(char green, char red)
00039 {
00040     green_led_states = green;
00041     red_led_states = red;
00042     IF_update_leds();
00043 }
00044 
00045 void Led::set_base_led(char state)
00046 {
00047     i2c_setup.IF_set_base_LED(state);
00048 }
00049 
00050 void Led::set_green_leds(char green)
00051 {
00052     green_led_states = green;
00053     IF_update_leds();
00054 }
00055 
00056 void Led::set_red_leds(char red)
00057 {
00058     red_led_states = red;
00059     IF_update_leds();
00060 }
00061 
00062 void Led::set_led(char led, char state)
00063 {
00064     if(state % 2 == 1) red_led_states |= 1 << led;
00065     else red_led_states &= ~(1 << led);
00066     if(state / 2) green_led_states |= 1 << led;
00067     else green_led_states &= ~(1 << led);
00068     IF_update_leds();
00069 }
00070 
00071 void Led::blink_leds(float timeout)
00072 {
00073     save_led_states();
00074     set_leds(0xFF,0xFF);
00075     blink_led_timeout.attach(this,&Led::restore_led_states, timeout);
00076 }
00077 
00078 void Led::set_center_led(char state)
00079 {
00080     set_center_led(state, center_led_brightness);
00081 }
00082 
00083 void Led::set_center_led(char state, float brightness)
00084 {
00085     center_led_brightness = brightness;
00086     center_led_state = state;
00087     switch(center_led_state) {
00088         case 0:
00089             center_led_red.write(0);
00090             center_led_green.write(0);
00091             break;
00092         case 1:
00093             center_led_red.write(center_led_brightness / 4);
00094             center_led_green.write(0);
00095             break;
00096         case 2:
00097             center_led_red.write(0);
00098             center_led_green.write(center_led_brightness);
00099             break;
00100         case 3:
00101             center_led_red.write(center_led_brightness / 4);
00102             center_led_green.write(center_led_brightness);
00103             break;
00104     }
00105 }
00106 
00107 void Led::set_center_led_brightness(float brightness)
00108 {
00109     set_center_led(center_led_state,brightness);
00110 }
00111 
00112 void Led::save_led_states()
00113 {
00114     held_red_states = red_led_states;
00115     held_green_states = green_led_states;
00116 }
00117 
00118 void Led::restore_led_states()
00119 {
00120     set_leds(held_green_states,held_red_states);
00121 }
00122 
00123 void Led::IF_init_leds()
00124 {
00125     green_led_states = 0;
00126     red_led_states = 0;
00127     center_led_red.period_us(100);
00128     center_led_green.period_us(100);
00129     set_center_led(0,0.2);
00130 }
00131 
00132 void Led::IF_update_leds()
00133 {
00134     char led_byte_0 =  (((green_led_states & (1 << 3)) == 0) << 7) +
00135                        (((green_led_states & (1 << 2)) == 0) << 5) +
00136                        (((green_led_states & (1 << 1)) == 0) << 3) +
00137                        (((green_led_states & (1)) == 0) << 1) +
00138                        (((red_led_states & (1 << 3)) == 0) << 6) +
00139                        (((red_led_states & (1 << 2)) == 0) << 4) +
00140                        (((red_led_states & (1 << 1)) == 0) << 2) +
00141                        (((red_led_states & (1)) == 0));
00142     char led_byte_1 =  (((green_led_states & (1 << 7)) == 0) << 7) +
00143                        (((green_led_states & (1 << 6)) == 0) << 5) +
00144                        (((green_led_states & (1 << 5)) == 0) << 3) +
00145                        (((green_led_states & (1 << 4)) == 0) << 1) +
00146                        (((red_led_states & (1 << 7)) == 0) << 6) +
00147                        (((red_led_states & (1 << 6)) == 0) << 4) +
00148                        (((red_led_states & (1 << 5)) == 0) << 2) +
00149                        (((red_led_states & (1 << 4)) == 0));
00150     i2c_setup.IF_write_to_led_ic(led_byte_0,led_byte_1);
00151 }