示例#1
0
int IR_xmit ()
{
    if (IrCtrl.len == 0) {
        IRLOG_PRINTLN("!E26");
        IR_state( IR_IDLE );
        return 0;
    }
#ifndef FACTORY_CHECKER
    // factory checker xmits after receiving
    if ( IrCtrl.state != IR_WRITING ) {
        return 0; // Abort when collision detected
    }
#endif

    irpacker_packend( &packer_state );

    IR_state( IR_XMITTING );
    if (IrCtrl.freq == 40) {
        IR_TX_40K();
    }
    else {
        IR_TX_38K();
    }
    IR_TX_ON();

    irpacker_unpack_start( &packer_state );

    IR_COMPARE_ENABLE( IR_get() );
    IrCtrl.tx_index ++;

    // unpacking takes time, so we want to run unpack while timer is running
    IrCtrl.next_interval = IR_get();

    return 1;
}
示例#2
0
// Transmission timing and Trailer detection
ISR_COMPARE()
{
    if (IrCtrl.state == IR_XMITTING) {
        if (IrCtrl.tx_index >= IrCtrl.len) {
            // tx successfully finished
            IR_TX_OFF();
            IR_state( IR_IDLE );
            return;
        }
        uint16_t interval = IrCtrl.next_interval;
        if (IR_TX_IS_ON()) {
            // toggle
            IR_TX_OFF();
        }
        else {
            if ( IrCtrl.next_interval != 0 ) {
                // toggle
                IR_TX_ON();
            }
            else {
                // 65535,0,XXXX sequence means:
                // continue TX_OFF for 65535 + XXXX interval and turn TX_ON
                interval = IR_get();
                IrCtrl.tx_index ++;
            }
        }

        IR_COMPARE_NEXT( interval );

        // run heavy packer.unpack after setting timer
        IrCtrl.next_interval = IR_get();
        IrCtrl.tx_index ++;
        return;
    }
    else if (IrCtrl.state == IR_RECVING) {
        IrCtrl.trailer_count --;
        if (IrCtrl.trailer_count == 0) {
            // Trailer detected
            IR_state( IR_RECVED );
        }
        else {
            // wait for next compare interrupt
        }
        return;
    }

    IR_state( IR_IDLE );
}
示例#3
0
static int8_t on_get_messages_request(int8_t cid, GSwifi::GSREQUESTSTATE state) {
    if (state != GSwifi::GSREQUESTSTATE_RECEIVED) {
        return -1;
    }

    gs.writeHead(cid, 200);

    if ( (IrCtrl.len <= 0) ||
         (IrCtrl.state != IR_RECVED_IDLE) ) {
        // if no data
        gs.writeEnd();
        ring_put( &commands, COMMAND_CLOSE );
        ring_put( &commands, cid );
        return 0;
    }

    IR_state( IR_READING );

    gs.write("{\"format\":\"raw\",\"freq\":"); // format fixed to "raw" for now
    gs.write(IrCtrl.freq);
    gs.write(",\"data\":[");
    for (uint16_t i=0; i<IrCtrl.len; i++) {
        gs.write( IR_get() );
        if (i != IrCtrl.len - 1) {
            gs.write(",");
        }
    }
    gs.write("]}");
    gs.writeEnd();
    ring_put( &commands, COMMAND_CLOSE );
    ring_put( &commands, cid );

    IR_state( IR_IDLE );

#ifdef USE_INTERNET
    TIMER_START( suspend_polling_timer, SUSPEND_GET_MESSAGES_INTERVAL );
#endif

    return 0;
}