rc_receive.c
Go to the documentation of this file.00001
00043 #include <includes.h>
00044
00045 static int rcx_read[RCX_LAST];
00046 static volatile RCX_DATA rcx_chans[RCX_LAST];
00047 static int rcx_is_init = 0;
00058 void rcx_init(int chan_0, int chan_1, int chan_2, int chan_3)
00059 {
00060 int i = 0;
00061 volatile RCX_DATA* data;
00062 for (i = 0; i < RCX_LAST; i++){
00063 data = &rcx_chans[i];
00064 data->prev = -1;
00065 data->start = 0;
00066 data->value = 0;
00067 data->overflows = 0;
00068 }
00069 rcx_read[0] = chan_0;
00070 rcx_read[1] = chan_1;
00071 rcx_read[2] = chan_2;
00072 rcx_read[3] = chan_3;
00073 rcx_is_init = 1;
00074 }
00075
00082 float rcx_get_chan(RCX_CHAN chan)
00083 {
00084 if (rcx_is_init){
00085 if (rcx_read[chan]){
00086 return (float)(rcx_chans[chan].value>>14);
00087 } else {
00088 error_occurred(ERROR_RCX_BAD_CHAN);
00089 return 0.0;
00090 }
00091 } else {
00092 error_occurred(ERROR_RCX_NINIT);
00093 return 0.0;
00094 }
00095 }
00096
00102 float rcx_get_chan_0(void){return rcx_get_chan(RCX_CHAN_0);}
00108 float rcx_get_chan_1(void){return rcx_get_chan(RCX_CHAN_1);}
00114 float rcx_get_chan_2(void){return rcx_get_chan(RCX_CHAN_2);}
00120 float rcx_get_chan_3(void){return rcx_get_chan(RCX_CHAN_3);}
00121
00128 void rcx_isr(void)
00129 {
00130 int i;
00131 int interrupts = T0IR;
00132 int cap_0 = T0CR0;
00133 int cap_1 = T0CR1;
00134 int cap_2 = T0CR2;
00135 int cap_3 = T0CR3;
00136 int pins = FIO0PIN;
00137 int lvl_0 = pins & (1<<22);
00138 int lvl_1 = pins & (1<<27);
00139 int lvl_2 = pins & (1<<16);
00140 int lvl_3 = pins & (1<<29);
00141 int flag_cap_0 = interrupts & (1<<4);
00142 int flag_cap_1 = interrupts & (1<<5);
00143 int flag_cap_2 = interrupts & (1<<6);
00144 int flag_cap_3 = interrupts & (1<<7);
00145 int flag_overflow = interrupts & (1<<0);
00146 T0IR = flag_overflow | flag_cap_0 | flag_cap_1 | flag_cap_2 | flag_cap_3;
00147
00148 if (flag_overflow){
00149 for (i = 0; i < RCX_LAST; i++){
00150 rcx_chans[i].overflows++;
00151 }
00152 }
00153 if (flag_cap_0 && rcx_read[0]){
00154 rcx_update(RCX_CHAN_0, lvl_0, cap_0, flag_overflow);
00155 }
00156 if (flag_cap_1 && rcx_read[1]){
00157 rcx_update(RCX_CHAN_1, lvl_1, cap_1, flag_overflow);
00158 }
00159 if (flag_cap_2 && rcx_read[2]){
00160 rcx_update(RCX_CHAN_2, lvl_2, cap_2, flag_overflow);
00161 }
00162 if (flag_cap_3 && rcx_read[3]){
00163 rcx_update(RCX_CHAN_3, lvl_3, cap_3, flag_overflow);
00164 }
00165
00166
00167
00168 }
00169
00177 void rcx_update(RCX_CHAN chan, int curr, int cap_value, int flag_overflow)
00178 {
00179 static int coeff = 4;
00180 int new_value;
00181 volatile RCX_DATA* data = &rcx_chans[chan];
00182
00183 if (flag_overflow){
00184 if (cap_value > T0MR0 / 2){
00185 data->overflows--;
00186 }
00187 }
00188
00189 if (!data->prev && curr){
00190 data->start = cap_value;
00191 } else if (data->prev && !curr){
00192
00193 new_value = (data->overflows * T0MR0) + cap_value - data->start;
00194
00195 if (data->value == 0){
00196 data->value = new_value<<14;
00197 } else if (new_value > 0) {
00198 data->value = data->value - (data->value >> coeff) + (new_value << (14-coeff));
00199 }
00200
00201 } else {
00202 error_occurred(ERROR_RCX_BAD_LVLS);
00203 }
00204 data->overflows = 0;
00205 data->prev = curr;
00206 }
00207