Exemple #1
0
    virtual void setup() {
        if(!active()) return;

        pinMode(PIN_IO_RST,OUTPUT);
        ioSetup();
        addBitlashFunction("io", ioCmd);

        sv_.setup();
        addBitlashFunction("sv", svCmd);

        st_.setup();
        addBitlashFunction("st", stCmd);

        fan_.setup();
        addBitlashFunction("fan", fanCmd);

        led_.setup();
        addBitlashFunction("led", ledCmd);

        tmp_.setup();
        addBitlashFunction("tmp", tmpCmd);

        attachInterrupt(0,Body::onInterrupt,FALLING);
        attachInterrupt(1,Body::onButton,FALLING);
    }
Exemple #2
0
    virtual void setup() {
        if(!active()) return;

        digitalWrite(PIN_PWR_SEL,LOW);
        pinMode(PIN_PWR_SEL,OUTPUT);

        vr_.setup();
        addBitlashFunction("vr", vrCmd);

        shd_.setup();
        addBitlashFunction("shd", shdCmd);

        mt_.setup();
        addBitlashFunction("mt", mtCmd);

        sv_.setup();
        addBitlashFunction("sv", svCmd);

        sol_.setup();
        addBitlashFunction("sol", solCmd);

        st_.setup();
        addBitlashFunction("st", stCmd);
    }
// *********************************************
// SETUP
// *********************************************
void setup_bitlash()
{

    Serial.println(F("------------ setup bitlash ------------"));

    // system
    addBitlashFunction("status", (bitlash_function) status);
    addBitlashFunction("board.list", (bitlash_function) board_list);
    addBitlashFunction("i2c.scan", (bitlash_function) I2C_scan);
    //~ addBitlashFunction("i2c.read", (bitlash_function) I2C_read);
    addBitlashFunction("ifconfig", (bitlash_function) IP_conf);
    addBitlashFunction("custom", (bitlash_function) bitlash_custom);
    addBitlashFunction("debug.list", (bitlash_function) list_debug);
    addBitlashFunction("version.list", (bitlash_function) list_lib_version);


    // real time clock
    addBitlashFunction("rtc.time", (bitlash_function) RTC_time);
    addBitlashFunction("rtc.set", (bitlash_function) RTC_set);

    // temperature
    addBitlashFunction("temp.list", (bitlash_function) temp_list);
    addBitlashFunction("onewire.list", (bitlash_function) ow_read);

    // teleinfo
    addBitlashFunction("teleinfo", (bitlash_function) teleinfo_status);

    // switch
    addBitlashFunction("switch.list", (bitlash_function) switch_list);

    // lighting
    addBitlashFunction("lighting.list", (bitlash_function) lighting_list);

    // shutter
    addBitlashFunction("shutter.list", (bitlash_function) shutter_list);

    Serial.println(F("----------- setup bitlash end ----------"));

}
Exemple #4
0
/////////////////////////////////////
// initialize the radio interface
//
// stick with me, this goes on for a while
// "may you live with interesting radios"
//
void init_radio(void) {

	init_leds();

	// Add Bitlash functions specific to this radio
	//	addBitlashFunction("degf", (bitlash_function) func_degf);
	addBitlashFunction("freq", (bitlash_function) func_setfreq);
	addBitlashFunction("rfget", (bitlash_function) func_rfget);
	addBitlashFunction("rfset", (bitlash_function) func_rfset);


	// Set output mode for outputs
	// TODO: Ensure SS is set to output if L01_CSN moves off SS!
	L01_PORT_DD |= (1<<L01_CE | 1<<L01_CSN | 1<<MOSI | 1<<L01_SCK);

	// Set MISO as an input
	L01_PORT_DD &= ~(1<<MISO);
	L01_PORT &= ~(1<<MISO);		// turn off the internal pullup

	rf_end();		// Set -CSN high to deselect radio

	// Initialize SPI interface to the radio
#if F_CPU == 8000000
	// Enable SPI; be the Master; SPI mode 0; set up for 8/2 prescale for 4 MHz clock
	SPCR = 0<<SPIE | 1<<SPE | 1<<MSTR | 0<<CPOL | 0<<CPHA | 0<<SPR1 | 0<<SPR0;
	SPSR = 1<<SPI2X;		// set 2x mode to make /4 into /2, so 4 MHz

#elif F_CPU == 16000000
	//// Enable SPI; be the Master; SPI mode 0; set up for 16/4 prescale for 4 MHz clock
	SPCR = 0<<SPIE | 1<<SPE | 1<<MSTR | 0<<CPOL | 0<<CPHA | 0<<SPR1 | 0<<SPR0; 
	SPSR = 0<<SPI2X;		// 16 MHz does _not_ need 2X mode

#else
	unsupported F_CPU
#endif

	// clear the status and data registers
	int junk = SPSR; 
	junk = SPDR;

	// For RFM22: set CE low to enable radio  (it's ~STBY)
	rf_enable();

	// Got radio?
	for (;;) {
		rf_set_register(REG_OP_MODE_1, 1<<SWRES);		// Reset the radio
		delay(1000);

		// Verify we have a radio, and it is the right type
		byte device_type = rf_read_register(REG_DEVICE_TYPE);
		byte device_version = rf_read_register(REG_VERSION_CODE);

		//printHex(device_type); speol();
		//printHex(device_version); speol();

		if ((device_type == DEVICE_TYPE_RXTX) &&
			((device_version == DEVICE_RFM22_VER_2) || (device_version == DEVICE_RFM22B))) {
			sp("RFM22 go!"); speol();
			break;
		} else {
			sp("No radio."); speol();
		}
	}

	//
	// Set up radio registers for transmit and receive
	//

	// Disable ENPOR and ENCHIPRDY interrupt sources
	// which are enabled by default
	rf_set_register(REG_INTERRUPT_ENABLE_2, 0);

	//set_ready_mode();

	// Configure GPIO0-1 for tx-rx antenna switching
	rf_set_register(REG_GPIO0_CONFIG, (3<<GPIODRV | 1<<PUP | 0x12));	// GPIO0 is TX-State -> TX-Ant control
	rf_set_register(REG_GPIO1_CONFIG, (3<<GPIODRV | 1<<PUP | 0x15));	// GPIO1 is RX-State -> RX-Ant control

	// Configure GPIO2 for 10MHz system clock output
	rf_set_register(REG_MCLK_OUTPUT, MCLK_10MHZ);

	// Data Access Control setup
	// default for REG_DATA_ACCESS_CONTROL is fine: use the packet engine & crc checks
	//	rf_set_register(REG_DATA_ACCESS_CONTROL, (1<<ENPACRX | 1<<ENPACTX | 1<<ENCRC | CRC_CRC16);

	// Frequency setup
	//
	// For North America, the default frequency band "fb" is 0x15 or 21
	// so 21 * 20 MHz = 420 MHz offset + 480 Mhz base = 900 MHz band
	//
	// the default carrier frequency setting "fc" is 0xBB80 = 48000
	//		48000/64000 = 0.75 * 2 * 10000 = 15000
	// giving 900 + 15 = 915 MHz as default frequency
	//
	// TODO: ignoring frequency offset registers for the moment
	//
	// This is equivalent to the default setting:
	//
	// rf_set_register(REG_FREQUENCY_BAND_SELECT, (1<<SBSEL | 1<<HBSEL | 0x15));
	// rf_set_register(REG_NOMINAL_CARRIER_FREQUENCY_HI, 0xbb);
	// rf_set_register(REG_NOMINAL_CARRIER_FREQUENCY_LO, 0x80);
	// or: rfset(0x75,0x75); rfset(0x76,0xbb); rfset(0x77,0x80)
	//
	// Decoding the example from the sample transmit/receive code for 434 MHz
	// band select low band with offset of 19
	// 240 + 19*10 = 430
	//
	// the remaining 4 mhz is to be found in the r76/77 carrier center freq
	// 	0x6400 = 25600
	// 	25600/64000 = 0.4
	// 	0.4 * 10000 = 4000
	//
	// This is the equivalent code to set 434 MHz using our defines:
	//rf_set_register(REG_FREQUENCY_BAND_SELECT, (1<<SBSEL | 0<<HBSEL | 0x13));
	//rf_set_register(REG_NOMINAL_CARRIER_FREQUENCY_HI, 0x64);
	//rf_set_register(REG_NOMINAL_CARRIER_FREQUENCY_LO, 0x00);
	// or from the console: rfset(0x75,0x53); rfset(0x76,0x64); rfset(0x77,0x00)


	// TX Data Rate Setup
	//
	// this fragment from the example sets up for 4800 bps:
	//	spi_write(0x6e, 0x27); // Tx data rate 1
	//	spi_write(0x6f, 0x52); // Tx data rate 0
	//
	// for HBSEL=1, TX_DR = 1000 * txdr / 2^16
	// for HBSEL=0, TX_DR = 1000 * txdr / 2^21
	//
	// the default on this sample part is 0x0a3d => 39.9938 kbps, call it 40kbps
	//
	// inverting the formula:
	// 		value = (baud/1000)*(2^21)/1000	for baud <  30000
	// 		value = (baud/1000)*(2^16)/1000	for baud >= 30000
	//
	// these values are copied from the file doc/rfm-22-calculations.ods:
	//
	//		baud	divisor	divisor, hex
	//		1200	2516	09D4
	//		2400	5033	13A9
	//		4800	10066	2752
	//		9600	20132	4EA4
	//
	//		40000	2621	0A3D	<-- this is the default 6e/6f setting
	//		57600	3774	0EBE
	//		64000	4194	1062
	//		96000	6291	1893
	//		100000  6553    1999
	//		128000	8388	20C4
	//


// Configure the data rate
//
#define TX_DATA_RATE 40000
//#define TX_DATA_RATE 100000

#if TX_DATA_RATE == 40000

	// 40kbps is the factory setting;
	// take all the defaults but turn on FIFO and FSK
	rf_set_register(REG_MODULATION_MODE_CONTROL_2,
		(0<<TRCLK | MOD_FIFO<<DTMOD | 0<<ENINV | 0<<FD_8 | MOD_FSK<<MODTYP));

#elif  TX_DATA_RATE == 100000

	// Set data rate to 100000 bps
	// NOTE: don't forget to double check the TXDTRTSCALE bit in 0x70 if you set below 30k
	rf_set_register(REG_TX_DATA_RATE_HI, 0x19);
	rf_set_register(REG_TX_DATA_RATE_LO, 0x99);

	// Frequency Deviation setup
	//
	// value in increments of 625 Hz
	// default of 0x20 gives 0x20 = 32 * 625 Hz = 20 KHz
	// example uses 45k/625 = 72
	//

#define TX_DEVIATION 50000

#if TX_DEVIATION == 50000

	// for 100kbps, with deviation at 50 kHz = 50000/625 = 80 = 0x050
	// NOTE: high bit goes in REG_MODULATION_CONTROL_2 as FD_8
	rf_set_register(REG_FREQUENCY_DEVIATION, 0x50);

	// Set up for FIFO io and FSK modulation
	// NOTE: high bit of deviation is here!
	rf_set_register(REG_MODULATION_MODE_CONTROL_2, 
		(0<<TRCLK | MOD_FIFO<<DTMOD | 0<<ENINV | 0<<FD_8 | MOD_FSK<<MODTYP));

	// Set up RX Modem Configuration per Table 16
	//
	// For 100kbps/100kHz settings:
	rf_set_register(REG_IF_FILTER_BANDWIDTH, (1<<DWN3_BYPASS | 0<<NDEC_EXP | 0xf<<FILSET));
	rf_set_register(REG_CLOCK_RECOVERY_OVERSAMPLING_RATE, 0x78);
	rf_set_register(REG_CLOCK_RECOVERY_OFFSET_2, (0<<RXOSR_8_10 | 0<<STALLCTRL | 1<<NCOFF_16_19));
	rf_set_register(REG_CLOCK_RECOVERY_OFFSET_1,(0x11));
	rf_set_register(REG_CLOCK_RECOVERY_OFFSET_0,(0x11));
	rf_set_register(REG_CLOCK_RECOVERY_GAIN_1,(0x04));
	rf_set_register(REG_CLOCK_RECOVERY_GAIN_0,(0x46));

#elif TX_DEVIATION == 300000

	// for 100kbps, set deviation at 300 kHz = 300000/625 = 480 = 0x1e0
	// NOTE: high bit goes in REG_MODULATION_CONTROL_2 as FD_8
	rf_set_register(REG_FREQUENCY_DEVIATION, 0xe0);

	// Set up for FIFO io and FSK modulation
	// NOTE: high bit of deviation is here!
	rf_set_register(REG_MODULATION_MODE_CONTROL_2, 
		(0<<TRCLK | MOD_FIFO<<DTMOD | 0<<ENINV | 1<<FD_8 | MOD_FSK<<MODTYP));

	// Set up RX Modem Configuration per Table 16
	//
	// For 100kbps/300kHz settings:
	rf_set_register(REG_IF_FILTER_BANDWIDTH, (1<<DWN3_BYPASS | 0<<NDEC_EXP | 0xe<<FILSET));
	rf_set_register(REG_CLOCK_RECOVERY_OVERSAMPLING_RATE, 0x78);
	rf_set_register(REG_CLOCK_RECOVERY_OFFSET_2, (0<<RXOSR_8_10 | 0<<STALLCTRL | 1<<NCOFF_16_19));
	rf_set_register(REG_CLOCK_RECOVERY_OFFSET_1,(0x11));
	rf_set_register(REG_CLOCK_RECOVERY_OFFSET_0,(0x11));
	rf_set_register(REG_CLOCK_RECOVERY_GAIN_1,(0x00));
	rf_set_register(REG_CLOCK_RECOVERY_GAIN_0,(0xb8));
#else
	unsupported TX_DEVIATION
#endif

#else
	unsupported TX_DATA_RATE
#endif

	// Header Configuration
	//
	// Enable header checking and broadcast matching on all address bytes
	rf_set_register(REG_HEADER_CONTROL_1, (0xf<<BCEN | 0xf<<HDCH));

	// Set up for 4 byte header, variable packet length, 2 byte sync, 0 for MSB Preamble Length
	// 	(default is 0x22: HDLEN 010 Header 3 and 2; Sync Word 3 and 2)
	//
	rf_set_register(REG_HEADER_CONTROL_2, (4<<HDLEN | 0<<FIXPKLEN | 1<<SYNCLEN | 0<<PREALEN8));

	// Preamble Length
	// the default preamble length is 8 nibbles / 32 bits
	// the sample transmit / receive code provided by HopeRF uses 64 nibbles instead(!)
	// the table on page 43 recommends 40 bits (10 nibbles), so we use that here
	//
	// TODO: test with shorter preamble for performance
	//
	rf_set_register(REG_PREAMBLE_LENGTH, (40/4));

	// Preamble Detect Threshold
	//
	// DOCBUG: possible doc issue regarding preamble threshold:
	// 	rfget(0x35) is 0x20 at bootup; this is 4<<3, not 5<<3 per doc p.106
	//	(not to mention register 0x35 is missing from the summary table)
	// 	4 nibbles is 16 bits, but on page 42 it is recommended to use 20 bits
	// so we set PREATH to 20 bits here; that's 5 nibbles
	//
	rf_set_register(REG_PREAMBLE_DETECTION_CONTROL_1, (20/4)<<PREATH);

	// Sync Pattern and Length
	// we use the default sync pattern of 2dd4 with 2 byte check

	// Enable the radio so rf_set_rx_address is a pass-thru below
	radio_go = 1;		// mark the radio as UP

	// Receive address setup: listen on NOOB, and the broadcast address,
	// until setid() is called to provide an updated address.
	// If setid() was called before now, use the cached value.
	// (Tx address is set up per packet)
	//
	rf_set_rx_address((*nodeid) ? nodeid : (char *) DEFAULT_RX_ADDRESS);

	set_rx_mode();		// engage the receiver and off we go
}