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; }
// 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 ); }
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; }