| 118 | } |
| 119 | |
| 120 | static void serial_uart_isr(const struct device *dev, void *user_data) |
| 121 | { |
| 122 | modSerial serial = (modSerial)user_data; |
| 123 | uint8_t flags = 0; |
| 124 | |
| 125 | while (uart_irq_update(dev) && uart_irq_is_pending(dev)) { |
| 126 | if (serial->onError) { |
| 127 | int error = uart_err_check(dev); |
| 128 | if (error) { |
| 129 | serial->lastError = error; |
| 130 | flags |= kSerialError; |
| 131 | } |
| 132 | } |
| 133 | |
| 134 | if (uart_irq_rx_ready(dev)) { |
| 135 | uint8_t rx_data[MODDEF_SERIAL_RX_CHUNKSIZE]; |
| 136 | int bytes_read; |
| 137 | |
| 138 | while ((bytes_read = uart_fifo_read(dev, rx_data, sizeof(rx_data))) > 0) { |
| 139 | uint32_t written = ring_buf_put(&serial->rxRingBuffer, rx_data, bytes_read); |
| 140 | if (serial->onReadable && (written > 0)) |
| 141 | flags |= kSerialReadable; |
| 142 | |
| 143 | if (serial->onError && (written < bytes_read)) { |
| 144 | serial->lastError = -ENOMEM; // buffer overflow |
| 145 | flags |= kSerialError; |
| 146 | } |
| 147 | } |
| 148 | } |
| 149 | |
| 150 | uint32_t space = uart_irq_tx_ready(dev); |
| 151 | if (space > 0) { |
| 152 | uint8_t tx_data[MODDEF_SERIAL_TX_CHUNKSIZE]; |
| 153 | uint32_t len = ring_buf_get(&serial->txRingBuffer, tx_data, |
| 154 | (space < MODDEF_SERIAL_TX_CHUNKSIZE) ? space : MODDEF_SERIAL_TX_CHUNKSIZE); |
| 155 | if (len > 0) { |
| 156 | uart_fifo_fill(dev, tx_data, len); |
| 157 | |
| 158 | if (serial->onWritable && (ring_buf_space_get(&serial->txRingBuffer) > 0)) //@@ this could fire less often |
| 159 | flags |= kSerialWritable; |
| 160 | } |
| 161 | else { |
| 162 | uart_irq_tx_disable(dev); |
| 163 | serial->txEnabled = false; |
| 164 | if (serial->onWritable) |
| 165 | flags |= kSerialWritable; |
| 166 | } |
| 167 | } |
| 168 | } |
| 169 | |
| 170 | uint8_t currentFlags = serial->flags; |
| 171 | serial->flags |= flags; |
| 172 | if (flags && !currentFlags) { |
| 173 | serial->useCount++; |
| 174 | modMessagePostToMachineFromISR(serial->the, serialDeliver, serial); |
| 175 | } |
| 176 | } |
| 177 |
nothing calls this directly
no test coverage detected