00001
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #ifndef __dsensor_h__
00039 #define __dsensor_h__
00040
00041 #ifdef __cplusplus
00042 extern "C" {
00043 #endif
00044
00045 #include <config.h>
00046
00047 #ifdef CONF_DSENSOR
00048
00049 #include <sys/h8.h>
00050 #include <sys/bitops.h>
00051
00053
00054
00055
00057
00058
00060
00061 #define SENSOR_1 AD_C
00062 #define SENSOR_2 AD_B
00063 #define SENSOR_3 AD_A
00064 #define BATTERY AD_D
00065
00066
00068
00069 #define LIGHT_RAW_BLACK 0xffc0
00070 #define LIGHT_RAW_WHITE 0x5080
00071
00072
00073
00074
00075
00076
00077 #define LIGHT(a) (147 - ds_scale(a)/7)
00078 #define LIGHT_MAX LIGHT(LIGHT_RAW_WHITE)
00079
00080
00081
00082
00083 #define LIGHT_1 LIGHT(SENSOR_1)
00084 #define LIGHT_2 LIGHT(SENSOR_2)
00085 #define LIGHT_3 LIGHT(SENSOR_3)
00086
00087 #ifdef CONF_DSENSOR_ROTATION
00088
00089
00090
00091 #define ROTATION_1 (ds_rotations[2])
00092 #define ROTATION_2 (ds_rotations[1])
00093 #define ROTATION_3 (ds_rotations[0])
00094 #endif
00095
00096 #ifdef CONF_DSENSOR_VELOCITY
00097
00098
00099
00100 #define VELOCITY_1 (ds_velocities[2])
00101 #define VELOCITY_2 (ds_velocities[1])
00102 #define VELOCITY_3 (ds_velocities[0])
00103 #endif
00104
00105 #ifdef CONF_DSENSOR_MUX
00106 #define SENSOR_1A (ds_muxs[2][0])
00107 #define SENSOR_1B (ds_muxs[2][1])
00108 #define SENSOR_1C (ds_muxs[2][2])
00109 #define SENSOR_2A (ds_muxs[1][0])
00110 #define SENSOR_2B (ds_muxs[1][1])
00111 #define SENSOR_2C (ds_muxs[1][2])
00112 #define SENSOR_3A (ds_muxs[0][0])
00113 #define SENSOR_3B (ds_muxs[0][1])
00114 #define SENSOR_3C (ds_muxs[0][2])
00115 #endif //CONF_DSENSOR_MUX
00116
00118 #define TOUCH(a) ((unsigned int)(a) < 0x8000)
00119
00120
00121
00122 #define TOUCH_1 TOUCH(SENSOR_1)
00123 #define TOUCH_2 TOUCH(SENSOR_2)
00124 #define TOUCH_3 TOUCH(SENSOR_3)
00125
00126
00127 #define ds_scale(x) ((unsigned int)(x)>>6)
00128 #define ds_unscale(x) ((unsigned int)(x)<<6)
00129
00130
00131
00132
00133
00135
00136
00137
00138
00139
00140 extern unsigned char ds_activation;
00141
00142 #ifdef CONF_DSENSOR_ROTATION
00143 extern unsigned char ds_rotation;
00144
00145 extern volatile int ds_rotations[3];
00146
00147 #endif
00148 #ifdef CONF_DSENSOR_VELOCITY
00149 extern volatile int ds_velocities[3];
00150 #endif
00151
00152 #ifdef CONF_DSENSOR_MUX
00153 extern unsigned char ds_mux;
00154
00155 extern volatile int ds_muxs[3][3];
00156 #endif //CONF_DSENSOR_MUX
00157
00159
00160
00161
00163
00165
00167 extern inline void ds_active(volatile unsigned *sensor)
00168 {
00169 if (sensor == &SENSOR_3)
00170 bit_set(&ds_activation, 0);
00171 else if (sensor == &SENSOR_2)
00172 bit_set(&ds_activation, 1);
00173 else if (sensor == &SENSOR_1)
00174 bit_set(&ds_activation, 2);
00175 }
00176
00178
00180 extern inline void ds_passive(volatile unsigned *sensor)
00181 {
00182 if (sensor == &SENSOR_3) {
00183 bit_clear(&ds_activation, 0);
00184 bit_clear(&PORT6, 0);
00185 } else if (sensor == &SENSOR_2) {
00186 bit_clear(&ds_activation, 1);
00187 bit_clear(&PORT6, 1);
00188 } else if (sensor == &SENSOR_1) {
00189 bit_clear(&ds_activation, 2);
00190 bit_clear(&PORT6, 2);
00191 }
00192 }
00193
00194 #ifdef CONF_DSENSOR_ROTATION
00195
00196
00202 extern void ds_rotation_set(volatile unsigned *sensor, int pos);
00203
00205
00207 extern inline void ds_rotation_on(volatile unsigned *sensor)
00208 {
00209 if (sensor == &SENSOR_3)
00210 bit_set(&ds_rotation, 0);
00211 else if (sensor == &SENSOR_2)
00212 bit_set(&ds_rotation, 1);
00213 else if (sensor == &SENSOR_1)
00214 bit_set(&ds_rotation, 2);
00215 }
00216
00218
00220 extern inline void ds_rotation_off(volatile unsigned *sensor)
00221 {
00222 if (sensor == &SENSOR_3)
00223 bit_clear(&ds_rotation, 0);
00224 else if (sensor == &SENSOR_2)
00225 bit_clear(&ds_rotation, 1);
00226 else if (sensor == &SENSOR_1)
00227 bit_clear(&ds_rotation, 2);
00228 }
00229 #endif // CONF_DSENSOR_ROTATION
00230
00231
00232 #ifdef CONF_DSENSOR_MUX
00233
00234 #define DS_MUX_POST_SWITCH 150
00235
00236
00247 extern void ds_mux_on(volatile unsigned *sensor,
00248 unsigned int ch1,
00249 unsigned int ch2,
00250 unsigned int ch3);
00251
00252
00254
00256 extern inline void ds_mux_off(volatile unsigned *sensor)
00257 {
00258 if (sensor == &SENSOR_3)
00259 bit_clear(&ds_mux, 0);
00260 else if (sensor == &SENSOR_2)
00261 bit_clear(&ds_mux, 1);
00262 else if (sensor == &SENSOR_1)
00263 bit_clear(&ds_mux, 2);
00264 }
00265 #endif // CONF_DSENSOR_MUX
00266
00267
00268
00269
00270
00271 #endif // CONF_DSENSOR
00272
00273 #ifdef __cplusplus
00274 }
00275 #endif
00276
00277 #endif // __dsensor_h__