void x10Class::sendBits(byte cmd, byte numBits, byte isStartCode) { byte thisBit; // byte for shifting bits // iterate the number of bits to be shifted: for(int i=1; i<=numBits; i++) { // wait for a zero crossing change waitForZeroCross(zeroCrossingPin, 1); // shift off the last bit of the command: thisBit = cmd & (1 << (numBits - i)); // repeat once for each phase: for (int phase = 0; phase < 3; phase++) { // set the data Pin: digitalWrite(txPin, thisBit); delayMicroseconds(BIT_LENGTH); // clear the data pin: digitalWrite(txPin, LOW); delayMicroseconds(BIT_DELAY); } // if this command is a start code, don't // send its complement. Otherwise do: if(!isStartCode) { // wait for zero crossing: waitForZeroCross(zeroCrossingPin, 1); for (int phase = 0; phase < 3; phase++) { // set the data pin: digitalWrite(txPin, !thisBit); delayMicroseconds(BIT_LENGTH); // clear the data pin: digitalWrite(txPin, LOW); delayMicroseconds(BIT_DELAY); } } } }
/* Writes an X10 command out to the X10 modem */ void x10Class::sendCommand(byte houseCode, byte numberCode) { byte startCode = 0b1110; // every X10 command starts with this // send the three parts of the command: sendBits(startCode, 4, true); sendBits(houseCode, 4, false); sendBits(numberCode, 5, false); // if this isn't a bright or dim command, it should be followed by // a delay of 3 power cycles (or 6 zero crossings): if ((numberCode != BRIGHT) && (numberCode != DIM)) { waitForZeroCross(zeroCrossingPin, 6); } }
/* Writes an X10 command out to the X10 modem */ void x10::write(byte houseCode, byte numberCode, int numRepeats) { byte startCode = B1110; // every X10 command starts with this // repeat as many times as requested: for (int i = 0; i < numRepeats; i++) { // send the three parts of the command: sendBits(startCode, 4, true); sendBits(houseCode, 4, false); sendBits(numberCode, 5, false); } // if this isn't a bright or dim command, it should be followed by // a delay of 3 power cycles (or 6 zero crossings): if ((numberCode != BRIGHT) && (numberCode != DIM)) { waitForZeroCross(this->zeroCrossingPin, 6); } }
/* Writes an X10 command out to the X10 modem */ void x10::write(byte houseCode, byte numberCode, int numRepeats) { byte startCode = B1110; // every X10 command starts with this if (rcve_pin>0) { detachInterrupt(0); } // repeat as many times as requested: for (int i = 0; i < numRepeats; i++) { // send the three parts of the command: sendBits(startCode, 4, true); sendBits(houseCode, 4, false); sendBits(numberCode, 5, false); } // if this isn't a bright or dim command, it should be followed by // a delay of 3 power cycles (or 6 zero crossings): if ((numberCode != BRIGHT) && (numberCode != DIM)) { waitForZeroCross(this->zeroCrossingPin, 6); } if (rcve_pin>0) { attachInterrupt(0,x10_Check_Rcvr_wrapper,CHANGE); } // (pin 2) trigger zero cross }