Sending timer state with Nordic Multi NUS Master on nRF5340

Hello


I want to make an application based on the multi NUS sample
https://devzone.nordicsemi.com/guides/nrf-connect-sdk-guides/b/software/posts/enter-the-multi-nus-a-simple-wireless-uart-network

https://github.com/NordicMatt/multi-NUS


but I want to send timer state to all peripheral devices every 1500ms. I want start this feature after send "_START_" from computer COM port.
I want also to print on UART received messages from peripheral devices with timer state (timestamp) from the moment they were received.

I have problem. I tried to init timer and read timer satus. I tried to do something simmilar to this sample:
https://github.com/sigurdnev/ncs-playground/blob/master/samples/pulse_detector/src/main.c

this is my code snippet:

#define TIMER_INTERVAL_MS 1500

static const nrfx_timer_t m_timer_count = NRFX_TIMER_INSTANCE(1);
static const nrfx_timer_t m_timer_read  = NRFX_TIMER_INSTANCE(2);

static uint32_t timer_value = 0;



void timer_handler_count(nrf_timer_event_t event_type, void * p_context)
{

	uint32_t count = nrfx_timer_capture_get(&m_timer_count, NRF_TIMER_CC_CHANNEL0);

	if(count > 0)
	{
		if( ((count % TIMER_INTERVAL_MS) == 0) )
		{
			timer_value = count;
			printk("Timerrr valueee: %lu\n", timer_value);
			timestamp_send();
		}
	}

}

void timer_handler_read(nrf_timer_event_t event_type, void * p_context)
{

	uint32_t count = nrfx_timer_capture_get(&m_timer_count, NRF_TIMER_CC_CHANNEL0);

	if(count > 0)
	{
		if( ((count % TIMER_INTERVAL_MS) == 0) )
		{
			timer_value = count;
			printk("Timer value: %lu\n", timer_value);
			timestamp_send();
		}
	}
	
}


static void timer_init(void)
{
	// Configure m_timer_count for counting of low to high events on GPIO
	nrfx_err_t          err;
	nrfx_timer_config_t timer_cfg = {
		.mode      = NRF_TIMER_MODE_LOW_POWER_COUNTER,
		.bit_width = NRF_TIMER_BIT_WIDTH_32,
		.p_context = NULL,
	};

	err = nrfx_timer_init(&m_timer_count, &timer_cfg, timer_handler_count);
	if (err != NRFX_SUCCESS) {
		printk("nrfx_timer_init failed with: %d\n", err);
	}

	// Configure m_timer_read for reading the counter timer at a given interval COUNT_READ_INTERVAL
    timer_cfg.mode = NRF_TIMER_MODE_TIMER;
    err = nrfx_timer_init(&m_timer_read, &timer_cfg, timer_handler_read);
    if (err != NRFX_SUCCESS) {
		printk("nrfx_timer_init failed with: %d\n", err);
	}
		
	nrfx_timer_extended_compare(&m_timer_read,
		NRF_TIMER_CC_CHANNEL0,
		nrfx_timer_ms_to_ticks(&m_timer_read, TIMER_INTERVAL_MS),
		NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK,
		true);
	
		
	IRQ_CONNECT(TIMER1_IRQn, IRQ_PRIO_LOWEST, nrfx_timer_1_irq_handler, NULL, 0);
	IRQ_CONNECT(TIMER2_IRQn, IRQ_PRIO_LOWEST, nrfx_timer_2_irq_handler, NULL, 0);
		
	nrfx_timer_clear(&m_timer_count);
	nrfx_timer_clear(&m_timer_read);
		
	nrfx_timer_enable(&m_timer_count);
	nrfx_timer_enable(&m_timer_read);
		
}


Referring to the sending part I wrote code, but it is not sending message to peripherals

void timestamp_send()
{
	convert_number_to_text(timer_value, data_to_send, sizeof(data_to_send));
	int length = sizeof(data_to_send);
	char * message = data_to_send;
	int err = 0;
	static bool broadcast = false;
	static int nus_index = 0;
	
	const size_t num_nus_conns = bt_conn_ctx_count(&conns_ctx_lib);
	
	
	//    ==== SENDING BASED ON BROADCAST IN multi_nus_send() FUNCTION  =====  (not working)
/*
	for (size_t i = 0; i < num_nus_conns; i++) {
		const struct bt_conn_ctx *ctx = bt_conn_ctx_get_by_id(&conns_ctx_lib, i);

		if (ctx) {
			struct bt_nus_client *nus_client = ctx->data;

			if (nus_client != NULL) {
				err = bt_nus_client_send(nus_client, message, length);
				if (err) {
					LOG_WRN("Failed to send --TIMESTAMP-- over BLE connection" "(err %d)", err);
				}else{
					LOG_INF("Sent to server (timestamp) %d: %s", nus_index, message);
				}

				bt_conn_ctx_release(&conns_ctx_lib, (void *)ctx->data);

				err = k_sem_take(&nus_write_sem, NUS_WRITE_TIMEOUT);
				if (err) {
					LOG_WRN("NUS send TIMESTAMP timeout");
				}
			}
		}
	}
*/
	
	
	// Annother attempt (also not working)
// /*	
	struct uart_data_t *txx = k_malloc(sizeof(data_to_send));

	uint16_t ln = sizeof(data_to_send);

	for(uint32_t ii=0; ii<ln; ii++)
	{
		txx->data[ii] = data_to_send[ii];
	}
	txx->len = ln;
	multi_nus_send(txx);
// */	
	
	
}

What should I modify to implement starting sending timestamp from timer after send "_START_" from computer COM port (and send "_STOP_" to stop sending timestamp) ?

Can you help me resolve this problem?

Best Regards

  • Hi

    First off, what version of the nRF Connect SDK are you using for development here? Based on your description I think that something like the Time synchronization sample might be of interest for you. What exactly are you looking to do here, and what is the use case? As it will be easier to provide correct support if I know where we're going here. Just reading a snippet of code and pointing out what's wrong out of context is pretty hard, so better to start off on the right page.

    Best regards,

    Simon

Related