:merged production code with code on github

master
Level2 Pidor 2015-07-19 19:48:02 +02:00
parent 7643aa2a64
commit 9c40e21619
21 changed files with 967 additions and 19 deletions

View File

@ -1 +1,2 @@
twittertokens.php twittertokens.php
spaceapikey.txt

9
rcswitch-pi/Makefile Normal file
View File

@ -0,0 +1,9 @@
all: send
send: RCSwitch.o send.o
$(CXX) $(CXXFLAGS) $(LDFLAGS) $+ -o $@ -lwiringPi
rawsend: RCSwitch.o rawsend.o
$(CXX) $(CXXFLAGS) $(LDFLAGS) $+ -o $@ -lwiringPi
clean:
$(RM) *.o send rawsend

583
rcswitch-pi/RCSwitch.cpp Normal file
View File

@ -0,0 +1,583 @@
/*
RCSwitch - Arduino libary for remote control outlet switches
Copyright (c) 2011 Suat Özgür. All right reserved.
Contributors:
- Andre Koehler / info(at)tomate-online(dot)de
- Gordeev Andrey Vladimirovich / gordeev(at)openpyro(dot)com
- Skineffect / http://forum.ardumote.com/viewtopic.php?f=2&t=48
Project home: http://code.google.com/p/rc-switch/
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "RCSwitch.h"
unsigned long RCSwitch::nReceivedValue = NULL;
unsigned int RCSwitch::nReceivedBitlength = 0;
unsigned int RCSwitch::nReceivedDelay = 0;
unsigned int RCSwitch::nReceivedProtocol = 0;
unsigned int RCSwitch::timings[RCSWITCH_MAX_CHANGES];
int RCSwitch::nReceiveTolerance = 60;
RCSwitch::RCSwitch() {
this->nReceiverInterrupt = -1;
this->nTransmitterPin = -1;
RCSwitch::nReceivedValue = NULL;
this->setPulseLength(350);
this->setRepeatTransmit(10);
this->setReceiveTolerance(60);
this->setProtocol(1);
}
/**
* Sets the protocol to send.
*/
void RCSwitch::setProtocol(int nProtocol) {
this->nProtocol = nProtocol;
if (nProtocol == 1){
this->setPulseLength(350);
}
else if (nProtocol == 2) {
this->setPulseLength(650);
}
}
/**
* Sets the protocol to send with pulse length in microseconds.
*/
void RCSwitch::setProtocol(int nProtocol, int nPulseLength) {
this->nProtocol = nProtocol;
if (nProtocol == 1){
this->setPulseLength(nPulseLength);
}
else if (nProtocol == 2) {
this->setPulseLength(nPulseLength);
}
}
/**
* Sets pulse length in microseconds
*/
void RCSwitch::setPulseLength(int nPulseLength) {
this->nPulseLength = nPulseLength;
}
/**
* Sets Repeat Transmits
*/
void RCSwitch::setRepeatTransmit(int nRepeatTransmit) {
this->nRepeatTransmit = nRepeatTransmit;
}
/**
* Set Receiving Tolerance
*/
void RCSwitch::setReceiveTolerance(int nPercent) {
RCSwitch::nReceiveTolerance = nPercent;
}
/**
* Enable transmissions
*
* @param nTransmitterPin Arduino Pin to which the sender is connected to
*/
void RCSwitch::enableTransmit(int nTransmitterPin) {
this->nTransmitterPin = nTransmitterPin;
pinMode(this->nTransmitterPin, OUTPUT);
}
/**
* Disable transmissions
*/
void RCSwitch::disableTransmit() {
this->nTransmitterPin = -1;
}
/**
* Switch a remote switch on (Type C Intertechno)
*
* @param sFamily Familycode (a..f)
* @param nGroup Number of group (1..4)
* @param nDevice Number of device (1..4)
*/
void RCSwitch::switchOn(char sFamily, int nGroup, int nDevice) {
this->sendTriState( this->getCodeWordC(sFamily, nGroup, nDevice, true) );
}
/**
* Switch a remote switch off (Type C Intertechno)
*
* @param sFamily Familycode (a..f)
* @param nGroup Number of group (1..4)
* @param nDevice Number of device (1..4)
*/
void RCSwitch::switchOff(char sFamily, int nGroup, int nDevice) {
this->sendTriState( this->getCodeWordC(sFamily, nGroup, nDevice, false) );
}
/**
* Switch a remote switch on (Type B with two rotary/sliding switches)
*
* @param nAddressCode Number of the switch group (1..4)
* @param nChannelCode Number of the switch itself (1..4)
*/
void RCSwitch::switchOn(int nAddressCode, int nChannelCode) {
this->sendTriState( this->getCodeWordB(nAddressCode, nChannelCode, true) );
}
/**
* Switch a remote switch off (Type B with two rotary/sliding switches)
*
* @param nAddressCode Number of the switch group (1..4)
* @param nChannelCode Number of the switch itself (1..4)
*/
void RCSwitch::switchOff(int nAddressCode, int nChannelCode) {
this->sendTriState( this->getCodeWordB(nAddressCode, nChannelCode, false) );
}
/**
* Switch a remote switch on (Type A with 10 pole DIP switches)
*
* @param sGroup Code of the switch group (refers to DIP switches 1..5 where "1" = on and "0" = off, if all DIP switches are on it's "11111")
* @param nChannelCode Number of the switch itself (1..4)
*/
void RCSwitch::switchOn(char* sGroup, int nChannel) {
this->sendTriState( this->getCodeWordA(sGroup, nChannel, true) );
}
/**
* Switch a remote switch off (Type A with 10 pole DIP switches)
*
* @param sGroup Code of the switch group (refers to DIP switches 1..5 where "1" = on and "0" = off, if all DIP switches are on it's "11111")
* @param nChannelCode Number of the switch itself (1..4)
*/
void RCSwitch::switchOff(char* sGroup, int nChannel) {
this->sendTriState( this->getCodeWordA(sGroup, nChannel, false) );
}
/**
* Returns a char[13], representing the Code Word to be send.
* A Code Word consists of 9 address bits, 3 data bits and one sync bit but in our case only the first 8 address bits and the last 2 data bits were used.
* A Code Bit can have 4 different states: "F" (floating), "0" (low), "1" (high), "S" (synchronous bit)
*
* +-------------------------------+--------------------------------+-----------------------------------------+-----------------------------------------+----------------------+------------+
* | 4 bits address (switch group) | 4 bits address (switch number) | 1 bit address (not used, so never mind) | 1 bit address (not used, so never mind) | 2 data bits (on|off) | 1 sync bit |
* | 1=0FFF 2=F0FF 3=FF0F 4=FFF0 | 1=0FFF 2=F0FF 3=FF0F 4=FFF0 | F | F | on=FF off=F0 | S |
* +-------------------------------+--------------------------------+-----------------------------------------+-----------------------------------------+----------------------+------------+
*
* @param nAddressCode Number of the switch group (1..4)
* @param nChannelCode Number of the switch itself (1..4)
* @param bStatus Wether to switch on (true) or off (false)
*
* @return char[13]
*/
char* RCSwitch::getCodeWordB(int nAddressCode, int nChannelCode, boolean bStatus) {
int nReturnPos = 0;
static char sReturn[13];
char* code[5] = { "FFFF", "0FFF", "F0FF", "FF0F", "FFF0" };
if (nAddressCode < 1 || nAddressCode > 4 || nChannelCode < 1 || nChannelCode > 4) {
return '\0';
}
for (int i = 0; i<4; i++) {
sReturn[nReturnPos++] = code[nAddressCode][i];
}
for (int i = 0; i<4; i++) {
sReturn[nReturnPos++] = code[nChannelCode][i];
}
sReturn[nReturnPos++] = 'F';
sReturn[nReturnPos++] = 'F';
sReturn[nReturnPos++] = 'F';
if (bStatus) {
sReturn[nReturnPos++] = 'F';
} else {
sReturn[nReturnPos++] = '0';
}
sReturn[nReturnPos] = '\0';
return sReturn;
}
/**
* Like getCodeWord (Type A)
*/
char* RCSwitch::getCodeWordA(char* sGroup, int nChannelCode, boolean bStatus) {
int nReturnPos = 0;
static char sReturn[13];
char* code[6] = { "FFFFF", "0FFFF", "F0FFF", "FF0FF", "FFF0F", "FFFF0" };
if (nChannelCode < 1 || nChannelCode > 5) {
return '\0';
}
for (int i = 0; i<5; i++) {
if (sGroup[i] == '0') {
sReturn[nReturnPos++] = 'F';
} else if (sGroup[i] == '1') {
sReturn[nReturnPos++] = '0';
} else {
return '\0';
}
}
for (int i = 0; i<5; i++) {
sReturn[nReturnPos++] = code[ nChannelCode ][i];
}
if (bStatus) {
sReturn[nReturnPos++] = '0';
sReturn[nReturnPos++] = 'F';
} else {
sReturn[nReturnPos++] = 'F';
sReturn[nReturnPos++] = '0';
}
sReturn[nReturnPos] = '\0';
return sReturn;
}
/**
* Like getCodeWord (Type C = Intertechno)
*/
char* RCSwitch::getCodeWordC(char sFamily, int nGroup, int nDevice, boolean bStatus) {
static char sReturn[13];
int nReturnPos = 0;
if ( (byte)sFamily < 97 || (byte)sFamily > 112 || nGroup < 1 || nGroup > 4 || nDevice < 1 || nDevice > 4) {
return '\0';
}
char* sDeviceGroupCode = dec2binWzerofill( (nDevice-1) + (nGroup-1)*4, 4 );
char familycode[16][5] = { "0000", "F000", "0F00", "FF00", "00F0", "F0F0", "0FF0", "FFF0", "000F", "F00F", "0F0F", "FF0F", "00FF", "F0FF", "0FFF", "FFFF" };
for (int i = 0; i<4; i++) {
sReturn[nReturnPos++] = familycode[ (int)sFamily - 97 ][i];
}
for (int i = 0; i<4; i++) {
sReturn[nReturnPos++] = (sDeviceGroupCode[3-i] == '1' ? 'F' : '0');
}
sReturn[nReturnPos++] = '0';
sReturn[nReturnPos++] = 'F';
sReturn[nReturnPos++] = 'F';
if (bStatus) {
sReturn[nReturnPos++] = 'F';
} else {
sReturn[nReturnPos++] = '0';
}
sReturn[nReturnPos] = '\0';
return sReturn;
}
/**
* Sends a Code Word
* @param sCodeWord /^[10FS]*$/ -> see getCodeWord
*/
void RCSwitch::sendTriState(char* sCodeWord) {
for (int nRepeat=0; nRepeat<nRepeatTransmit; nRepeat++) {
int i = 0;
while (sCodeWord[i] != '\0') {
switch(sCodeWord[i]) {
case '0':
this->sendT0();
break;
case 'F':
this->sendTF();
break;
case '1':
this->sendT1();
break;
}
i++;
}
this->sendSync();
}
}
void RCSwitch::send(unsigned long Code, unsigned int length) {
this->send( this->dec2binWzerofill(Code, length) );
}
void RCSwitch::send(char* sCodeWord) {
for (int nRepeat=0; nRepeat<nRepeatTransmit; nRepeat++) {
int i = 0;
while (sCodeWord[i] != '\0') {
switch(sCodeWord[i]) {
case '0':
this->send0();
break;
case '1':
this->send1();
break;
}
i++;
}
this->sendSync();
}
}
void RCSwitch::transmit(int nHighPulses, int nLowPulses) {
boolean disabled_Receive = false;
int nReceiverInterrupt_backup = nReceiverInterrupt;
if (this->nTransmitterPin != -1) {
if (this->nReceiverInterrupt != -1) {
this->disableReceive();
disabled_Receive = true;
}
digitalWrite(this->nTransmitterPin, HIGH);
delayMicroseconds( this->nPulseLength * nHighPulses);
digitalWrite(this->nTransmitterPin, LOW);
delayMicroseconds( this->nPulseLength * nLowPulses);
if(disabled_Receive){
this->enableReceive(nReceiverInterrupt_backup);
}
}
}
/**
* Sends a "0" Bit
* _
* Waveform Protocol 1: | |___
* _
* Waveform Protocol 2: | |__
*/
void RCSwitch::send0() {
if (this->nProtocol == 1){
this->transmit(1,3);
}
else if (this->nProtocol == 2) {
this->transmit(1,2);
}
}
/**
* Sends a "1" Bit
* ___
* Waveform Protocol 1: | |_
* __
* Waveform Protocol 2: | |_
*/
void RCSwitch::send1() {
if (this->nProtocol == 1){
this->transmit(3,1);
}
else if (this->nProtocol == 2) {
this->transmit(2,1);
}
}
/**
* Sends a Tri-State "0" Bit
* _ _
* Waveform: | |___| |___
*/
void RCSwitch::sendT0() {
this->transmit(1,3);
this->transmit(1,3);
}
/**
* Sends a Tri-State "1" Bit
* ___ ___
* Waveform: | |_| |_
*/
void RCSwitch::sendT1() {
this->transmit(3,1);
this->transmit(3,1);
}
/**
* Sends a Tri-State "F" Bit
* _ ___
* Waveform: | |___| |_
*/
void RCSwitch::sendTF() {
this->transmit(1,3);
this->transmit(3,1);
}
/**
* Sends a "Sync" Bit
* _
* Waveform Protocol 1: | |_______________________________
* _
* Waveform Protocol 2: | |__________
*/
void RCSwitch::sendSync() {
if (this->nProtocol == 1){
this->transmit(1,31);
}
else if (this->nProtocol == 2) {
this->transmit(1,10);
}
}
/**
* Enable receiving data
*/
void RCSwitch::enableReceive(int interrupt) {
this->nReceiverInterrupt = interrupt;
this->enableReceive();
}
void RCSwitch::enableReceive() {
if (this->nReceiverInterrupt != -1) {
RCSwitch::nReceivedValue = NULL;
RCSwitch::nReceivedBitlength = NULL;
}
}
/**
* Disable receiving data
*/
void RCSwitch::disableReceive() {
this->nReceiverInterrupt = -1;
}
bool RCSwitch::available() {
return RCSwitch::nReceivedValue != NULL;
}
void RCSwitch::resetAvailable() {
RCSwitch::nReceivedValue = NULL;
}
unsigned long RCSwitch::getReceivedValue() {
return RCSwitch::nReceivedValue;
}
unsigned int RCSwitch::getReceivedBitlength() {
return RCSwitch::nReceivedBitlength;
}
unsigned int RCSwitch::getReceivedDelay() {
return RCSwitch::nReceivedDelay;
}
unsigned int RCSwitch::getReceivedProtocol() {
return RCSwitch::nReceivedProtocol;
}
unsigned int* RCSwitch::getReceivedRawdata() {
return RCSwitch::timings;
}
/**
*
*/
bool RCSwitch::receiveProtocol1(unsigned int changeCount){
unsigned long code = 0;
unsigned long delay = RCSwitch::timings[0] / 31;
unsigned long delayTolerance = delay * RCSwitch::nReceiveTolerance * 0.01;
for (int i = 1; i<changeCount ; i=i+2) {
if (RCSwitch::timings[i] > delay-delayTolerance && RCSwitch::timings[i] < delay+delayTolerance && RCSwitch::timings[i+1] > delay*3-delayTolerance && RCSwitch::timings[i+1] < delay*3+delayTolerance) {
code = code << 1;
} else if (RCSwitch::timings[i] > delay*3-delayTolerance && RCSwitch::timings[i] < delay*3+delayTolerance && RCSwitch::timings[i+1] > delay-delayTolerance && RCSwitch::timings[i+1] < delay+delayTolerance) {
code+=1;
code = code << 1;
} else {
// Failed
i = changeCount;
code = 0;
}
}
code = code >> 1;
if (changeCount > 6) { // ignore < 4bit values as there are no devices sending 4bit values => noise
RCSwitch::nReceivedValue = code;
RCSwitch::nReceivedBitlength = changeCount / 2;
RCSwitch::nReceivedDelay = delay;
RCSwitch::nReceivedProtocol = 1;
}
if (code == 0){
return false;
}else if (code != 0){
return true;
}
}
bool RCSwitch::receiveProtocol2(unsigned int changeCount){
unsigned long code = 0;
unsigned long delay = RCSwitch::timings[0] / 10;
unsigned long delayTolerance = delay * RCSwitch::nReceiveTolerance * 0.01;
for (int i = 1; i<changeCount ; i=i+2) {
if (RCSwitch::timings[i] > delay-delayTolerance && RCSwitch::timings[i] < delay+delayTolerance && RCSwitch::timings[i+1] > delay*2-delayTolerance && RCSwitch::timings[i+1] < delay*2+delayTolerance) {
code = code << 1;
} else if (RCSwitch::timings[i] > delay*2-delayTolerance && RCSwitch::timings[i] < delay*2+delayTolerance && RCSwitch::timings[i+1] > delay-delayTolerance && RCSwitch::timings[i+1] < delay+delayTolerance) {
code+=1;
code = code << 1;
} else {
// Failed
i = changeCount;
code = 0;
}
}
code = code >> 1;
if (changeCount > 6) { // ignore < 4bit values as there are no devices sending 4bit values => noise
RCSwitch::nReceivedValue = code;
RCSwitch::nReceivedBitlength = changeCount / 2;
RCSwitch::nReceivedDelay = delay;
RCSwitch::nReceivedProtocol = 2;
}
if (code == 0){
return false;
}else if (code != 0){
return true;
}
}
/**
* Turns a decimal value to its binary representation
*/
char* RCSwitch::dec2binWzerofill(unsigned long Dec, unsigned int bitLength){
static char bin[64];
unsigned int i=0;
while (Dec > 0) {
bin[32+i++] = ((Dec & 1) > 0) ? '1' : '0';
Dec = Dec >> 1;
}
for (unsigned int j = 0; j< bitLength; j++) {
if (j >= bitLength - i) {
bin[j] = bin[ 31 + i - (j - (bitLength - i)) ];
}else {
bin[j] = '0';
}
}
bin[bitLength] = '\0';
return bin;
}

123
rcswitch-pi/RCSwitch.h Normal file
View File

@ -0,0 +1,123 @@
/*
RCSwitch - Arduino libary for remote control outlet switches
Copyright (c) 2011 Suat Özgür. All right reserved.
Contributors:
- Andre Koehler / info(at)tomate-online(dot)de
- Gordeev Andrey Vladimirovich / gordeev(at)openpyro(dot)com
Project home: http://code.google.com/p/rc-switch/
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef _RCSwitch_h
#define _RCSwitch_h
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include <wiringPi.h>
#include <stdint.h>
#define NULL 0
#define CHANGE 1
#ifdef __cplusplus
extern "C"{
#endif
typedef uint8_t boolean;
typedef uint8_t byte;
#if !defined(NULL)
#endif
#ifdef __cplusplus
}
#endif
#endif
// Number of maximum High/Low changes per packet.
// We can handle up to (unsigned long) => 32 bit * 2 H/L changes per bit + 2 for sync
#define RCSWITCH_MAX_CHANGES 67
class RCSwitch {
public:
RCSwitch();
void switchOn(int nGroupNumber, int nSwitchNumber);
void switchOff(int nGroupNumber, int nSwitchNumber);
void switchOn(char* sGroup, int nSwitchNumber);
void switchOff(char* sGroup, int nSwitchNumber);
void switchOn(char sFamily, int nGroup, int nDevice);
void switchOff(char sFamily, int nGroup, int nDevice);
void sendTriState(char* Code);
void send(unsigned long Code, unsigned int length);
void send(char* Code);
void enableReceive(int interrupt);
void enableReceive();
void disableReceive();
bool available();
void resetAvailable();
unsigned long getReceivedValue();
unsigned int getReceivedBitlength();
unsigned int getReceivedDelay();
unsigned int getReceivedProtocol();
unsigned int* getReceivedRawdata();
void enableTransmit(int nTransmitterPin);
void disableTransmit();
void setPulseLength(int nPulseLength);
void setRepeatTransmit(int nRepeatTransmit);
void setReceiveTolerance(int nPercent);
void setProtocol(int nProtocol);
void setProtocol(int nProtocol, int nPulseLength);
private:
char* getCodeWordB(int nGroupNumber, int nSwitchNumber, boolean bStatus);
char* getCodeWordA(char* sGroup, int nSwitchNumber, boolean bStatus);
char* getCodeWordC(char sFamily, int nGroup, int nDevice, boolean bStatus);
void sendT0();
void sendT1();
void sendTF();
void send0();
void send1();
void sendSync();
void transmit(int nHighPulses, int nLowPulses);
static char* dec2binWzerofill(unsigned long dec, unsigned int length);
static void handleInterrupt();
static bool receiveProtocol1(unsigned int changeCount);
static bool receiveProtocol2(unsigned int changeCount);
int nReceiverInterrupt;
int nTransmitterPin;
int nPulseLength;
int nRepeatTransmit;
char nProtocol;
static int nReceiveTolerance;
static unsigned long nReceivedValue;
static unsigned int nReceivedBitlength;
static unsigned int nReceivedDelay;
static unsigned int nReceivedProtocol;
static unsigned int timings[RCSWITCH_MAX_CHANGES];
};
#endif

BIN
rcswitch-pi/RCSwitch.o Normal file

Binary file not shown.

14
rcswitch-pi/README.md Normal file
View File

@ -0,0 +1,14 @@
# About
rcswitch-pi is for controlling rc remote controlled power sockets
with the raspberry pi. Kudos to the projects [rc-switch](http://code.google.com/p/rc-switch)
and [wiringpi](https://projects.drogon.net/raspberry-pi/wiringpi).
I just adapted the rc-switch code to use the wiringpi library instead of
the library provided by the arduino.
## Usage
First you have to install the [wiringpi](https://projects.drogon.net/raspberry-pi/wiringpi/download-and-install/) library.
After that you can compile the example program *send* by executing *make*.
You may want to changet the used GPIO pin before compilation in the send.cpp source file.

1
rcswitch-pi/down.raw Normal file
View File

@ -0,0 +1 @@
11111101000110010000100010100010000100000000100000000001001001001110010000000000000000000000000

6
rcswitch-pi/on Normal file
View File

@ -0,0 +1,6 @@
./send 2 1A 1 1
off
./send 2 1A 1 0

BIN
rcswitch-pi/rawsend Executable file

Binary file not shown.

49
rcswitch-pi/rawsend.cpp Normal file
View File

@ -0,0 +1,49 @@
/*
Usage: ./send <bitlen> <command>
bitlen is in microsecond
Command is 0 for OFF and 1 for ON
*/
#include "RCSwitch.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
/*
output PIN is hardcoded for testing purposes
see https://projects.drogon.net/raspberry-pi/wiringpi/pins/
for pin mapping of the raspberry pi GPIO connector
*/
int PIN = 2; // GPIO-PIN 17
char pSystemCode[14];
int bitlen=atoi(argv[1]);
char* sendptr=argv[2];
if (wiringPiSetup () == -1) return 1;
printf("sending with bitlength %d the data %s ...\n", bitlen, argv[2]);
RCSwitch mySwitch = RCSwitch();
printf("defining transmit PIN[%i] ... ",PIN);
mySwitch.enableTransmit(PIN);
printf("success\n");
int i=0;
while(sendptr[i]!= (char)0)
{
printf("%c",sendptr[i]);
fflush(stdout);
if(sendptr[i] == '0')
{
digitalWrite(PIN, LOW);
}
if(sendptr[i] == '1')
{
digitalWrite(PIN, HIGH);
}
delayMicroseconds( bitlen );
i++;
}
printf("\ndone\n");
}

BIN
rcswitch-pi/rawsend.o Normal file

Binary file not shown.

BIN
rcswitch-pi/send Executable file

Binary file not shown.

146
rcswitch-pi/send.cpp Normal file
View File

@ -0,0 +1,146 @@
/*
Usage: ./send <command>
SystemCodeType is 1 for default and 2 for switches with 10 Bits 123456ABCD
Command is 0 for OFF and 1 for ON
*/
#include "RCSwitch.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
/*
output PIN is hardcoded for testing purposes
see https://projects.drogon.net/raspberry-pi/wiringpi/pins/
for pin mapping of the raspberry pi GPIO connector
*/
int PIN = 2; // GPIO-PIN 17
int systemCodeType = atoi(argv[1]);
int systemCode = atoi(argv[2]);
int unitCode = atoi(argv[3]);
int command = atoi(argv[4]);
char pSystemCode[14];
if (wiringPiSetup () == -1) return 1;
printf("sending systemCodeType[%i] systemCode[%i] unitCode[%i] command[%i] ...\n", systemCodeType, systemCode, unitCode, command);
RCSwitch mySwitch = RCSwitch();
printf("defining transmit PIN[%i] ... ",PIN);
mySwitch.enableTransmit(PIN);
printf("success\n");
printf("computing system Code Type ...\n");
switch(systemCodeType)
{
case 1:
{
printf("Switching \"default\" system[%i] unit[%i] ... ", systemCode, unitCode);
switch(command)
{
case 0:
{
printf("off\n");
mySwitch.switchOff(systemCode, unitCode);
break;
}
case 1:
{
printf("on\n");
mySwitch.switchOn(systemCode, unitCode);
break;
}
default:
{
printf("command[%i] is unsupported\n", command);
return -1;
}
}
break;
}
case 2:
{
printf("computing systemcode for Intertechno Type B house[%i] unit[%i] ... ",systemCode, unitCode);
switch(systemCode)
{
// house/family code A=1 - P=16
case 1: { printf("1/A ... "); strcpy(pSystemCode,"0000"); break; }
case 2: { printf("2/B ... "); strcpy(pSystemCode,"F000"); break; }
case 3: { printf("3/C ... "); strcpy(pSystemCode,"0F00"); break; }
case 4: { printf("4/D ... "); strcpy(pSystemCode,"FF00"); break; }
case 5: { printf("5/E ... "); strcpy(pSystemCode,"00F0"); break; }
case 6: { printf("6/F ... "); strcpy(pSystemCode,"F0F0"); break; }
case 7: { printf("7/G ... "); strcpy(pSystemCode,"0FF0"); break; }
case 8: { printf("8/H ... "); strcpy(pSystemCode,"FFF0"); break; }
case 9: { printf("9/I ... "); strcpy(pSystemCode,"000F"); break; }
case 10: { printf("10/J ... "); strcpy(pSystemCode,"F00F"); break; }
case 11: { printf("11/K ... "); strcpy(pSystemCode,"0F0F"); break; }
case 12: { printf("12/L ... "); strcpy(pSystemCode,"FF0F"); break; }
case 13: { printf("13/M ... "); strcpy(pSystemCode,"00FF"); break; }
case 14: { printf("14/N ... "); strcpy(pSystemCode,"F0FF"); break; }
case 15: { printf("15/O ... "); strcpy(pSystemCode,"0FFF"); break; }
case 16: { printf("16/P ... "); strcpy(pSystemCode,"FFFF"); break; }
default:
{
printf("systemCode[%s] is unsupported\n", systemCode);
return -1;
}
}
printf("got systemCode\n");
switch(unitCode)
{
// unit/group code 01-16
case 1: { printf("1 ... "); strcat(pSystemCode,"0000"); break; }
case 2: { printf("2 ... "); strcat(pSystemCode,"F000"); break; }
case 3: { printf("3 ... "); strcat(pSystemCode,"0F00"); break; }
case 4: { printf("4 ... "); strcat(pSystemCode,"FF00"); break; }
case 5: { printf("5 ... "); strcat(pSystemCode,"00F0"); break; }
case 6: { printf("6 ... "); strcat(pSystemCode,"F0F0"); break; }
case 7: { printf("7 ... "); strcat(pSystemCode,"0FF0"); break; }
case 8: { printf("8 ... "); strcat(pSystemCode,"FFF0"); break; }
case 9: { printf("9 ... "); strcat(pSystemCode,"000F"); break; }
case 10: { printf("10 ... "); strcat(pSystemCode,"F00F"); break; }
case 11: { printf("11 ... "); strcat(pSystemCode,"0F0F"); break; }
case 12: { printf("12 ... "); strcat(pSystemCode,"FF0F"); break; }
case 13: { printf("13 ... "); strcat(pSystemCode,"00FF"); break; }
case 14: { printf("14 ... "); strcat(pSystemCode,"F0FF"); break; }
case 15: { printf("15 ... "); strcat(pSystemCode,"0FFF"); break; }
case 16: { printf("16 ... "); strcat(pSystemCode,"FFFF"); break; }
default:
{
printf("unitCode[%i] is unsupported\n", unitCode);
return -1;
}
}
strcat(pSystemCode,"0F"); // mandatory bits
switch(command)
{
case 0:
{
strcat(pSystemCode,"F0");
mySwitch.sendTriState(pSystemCode);
printf("sent TriState signal: pSystemCode[%s]\n",pSystemCode);
break;
}
case 1:
{
strcat(pSystemCode,"FF");
mySwitch.sendTriState(pSystemCode);
printf("sent TriState signal: pSystemCode[%s]\n",pSystemCode);
break;
}
default:
{
printf("command[%i] is unsupported\n", command);
return -1;
}
}
break;
}
default:
{
printf("command sequence unknown, aborting!\n");
return -1;
}
}
return 0;
}

BIN
rcswitch-pi/send.o Normal file

Binary file not shown.

View File

@ -11,13 +11,16 @@ then
logger -t $(basename $0) "switching all lights off" logger -t $(basename $0) "switching all lights off"
for i in {1..16} for i in {1..16}
do do
/usr/local/bin/433send 2 1A $i 0 #off for j in {1..16}
do
/usr/local/bin/433send 2 $j $i 0 #off
done
done done
logger -t $(basename $0) "all lights should be off now" logger -t $(basename $0) "all lights should be off now"
fi fi
if [ "$1" = "released" ] if [ "$1" = "released" ]
then # switch status lights on, in any case then # switch status lights on, in any case
/usr/local/bin/433send 2 1A 2 1 #on /usr/local/bin/433send 2 2A 1 1 #on
fi fi
if [ "$1" = "released" ] && # the door has been opened if [ "$1" = "released" ] && # the door has been opened
# [ "$(cat /run/spacestatus)" = "open" ] && # status is open # [ "$(cat /run/spacestatus)" = "open" ] && # status is open
@ -30,7 +33,7 @@ then
fi fi
# type (2=10bit) # type (2=10bit)
# | house 1-16 (always 1 in our case) # | house 1-16 (the dial thingie)
# | |group A-P (the dial thingie) # | |group A-P (the dial thingie)
# | || unit (1-16) (the button, usually 1-4) # | || unit (1-16) (the button, usually 1-4)
# | || | on/off # | || | on/off

View File

@ -0,0 +1 @@
96f7896f97asdf89u0a9s7d7fdasgsda88af

View File

@ -6,10 +6,10 @@ P() {
while ! mkdir "$LockDir" 2>/dev/null while ! mkdir "$LockDir" 2>/dev/null
do do
LockDirStamp=$(stat -c %Y "$LockDir" 2>/dev/null) LockDirStamp=$(stat -c %Y "$LockDir" 2>/dev/null)
if [ "$LockDirStamp" != "" ] && [ "$LockDirStamp" -lt $(date --date "90 seconds ago" +%s) ] if [ "$LockDirStamp" != "" ] && [ "$LockDirStamp" -lt $(date --date "300 seconds ago" +%s) ]
then then
rmdir "$LockDir" rmdir "$LockDir"
logger -t $(basename $0) "deleting stale semaphore dir $LockDir" logger -t $(basename $0) "$$ deleting stale semaphore dir $LockDir"
fi fi
sleep 1 sleep 1
done done
@ -18,7 +18,7 @@ V() {
rmdir "$LockDir" 2>/dev/null rmdir "$LockDir" 2>/dev/null
if [ $? -ne 0 ] if [ $? -ne 0 ]
then then
logger -t $(basename $0) "semaphore dir $LockDir disappeared while running" logger -t $(basename $0) "$$ semaphore dir $LockDir disappeared while running"
fi fi
} }
P P
@ -26,10 +26,10 @@ if [ ! -f /run/spacestatus ] # self initilizing on new install or boot
then then
if [ -f /root/var/spacestatus ] if [ -f /root/var/spacestatus ]
then # we could also get it from spaceapi, so that could should go here: then # we could also get it from spaceapi, so that could should go here:
logger -t $(basename $0) "boot detected, restoring spacestatus to $(cat /root/var/spacestatus)" logger -t $(basename $0) "$$ boot detected, restoring spacestatus to $(cat /root/var/spacestatus)"
cp -p /root/var/spacestatus /run/spacestatus # restore from backup cp -p /root/var/spacestatus /run/spacestatus # restore from backup
else else
logger -t $(basename $0) "never run before (new install?) setting spacestatus to closed" logger -t $(basename $0) "$$ never run before (new install?) setting spacestatus to closed"
echo "closed" > /run/spacestatus echo "closed" > /run/spacestatus
fi fi
chown www-data /run/spacestatus chown www-data /run/spacestatus
@ -42,14 +42,14 @@ nai=$(stat -c "%Y" /run/spacestatus) # get mtime as status change time
if [ "$status" = "open" ] if [ "$status" = "open" ]
then then
/usr/bin/curl --max-time 1 --silent --data key="$spaceapikey" --data-urlencode sensors='{"state":{"open":true,"lastchange":'"$nai"'}}' http://spaceapi.syn2cat.lu/sensor/set /usr/bin/curl --max-time 1 --silent --data key="$spaceapikey" --data-urlencode sensors='{"state":{"open":true,"lastchange":'"$nai"'}}' http://spaceapi.syn2cat.lu/sensor/set
#logger -t $(basename $0) "sending status $status to spacapi ret=$?" #logger -t $(basename $0) "$$ sending status $status to spacapi ret=$?"
fi fi
for plugin in $(ls "$0".d) for plugin in $(ls "$0".d)
do do
if [ -x "$0".d/"$plugin" ] if [ -x "$0".d/"$plugin" ]
then then
"$0".d/"$plugin" "$status" "$oldstatus" "$0".d/"$plugin" "$status" "$oldstatus"
logger -t $(basename $0) "called $plugin '$status' '$oldstatus'. ret=$?" logger -t $(basename $0) "$$ called $plugin '$status' '$oldstatus'. ret=$?"
fi fi
done done
@ -60,13 +60,13 @@ then
# will be the time of closing but not that of actually shutting the door # will be the time of closing but not that of actually shutting the door
# but the status will only be updated once the door is shut # but the status will only be updated once the door is shut
/usr/bin/curl --max-time 1 --silent --data key="$spaceapikey" --data-urlencode sensors='{"state":{"open":false,"lastchange":'"$nai"'}}' http://spaceapi.syn2cat.lu/sensor/set /usr/bin/curl --max-time 1 --silent --data key="$spaceapikey" --data-urlencode sensors='{"state":{"open":false,"lastchange":'"$nai"'}}' http://spaceapi.syn2cat.lu/sensor/set
#logger -t $(basename $0) "sending status $status to spacapi ret=$?" #logger -t $(basename $0) "$$ sending status $status to spacapi ret=$?"
fi fi
if [ $nai -ne $(stat -c "%Y" /root/var/spacestatus) ] # backup file in case it changed if [ $nai -ne $(stat -c "%Y" /root/var/spacestatus) ] # backup file in case it changed
then then
cp -p /run/spacestatus /root/var/spacestatus cp -p /run/spacestatus /root/var/spacestatus
logger -t $(basename $0) "spacestatus changed, saving to SD. ret=$?" logger -t $(basename $0) "$$ spacestatus changed, saving to SD. ret=$?"
fi fi
presency=$(cat /run/presency) presency=$(cat /run/presency)
if [ "$status" = "closed" ] if [ "$status" = "closed" ]

View File

@ -11,13 +11,16 @@ then
logger -t $(basename $0) "switching all lights off" logger -t $(basename $0) "switching all lights off"
for i in {1..16} for i in {1..16}
do do
/usr/local/bin/433send 2 1A $i 0 #off for j in {1..16}
do
/usr/local/bin/433send 2 $j $i 0 #off
done
done done
logger -t $(basename $0) "all lights should be off now" logger -t $(basename $0) "all lights should be off now"
fi fi
if [ "$1" = "released" ] if [ "$1" = "released" ]
then # switch status lights on, in any case then # switch status lights on, in any case
/usr/local/bin/433send 2 1A 2 1 #on /usr/local/bin/433send 2 2A 1 1 #on
fi fi
if [ "$1" = "released" ] && # the door has been opened if [ "$1" = "released" ] && # the door has been opened
# [ "$(cat /run/spacestatus)" = "open" ] && # status is open # [ "$(cat /run/spacestatus)" = "open" ] && # status is open
@ -30,7 +33,7 @@ then
fi fi
# type (2=10bit) # type (2=10bit)
# | house 1-16 (always 1 in our case) # | house 1-16 (the dial thingie)
# | |group A-P (the dial thingie) # | |group A-P (the dial thingie)
# | || unit (1-16) (the button, usually 1-4) # | || unit (1-16) (the button, usually 1-4)
# | || | on/off # | || | on/off

View File

@ -2,7 +2,7 @@
<?php <?php
/* /*
* Tezza (@Kaweechelchen | tezza@syn2cat.lu) * Tezza (@Kaweechelchen | tezza@syn2cat.lu)
* https://github.com/J7mbo/twitter-api-php * https://github.com/J7mbo/twitter-api-php
* */ * */
@ -14,8 +14,8 @@ $statusTag = '#statusUpdate';
// Set the messages to tweet when the status of the hackspace changes // Set the messages to tweet when the status of the hackspace changes
// %s is going to be replaced by the current time to avoid duplicate tweets on Twitter // %s is going to be replaced by the current time to avoid duplicate tweets on Twitter
$messageOpen = "It's %s and we are open \o/, come in and create something awesome =) $statusTag"; $messageOpen = "It's %s and we are open \o/ \ncome in and create something awesome =) \nhttps://Level2.lu/openingTimes";
$messageClosed = "We just closed our doors at %s. See you very soon... $statusTag"; $messageClosed = "We just closed our doors at %s \nSee you very soon... \nhttps://Level2.lu/openingTimes";
require_once('TwitterAPIExchange.php'); require_once('TwitterAPIExchange.php');

View File

@ -0,0 +1,9 @@
<?php
/** Set access tokens here - see: https://dev.twitter.com/apps/ **/
$settings = array(
'oauth_access_token' => '',
'oauth_access_token_secret' => '',
'consumer_key' => '',
'consumer_secret' => ''
);
?>

View File

@ -73,4 +73,4 @@ T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
# pidor # pidor
P0:2345:respawn:/root/pidor/scripts/lockbutton.sh P0:2345:respawn:/root/pidor/scripts/lockbutton.sh
#P1:2345:respawn:/root/pidor/scripts/phone_notification.sh P1:2345:respawn:/root/pidor/scripts/beamerdetect.sh