Infrared remote test functions (11/26/2010)

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