void openserial_startOutput() { //schedule a task to get new status in the output buffer uint8_t temp_openserial_debugPrintCounter; //to avoid many atomics __disable_interrupt(); openserial_debugPrintCounter=(openserial_debugPrintCounter+1)%13; temp_openserial_debugPrintCounter = openserial_debugPrintCounter; __enable_interrupt(); switch (temp_openserial_debugPrintCounter) { // case 0: if(stupidmac_debugPrint() == TRUE) {break;}; // case 1: if(neighbors_debugPrint() == TRUE) {break;}; // case 2: if(nores_debugPrint() == TRUE) {break;}; // case 3: if(iphc_debugPrint() == TRUE) {break;}; // case 4: if(forwarding_debugPrint() == TRUE) {break;}; // case 5: if(icmpv6_debugPrint() == TRUE) {break;}; // case 6: if(icmpv6echo_debugPrint() == TRUE) {break;}; // case 7: if(icmpv6router_debugPrint() == TRUE) {break;}; // case 8: if(icmpv6rpl_debugPrint() == TRUE) {break;}; // case 9: if(idmanager_debugPrint() == TRUE) {break;}; // case 10: if(openqueue_debugPrint() == TRUE) {break;}; // case 11: if(openserial_debugPrint() == TRUE) {break;}; // case 12: if(openbridge_debugPrint() == TRUE) {break;}; default: __disable_interrupt(); openserial_debugPrintCounter=0; __enable_interrupt(); } //print out what's in the buffer now UC1IFG &= ~(UCA1TXIFG | UCA1RXIFG); // clear possible pending interrupts UC1IE |= (UCA1RXIE | UCA1TXIE); // Enable USCI_A1 TX & RX interrupt __disable_interrupt(); openserial_mode=MODE_OUTPUT; if (openserial_somethingInOutputBuffer) { UCA1TXBUF = openserial_output_buffer[output_buffer_index_read_increment()]; } else { openserial_stop(); } __enable_interrupt(); }
//executed in ISR, called from scheduler.c void isr_openserial_tx() { switch (openserial_vars.mode) { case MODE_INPUT: openserial_vars.input_command_index++; if (openserial_vars.input_command_index<sizeof(openserial_vars.input_command)) { uart_writeByte(openserial_vars.input_command[openserial_vars.input_command_index]); } else { openserial_vars.ready_receive_command = TRUE; } break; case MODE_OUTPUT: if (openserial_vars.output_buffer_index_write==openserial_vars.output_buffer_index_read) { openserial_vars.somethingInOutputBuffer=FALSE; } if (openserial_vars.somethingInOutputBuffer) { uart_writeByte(openserial_vars.output_buffer[output_buffer_index_read_increment()]); } break; case MODE_OFF: default: break; } }
//executed in ISR, called from scheduler.c void openserial_txInterrupt() { UC1IFG &= ~UCA1TXIFG; // TODO: do not clear, but disable when done switch (openserial_mode) { case MODE_INPUT: openserial_input_command_index++; if (openserial_input_command_index<sizeof(openserial_input_command)) { UCA1TXBUF = openserial_input_command[openserial_input_command_index]; } else { openserial_ready_receive_command = TRUE; } break; case MODE_OUTPUT: if (openserial_output_buffer_index_write==openserial_output_buffer_index_read) { openserial_somethingInOutputBuffer=FALSE; } if (openserial_somethingInOutputBuffer) { UCA1TXBUF = openserial_output_buffer[output_buffer_index_read_increment()]; } break; case MODE_OFF: default: break; } }
void openserial_startOutput() { //schedule a task to get new status in the output buffer uint8_t temp_openserial_debugPrintCounter; //to avoid many atomics INTERRUPT_DECLARATION(); DISABLE_INTERRUPTS(); openserial_vars.debugPrintCounter=(openserial_vars.debugPrintCounter+1)%STATUS_MAX; temp_openserial_debugPrintCounter = openserial_vars.debugPrintCounter; ENABLE_INTERRUPTS(); switch (temp_openserial_debugPrintCounter) { case STATUS_ISSYNC: if (debugPrint_isSync()==TRUE) { break; } case STATUS_ID: if (debugPrint_id()==TRUE) { break; } case STATUS_DAGRANK: if (debugPrint_myDAGrank()==TRUE) { break; } case STATUS_OUTBUFFERINDEXES: if(debugPrint_outBufferIndexes()==TRUE) { break; } case STATUS_ASN: if(debugPrint_asn()==TRUE) { break; } case STATUS_MACSTATS: if (debugPrint_macStats()==TRUE) { break; } case STATUS_SCHEDULE: if(debugPrint_schedule()==TRUE) { break; } case STATUS_QUEUE: if(debugPrint_queue()==TRUE) { break; } case STATUS_NEIGHBORS: if(debugPrint_neighbors()==TRUE) { break; } default: DISABLE_INTERRUPTS(); openserial_vars.debugPrintCounter=0; ENABLE_INTERRUPTS(); } //print out what's in the buffer now uart_clearTxInterrupts(); uart_clearRxInterrupts(); // clear possible pending interrupts uart_enableInterrupts(); // Enable USCI_A1 TX & RX interrupt DISABLE_INTERRUPTS(); openserial_vars.mode=MODE_OUTPUT; if (openserial_vars.somethingInOutputBuffer) { uart_writeByte(openserial_vars.output_buffer[output_buffer_index_read_increment()]); } else { openserial_stop(); } ENABLE_INTERRUPTS(); }