Exemple #1
0
// SPI needs to be initialized before
void wlhl_init_tx(void)
{
    uint8_t k;

    // -- Basic config
    wl_module_init();
    _delay_ms(50);

    // Configurate the interrupt
    WIRELESS_INTERRUPT_FALLING_EDGE();
    WIRELESS_INTERRUPT_ENABLE();

    // -- Config Module
    wl_module_tx_config(wl_module_TX_NR_0);

    // Wait for configuration to complete
    _delay_ms(10);

    // -- Check MAX_RT and clear it if set
    // Read wl_module status
    wl_module_CSN_lo;        //  Pull down chip select
    k = spi_fast_shift(NOP); // Read status register
    wl_module_CSN_hi;        // Pull up chip select

    if (k & STATUS_MAX_RT) {
        // Clearing STATUS_MAX_RT
        wl_module_config_register(STATUS, (1 << MAX_RT));
    }

    _delay_ms(10);

    // Flush data out of TX FIFO (there may be data after reset)
    wl_module_CSN_lo;           // Pull down chip select
    spi_fast_shift(FLUSH_TX);   // Write cmd to flush tx fifo
    wl_module_CSN_hi;           // Pull up chip select
}
void main(void) {
    uint8_t err;
    Status_Payload status_payload;
    TEMP_HUM_Payload temp_hum_payload;
    memset(&temp_hum_payload,0,sizeof(TEMP_HUM_Payload));    
    temp_hum_payload.header.msg_id = TEMP_HUM_DATA;
    temp_hum_payload.header.nodeId = NODE_ID;
    
    memset(&status_payload,0,sizeof(Status_Payload)); 
    status_payload.header.msg_id = STATUS_DATA;
    status_payload.header.nodeId = NODE_ID;
    status_payload.sw_version = SW_VERSION;

    /* set all pins to input to save power. */
    TRISC = 0xffffff;
    TRISA = 0xffffff;
    TRISB = 0xffffff;

    RF_PWR_PIN_DIR = 0;
    peripheral_pwr(false);
    
    // never works first time, so dummy call...
    measure_power();

    LED_RED_DIR = 0;
    LED_GRN_DIR = 0;
    LED_RED = 0b0;
    LED_GRN = 0b0;

    /* Configure the oscillator for the device */
    ConfigureOscillator();

    /* Initialize I/O and Peripherals for application */
    InitApp();

    /* Check payload size */
    if ((temp_hum_payload_size != sizeof (TEMP_HUM_Payload)) || (status_payload_size != sizeof (Status_Payload))) {
        while (1) {
            LED_RED = 0b1;
            LED_GRN = 0b1;
            sleep(WDT_256_MS);
            LED_RED = 0b0;
            LED_GRN = 0b0;
            sleep(WDT_256_MS);
        }
    }

    sleep(WDT_1_SEC);
    
    LED_RED = 0b1;
    LED_GRN = 0b1;
    sleep(WDT_256_MS);
    LED_RED = 0b0;
    LED_GRN = 0b0;


    /* Main loop */
    while (1) {
        peripheral_pwr(true);
        //wait for settling time
        sleep(WDT_32_MS);
        
        err = getTH(&temp_hum_payload.humidity,&temp_hum_payload.temperature);
        if (err){
            status_payload.sensor_err++;
        }
        temp_hum_payload.header.count++;
        
        wl_module_tx_config(wl_module_TX_NR_0);                
        err = wl_module_send((unsigned char *) &temp_hum_payload, sizeof (temp_hum_payload));
        if (err){
            status_payload.rf_error++;
        }
        
        if (temp_hum_payload.header.count % 12 == 1) {
            /* send long payload */
            status_payload.millivolts = measure_power();
            status_payload.header.count++;
            err |= wl_module_send((unsigned char *) &status_payload, sizeof (status_payload));
        }

        peripheral_pwr(false);
        
        if (err){
            LED_RED = 0b1;
            sleep(WDT_1_MS);
            LED_RED = 0b0;
        }else{
            LED_GRN = 0b1;
            sleep(WDT_1_MS);
            LED_GRN = 0b0;
        }
        
        LED_RED = 0b0;
        LED_GRN = 0b0;
        sleep(WDT_256_SEC);
        sleep(WDT_32_SEC);
    }
}