Infrared remote test functions (11/26/2010)

Committer:
AndyHope
Date:
Fri Nov 26 18:43:44 2010 +0000
Revision:
0:e526ff8f7602
Child:
1:d1764facee30
Camoson Final Project Version control

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AndyHope 0:e526ff8f7602 1 #include "mbed.h"
AndyHope 0:e526ff8f7602 2 #include "Infrared.h"
AndyHope 0:e526ff8f7602 3 #include "SDFileSystem.h"
AndyHope 0:e526ff8f7602 4
AndyHope 0:e526ff8f7602 5 Infrared::Infrared(PinName pin) : irLed(pin) { // _pin(pin) means pass pin to the DigitalOut constructor
AndyHope 0:e526ff8f7602 6 irLed = 0; // default the output to 0
AndyHope 0:e526ff8f7602 7 }
AndyHope 0:e526ff8f7602 8
AndyHope 0:e526ff8f7602 9
AndyHope 0:e526ff8f7602 10 void Infrared::header(void)
AndyHope 0:e526ff8f7602 11 {
AndyHope 0:e526ff8f7602 12
AndyHope 0:e526ff8f7602 13 long float repeat;
AndyHope 0:e526ff8f7602 14
AndyHope 0:e526ff8f7602 15 repeat = phead/(cycleOn+cycleOff);
AndyHope 0:e526ff8f7602 16
AndyHope 0:e526ff8f7602 17 repeat *= 0.78; // correction for overhead of loops
AndyHope 0:e526ff8f7602 18
AndyHope 0:e526ff8f7602 19 /* uses the length of the header pulse over the length of the on/off
AndyHope 0:e526ff8f7602 20 modulation to give an integer representation of the number of cycles */
AndyHope 0:e526ff8f7602 21 //pc.printf("%x\n", repeat);
AndyHope 0:e526ff8f7602 22
AndyHope 0:e526ff8f7602 23 for(int k = 0; k < repeat; k++)
AndyHope 0:e526ff8f7602 24 {
AndyHope 0:e526ff8f7602 25 irLed = 1;
AndyHope 0:e526ff8f7602 26 wait(cycleOn);
AndyHope 0:e526ff8f7602 27 irLed = 0;
AndyHope 0:e526ff8f7602 28 wait(cycleOff);
AndyHope 0:e526ff8f7602 29 } // for
AndyHope 0:e526ff8f7602 30
AndyHope 0:e526ff8f7602 31 wait(shead);
AndyHope 0:e526ff8f7602 32
AndyHope 0:e526ff8f7602 33 return;
AndyHope 0:e526ff8f7602 34 } //header
AndyHope 0:e526ff8f7602 35
AndyHope 0:e526ff8f7602 36
AndyHope 0:e526ff8f7602 37 /* takes a data input of up to bytes, uses dynamic variables(timings ect),
AndyHope 0:e526ff8f7602 38 calculates pulse lengths, encodes data for pulse modulation,
AndyHope 0:e526ff8f7602 39 and shifts it out LSB first (sharp TV protocol, can be changed) */
AndyHope 0:e526ff8f7602 40
AndyHope 0:e526ff8f7602 41 void Infrared::strobeSpace(void)
AndyHope 0:e526ff8f7602 42 { // ir cycle time, ones, zeroes, and datastream
AndyHope 0:e526ff8f7602 43
AndyHope 0:e526ff8f7602 44 unsigned int temp;
AndyHope 0:e526ff8f7602 45 long float repeat1, repeat0;
AndyHope 0:e526ff8f7602 46 char k;
AndyHope 0:e526ff8f7602 47
AndyHope 0:e526ff8f7602 48 repeat1 = pone/(cycleOn+cycleOff);
AndyHope 0:e526ff8f7602 49 repeat0 = pzero/(cycleOn+cycleOff);
AndyHope 0:e526ff8f7602 50 /* uses the length of the header pulse over the length of the on/off
AndyHope 0:e526ff8f7602 51 modulation to give an integer representation of the number of cycles */
AndyHope 0:e526ff8f7602 52
AndyHope 0:e526ff8f7602 53 repeat1 *= 0.78; // correction for overhead of loops
AndyHope 0:e526ff8f7602 54 repeat0 *= 0.78; // correction for overhead of loops
AndyHope 0:e526ff8f7602 55
AndyHope 0:e526ff8f7602 56 for(char i = 0; i < dataBits; i++)
AndyHope 0:e526ff8f7602 57 {
AndyHope 0:e526ff8f7602 58 temp = data<<i; // shift out lsb first
AndyHope 0:e526ff8f7602 59
AndyHope 0:e526ff8f7602 60
AndyHope 0:e526ff8f7602 61 if(temp & MSB)
AndyHope 0:e526ff8f7602 62 {
AndyHope 0:e526ff8f7602 63 for(k = 0; k < repeat1; k++)
AndyHope 0:e526ff8f7602 64 {
AndyHope 0:e526ff8f7602 65 irLed = 1;
AndyHope 0:e526ff8f7602 66 wait(cycleOn);
AndyHope 0:e526ff8f7602 67 irLed = 0;
AndyHope 0:e526ff8f7602 68 wait(cycleOff);
AndyHope 0:e526ff8f7602 69 }// for
AndyHope 0:e526ff8f7602 70
AndyHope 0:e526ff8f7602 71 wait(sone);
AndyHope 0:e526ff8f7602 72 }// if
AndyHope 0:e526ff8f7602 73
AndyHope 0:e526ff8f7602 74 else
AndyHope 0:e526ff8f7602 75 {
AndyHope 0:e526ff8f7602 76 for(k = 0; k < repeat0; k++)
AndyHope 0:e526ff8f7602 77 {
AndyHope 0:e526ff8f7602 78 irLed = 1;
AndyHope 0:e526ff8f7602 79 wait(cycleOn);
AndyHope 0:e526ff8f7602 80 irLed = 0;
AndyHope 0:e526ff8f7602 81 wait(cycleOff);
AndyHope 0:e526ff8f7602 82 }// for
AndyHope 0:e526ff8f7602 83
AndyHope 0:e526ff8f7602 84 wait(szero);
AndyHope 0:e526ff8f7602 85 }// else
AndyHope 0:e526ff8f7602 86
AndyHope 0:e526ff8f7602 87 }// for
AndyHope 0:e526ff8f7602 88
AndyHope 0:e526ff8f7602 89 return;
AndyHope 0:e526ff8f7602 90 }// strobeSpace
AndyHope 0:e526ff8f7602 91
AndyHope 0:e526ff8f7602 92
AndyHope 0:e526ff8f7602 93 /* takes a data input of up to bytes, uses dynamic variables(timings ect),
AndyHope 0:e526ff8f7602 94 calculates pulse lengths, encodes data for RC6 (manchester) encoding,
AndyHope 0:e526ff8f7602 95 and shifts it out MSB first (philips protocol, can be changed) */
AndyHope 0:e526ff8f7602 96
AndyHope 0:e526ff8f7602 97 void Infrared::strobeRC6(void)
AndyHope 0:e526ff8f7602 98 { // ir cycle time, ones, zeroes, and datastream
AndyHope 0:e526ff8f7602 99
AndyHope 0:e526ff8f7602 100 unsigned long int temp;
AndyHope 0:e526ff8f7602 101 long float repeat1, repeat0;
AndyHope 0:e526ff8f7602 102 char k;
AndyHope 0:e526ff8f7602 103
AndyHope 0:e526ff8f7602 104 repeat1 = pone/(cycleOn+cycleOff);
AndyHope 0:e526ff8f7602 105 repeat0 = pzero/(cycleOn+cycleOff);
AndyHope 0:e526ff8f7602 106
AndyHope 0:e526ff8f7602 107 repeat1 *= 0.78; // correction for overhead of loops
AndyHope 0:e526ff8f7602 108 repeat0 *= 0.78; // correction for overhead of loops
AndyHope 0:e526ff8f7602 109
AndyHope 0:e526ff8f7602 110 /* uses the length of the header pulse over the length of the on/off
AndyHope 0:e526ff8f7602 111 modulation to give an integer representation of the number of cycles */
AndyHope 0:e526ff8f7602 112
AndyHope 0:e526ff8f7602 113 for(char i = 0; i < dataBits; i++)
AndyHope 0:e526ff8f7602 114 {
AndyHope 0:e526ff8f7602 115 temp = data<<i; // shift out msb first
AndyHope 0:e526ff8f7602 116
AndyHope 0:e526ff8f7602 117 if(temp & MSB)
AndyHope 0:e526ff8f7602 118 {
AndyHope 0:e526ff8f7602 119 //pc.printf("1");
AndyHope 0:e526ff8f7602 120 for(k = 0; k < repeat1; k++)
AndyHope 0:e526ff8f7602 121 {
AndyHope 0:e526ff8f7602 122 irLed = 1;
AndyHope 0:e526ff8f7602 123 wait(cycleOn);
AndyHope 0:e526ff8f7602 124 irLed = 0;
AndyHope 0:e526ff8f7602 125 wait(cycleOff);
AndyHope 0:e526ff8f7602 126 }// for
AndyHope 0:e526ff8f7602 127
AndyHope 0:e526ff8f7602 128 wait(sone);
AndyHope 0:e526ff8f7602 129 }// if
AndyHope 0:e526ff8f7602 130
AndyHope 0:e526ff8f7602 131 else
AndyHope 0:e526ff8f7602 132 {
AndyHope 0:e526ff8f7602 133 //pc.printf("0");
AndyHope 0:e526ff8f7602 134 wait(szero);
AndyHope 0:e526ff8f7602 135
AndyHope 0:e526ff8f7602 136 for(k = 0; k < repeat0; k++)
AndyHope 0:e526ff8f7602 137 {
AndyHope 0:e526ff8f7602 138 irLed = 1;
AndyHope 0:e526ff8f7602 139 wait(cycleOn);
AndyHope 0:e526ff8f7602 140 irLed = 0;
AndyHope 0:e526ff8f7602 141 wait(cycleOff);
AndyHope 0:e526ff8f7602 142 }// for
AndyHope 0:e526ff8f7602 143
AndyHope 0:e526ff8f7602 144 }// else
AndyHope 0:e526ff8f7602 145
AndyHope 0:e526ff8f7602 146 }// for
AndyHope 0:e526ff8f7602 147
AndyHope 0:e526ff8f7602 148 return;
AndyHope 0:e526ff8f7602 149 }// strobeRC6
AndyHope 0:e526ff8f7602 150
AndyHope 0:e526ff8f7602 151
AndyHope 0:e526ff8f7602 152 /* calculates and transmits either a leading
AndyHope 0:e526ff8f7602 153 or trailing pulse, based on passed variables */
AndyHope 0:e526ff8f7602 154
AndyHope 0:e526ff8f7602 155 void Infrared::pulse(double pulseL)
AndyHope 0:e526ff8f7602 156 {
AndyHope 0:e526ff8f7602 157 long float repeat;
AndyHope 0:e526ff8f7602 158
AndyHope 0:e526ff8f7602 159 repeat = pulseL/(cycleOn+cycleOff);
AndyHope 0:e526ff8f7602 160 /* uses the length of the header pulse over the length of the on/off
AndyHope 0:e526ff8f7602 161 modulation to give an integer representation of the number of cycles */
AndyHope 0:e526ff8f7602 162
AndyHope 0:e526ff8f7602 163 repeat *= 0.78; // correction factor for loop overheads
AndyHope 0:e526ff8f7602 164
AndyHope 0:e526ff8f7602 165 for(int k = 0; k < repeat; k++)
AndyHope 0:e526ff8f7602 166 {
AndyHope 0:e526ff8f7602 167 irLed = 1;
AndyHope 0:e526ff8f7602 168 wait(cycleOn);
AndyHope 0:e526ff8f7602 169 irLed = 0;
AndyHope 0:e526ff8f7602 170 wait(cycleOff);
AndyHope 0:e526ff8f7602 171 }// for
AndyHope 0:e526ff8f7602 172
AndyHope 0:e526ff8f7602 173 return;
AndyHope 0:e526ff8f7602 174 }// pulse
AndyHope 0:e526ff8f7602 175
AndyHope 0:e526ff8f7602 176
AndyHope 0:e526ff8f7602 177 /* takes a command input and strobes the infrared LEDs */
AndyHope 0:e526ff8f7602 178
AndyHope 0:e526ff8f7602 179 void Infrared::sendCodeDish(unsigned long int command)
AndyHope 0:e526ff8f7602 180 {
AndyHope 0:e526ff8f7602 181
AndyHope 0:e526ff8f7602 182 data = command;
AndyHope 0:e526ff8f7602 183
AndyHope 0:e526ff8f7602 184 header();
AndyHope 0:e526ff8f7602 185 strobeSpace();
AndyHope 0:e526ff8f7602 186
AndyHope 0:e526ff8f7602 187 header();
AndyHope 0:e526ff8f7602 188 strobeSpace();
AndyHope 0:e526ff8f7602 189
AndyHope 0:e526ff8f7602 190 header();
AndyHope 0:e526ff8f7602 191 strobeSpace();
AndyHope 0:e526ff8f7602 192
AndyHope 0:e526ff8f7602 193 pulse(ptrail);
AndyHope 0:e526ff8f7602 194
AndyHope 0:e526ff8f7602 195 wait(gap);
AndyHope 0:e526ff8f7602 196
AndyHope 0:e526ff8f7602 197 return;
AndyHope 0:e526ff8f7602 198 }//sendCodeDVR
AndyHope 0:e526ff8f7602 199
AndyHope 0:e526ff8f7602 200
AndyHope 0:e526ff8f7602 201 void Infrared::sendCodeGETV(unsigned long int command)
AndyHope 0:e526ff8f7602 202 {
AndyHope 0:e526ff8f7602 203
AndyHope 0:e526ff8f7602 204 data = command;
AndyHope 0:e526ff8f7602 205
AndyHope 0:e526ff8f7602 206 header();
AndyHope 0:e526ff8f7602 207 strobeSpace();
AndyHope 0:e526ff8f7602 208 pulse(ptrail);
AndyHope 0:e526ff8f7602 209
AndyHope 0:e526ff8f7602 210 wait(gap);
AndyHope 0:e526ff8f7602 211
AndyHope 0:e526ff8f7602 212 header();
AndyHope 0:e526ff8f7602 213 strobeSpace();
AndyHope 0:e526ff8f7602 214 pulse(ptrail);
AndyHope 0:e526ff8f7602 215
AndyHope 0:e526ff8f7602 216 wait(gap);
AndyHope 0:e526ff8f7602 217
AndyHope 0:e526ff8f7602 218 return;
AndyHope 0:e526ff8f7602 219 }//sendCodeGETV
AndyHope 0:e526ff8f7602 220
AndyHope 0:e526ff8f7602 221 void Infrared::sendCodeSharpTV(unsigned long int command)
AndyHope 0:e526ff8f7602 222 {
AndyHope 0:e526ff8f7602 223
AndyHope 0:e526ff8f7602 224 invertCode(inversionMask, command);
AndyHope 0:e526ff8f7602 225
AndyHope 0:e526ff8f7602 226 data = code;
AndyHope 0:e526ff8f7602 227
AndyHope 0:e526ff8f7602 228 strobeSpace();
AndyHope 0:e526ff8f7602 229 pulse(ptrail);
AndyHope 0:e526ff8f7602 230
AndyHope 0:e526ff8f7602 231 wait(gap);
AndyHope 0:e526ff8f7602 232
AndyHope 0:e526ff8f7602 233 data = invCode;
AndyHope 0:e526ff8f7602 234
AndyHope 0:e526ff8f7602 235 strobeSpace();
AndyHope 0:e526ff8f7602 236 pulse(ptrail);
AndyHope 0:e526ff8f7602 237
AndyHope 0:e526ff8f7602 238 wait(gap);
AndyHope 0:e526ff8f7602 239
AndyHope 0:e526ff8f7602 240 data = code;
AndyHope 0:e526ff8f7602 241
AndyHope 0:e526ff8f7602 242 strobeSpace();
AndyHope 0:e526ff8f7602 243 pulse(ptrail);
AndyHope 0:e526ff8f7602 244
AndyHope 0:e526ff8f7602 245 wait(gap);
AndyHope 0:e526ff8f7602 246
AndyHope 0:e526ff8f7602 247 data = invCode;
AndyHope 0:e526ff8f7602 248
AndyHope 0:e526ff8f7602 249 strobeSpace();
AndyHope 0:e526ff8f7602 250 pulse(ptrail);
AndyHope 0:e526ff8f7602 251
AndyHope 0:e526ff8f7602 252 wait(gap);
AndyHope 0:e526ff8f7602 253
AndyHope 0:e526ff8f7602 254 return;
AndyHope 0:e526ff8f7602 255 }//sendCodeSharpTV
AndyHope 0:e526ff8f7602 256
AndyHope 0:e526ff8f7602 257
AndyHope 0:e526ff8f7602 258 /* Takes the values for the remote timing in the LIRC remote files
AndyHope 0:e526ff8f7602 259 (which are in us, Ex. phead = 450) and converts them down to the
AndyHope 0:e526ff8f7602 260 proper floating point value */
AndyHope 0:e526ff8f7602 261
AndyHope 0:e526ff8f7602 262 void Infrared::convertTiming()
AndyHope 0:e526ff8f7602 263 {
AndyHope 0:e526ff8f7602 264
AndyHope 0:e526ff8f7602 265 phead /= 1000000; // convert to u seconds
AndyHope 0:e526ff8f7602 266 shead /= 1000000;
AndyHope 0:e526ff8f7602 267 pone /= 1000000;
AndyHope 0:e526ff8f7602 268 sone /= 1000000;
AndyHope 0:e526ff8f7602 269 pzero /= 1000000;
AndyHope 0:e526ff8f7602 270 szero /= 1000000;
AndyHope 0:e526ff8f7602 271 ptoggle /= 1000000;
AndyHope 0:e526ff8f7602 272 stoggle /= 1000000;
AndyHope 0:e526ff8f7602 273 ptrail /= 1000000;
AndyHope 0:e526ff8f7602 274 plead /= 1000000;
AndyHope 0:e526ff8f7602 275 gap /= 1000000;
AndyHope 0:e526ff8f7602 276
AndyHope 0:e526ff8f7602 277 /*cycleOn = 100/dutycycle;
AndyHope 0:e526ff8f7602 278 irPeriod = 1/frequency;
AndyHope 0:e526ff8f7602 279 cycleOn = irPeriod/cycleOn;
AndyHope 0:e526ff8f7602 280 cycleOff = cycleOn;*/
AndyHope 0:e526ff8f7602 281
AndyHope 0:e526ff8f7602 282 cycleOn = dutycycle/100; // dutycycle is read in as a percentage value from 0 to 100
AndyHope 0:e526ff8f7602 283 cycleOff = 1-cycleOn;
AndyHope 0:e526ff8f7602 284 irPeriod = 1/frequency;
AndyHope 0:e526ff8f7602 285 cycleOn = irPeriod*cycleOn;
AndyHope 0:e526ff8f7602 286 cycleOff = irPeriod*cycleOff;
AndyHope 0:e526ff8f7602 287
AndyHope 0:e526ff8f7602 288 return;
AndyHope 0:e526ff8f7602 289 }// convertTiming
AndyHope 0:e526ff8f7602 290
AndyHope 0:e526ff8f7602 291
AndyHope 0:e526ff8f7602 292
AndyHope 0:e526ff8f7602 293 /* deciphers which mask is needed for sending
AndyHope 0:e526ff8f7602 294 data out msb first with dynamic data lengths */
AndyHope 0:e526ff8f7602 295
AndyHope 0:e526ff8f7602 296 void Infrared::maskBit(void)
AndyHope 0:e526ff8f7602 297 {
AndyHope 0:e526ff8f7602 298 MSB = (0x01<<(dataBits-1));
AndyHope 0:e526ff8f7602 299 /* uses the dataBits and uses it to shift a one
AndyHope 0:e526ff8f7602 300 to the position of the MSB of the datastream */
AndyHope 0:e526ff8f7602 301
AndyHope 0:e526ff8f7602 302 return;
AndyHope 0:e526ff8f7602 303 }// maskBit
AndyHope 0:e526ff8f7602 304
AndyHope 0:e526ff8f7602 305
AndyHope 0:e526ff8f7602 306 void Infrared::invertCode(int mask, int invertData)
AndyHope 0:e526ff8f7602 307 {
AndyHope 0:e526ff8f7602 308
AndyHope 0:e526ff8f7602 309 code = invertData;
AndyHope 0:e526ff8f7602 310 invCode = invertData;
AndyHope 0:e526ff8f7602 311
AndyHope 0:e526ff8f7602 312 for(char i = 0; i < mask; i++)
AndyHope 0:e526ff8f7602 313 {
AndyHope 0:e526ff8f7602 314
AndyHope 0:e526ff8f7602 315 invCode ^= (0x01<<i);
AndyHope 0:e526ff8f7602 316
AndyHope 0:e526ff8f7602 317 }// for
AndyHope 0:e526ff8f7602 318
AndyHope 0:e526ff8f7602 319 return;
AndyHope 0:e526ff8f7602 320 }// invertCode
AndyHope 0:e526ff8f7602 321