<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://devzone.nordicsemi.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>How can i set a timer in my project?</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/81546/how-can-i-set-a-timer-in-my-project</link><description>Hello everyone, 
 I want to be able to set a timer in my project. With this timer i want to be able to make my current comsumption evaluation easier. 
 I am using the nrf9160 DK. 
 I proceeded the following way: 
 
 unfortunately it is not working, can</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Mon, 15 Nov 2021 10:46:17 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/81546/how-can-i-set-a-timer-in-my-project" /><item><title>RE: How can i set a timer in my project?</title><link>https://devzone.nordicsemi.com/thread/338984?ContentTypeID=1</link><pubDate>Mon, 15 Nov 2021 10:46:17 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:d727ffc7-ae62-4b58-8425-29920a205f6b</guid><dc:creator>Simon</dc:creator><description>[quote user="ced27"]couldn&amp;#39;t trace the timer actually working when looking at the Graph[/quote]
&lt;p&gt;What do you mean by this? Do you see &amp;quot;Expiry function is running&amp;quot; in the terminal? If you do see that, the timer is indeed working.&lt;/p&gt;
[quote user="ced27"]&lt;p&gt;I set the timer() at the position where i want a delay to be able to know when and what is coming as next.&lt;/p&gt;
&lt;p&gt;Any idea, if actually that which i am doing the best approach is? What do you think?&lt;/p&gt;[/quote]
&lt;p&gt;If you want to use a timer to execute stuff at regular intervals, I would recommend you to set it up as I did in my sample. Then use k_sem_give() inside the expiry function and k_sem_take() inside a while(true) loop and execute the stuff you want, like I&amp;#39;ve done &lt;a href="https://github.com/simon-iversen/sdk-nrf/blob/1c4787742019141f32be8e70c0cf9729551ada02/samples/light_controller/src/main.c#L120"&gt;here&lt;/a&gt;. Another approach is to use &lt;a href="https://developer.nordicsemi.com/nRF_Connect_SDK/doc/1.7.1/zephyr/reference/kernel/threads/workqueue.html#workqueue-threads"&gt;work queues&lt;/a&gt;, and offload the work from the expiry function to a work queue thread.&lt;/p&gt;
&lt;p&gt;Best regards,&lt;/p&gt;
&lt;p&gt;Simon&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How can i set a timer in my project?</title><link>https://devzone.nordicsemi.com/thread/338342?ContentTypeID=1</link><pubDate>Wed, 10 Nov 2021 10:20:33 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:66b3c74c-16d3-41cb-ac3c-8c0cd81ba666</guid><dc:creator>ced27</dc:creator><description>&lt;p&gt;Hi simon,&lt;/p&gt;
&lt;p&gt;using the timer while evaluating the current consumption of the board, couldn&amp;#39;t trace the timer actually working when looking at the Graph&lt;/p&gt;
&lt;p&gt;Here is my code:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;/*
 * Copyright (c) 2020 Nordic Semiconductor ASA
 *
 * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
 */

#include &amp;lt;zephyr.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;modem/lte_lc.h&amp;gt;
#include &amp;lt;net/socket.h&amp;gt;
#include &amp;lt;random/rand32.h&amp;gt;
#include &amp;lt;net/coap.h&amp;gt;

#include &amp;lt;modem/nrf_modem_lib.h&amp;gt;
#include &amp;lt;logging/log.h&amp;gt;
#include &amp;lt;sys/printk.h&amp;gt;
#include &amp;lt;modem/modem_key_mgmt.h&amp;gt;
#include &amp;lt;net/tls_credentials.h&amp;gt;


#include &amp;lt;nrf9160.h&amp;gt;
#include &amp;lt;device.h&amp;gt;
#include &amp;lt;drivers/gpio.h&amp;gt;

#include &amp;lt;nrfx.h&amp;gt;

#include &amp;lt;cJSON.h&amp;gt;
#include &amp;lt;cJSON_os.h&amp;gt;


#include &amp;quot;ui.h&amp;quot;
#include &amp;quot;config.h&amp;quot;

/* 1000 msec = 1 sec */
//#define SLEEP_TIME_MS 100
#define TIMER_INTERVAL_MSEC 500
#define LOG_LEVEL 3

LOG_MODULE_REGISTER(asset_tracker, LOG_LEVEL);

#define PAYLOAD_BYTES 100
#define APP_COAP_VERSION 1  // CoAP Version

struct k_timer my_timer;
struct device *dev;
// uint8_t toggle = 0;

static int sock; // BSD socket API
static struct sockaddr_storage server; // structure f&amp;#252;r CoAP-Server- Addressinformation.


static uint16_t next_token; // request ID
static struct pollfd fds; // File descriptor

static uint8_t data[PAYLOAD_BYTES]; // CONFIG_DATA_UPLOAD_SIZE_BYTES Maximale Nachrichtgr&amp;#246;&amp;#223;e


void my_expiry_function(struct k_timer *timer_id){
    printk(&amp;quot;Expiry function is running\n&amp;quot;);
}

void timer(void){

        printk(&amp;quot;Timer started\n&amp;quot;);
        k_timer_init(&amp;amp;my_timer, my_expiry_function, NULL);
        k_timer_start(&amp;amp;my_timer, K_MSEC(TIMER_INTERVAL_MSEC), K_MSEC(TIMER_INTERVAL_MSEC));
        //k_timer_stop(&amp;amp;my_timer);
}

/*************************************************************************************************************/

// Benutzeroberfl&amp;#228;chenmodul.
static void ui_evt_handler(struct ui_evt *evt) // Event-Handler f&amp;#252;r LEDS
{
	if (!evt) {
		return;
	}
}

/*************************************************************************************************************/

cJSON * createJsonFromParams(void)
{
	
	char *value = &amp;quot;50&amp;quot;;
        char *number = &amp;quot;12&amp;quot;;
        cJSON *root;

        /* JSN-Objekt erstellen */
	root = cJSON_CreateObject();

        /* Payload hinzuf&amp;#252;gen */
	cJSON_AddItemToObject(root, &amp;quot;JSON&amp;quot;, cJSON_CreateString(value));
	cJSON_AddItemToObject(root, &amp;quot;Content-Form&amp;quot;, cJSON_CreateString(number)); 

   return root;

}

/*************************************************************************************************************/

static int dtls_init(void){

int err;

#if defined(CONFIG_NRF_MODEM_LIB) &amp;amp;&amp;amp; defined(CONFIG_MODEM_KEY_MGMT)
	err = modem_key_mgmt_write(CONFIG_COAP_SEC_TAG,
				MODEM_KEY_MGMT_CRED_TYPE_PSK,
				client_psk,
				strlen(client_psk));
	if (err &amp;lt; 0) {
		printk(&amp;quot;Bereitstellung des PSK fehlgeschlagen: %d&amp;quot;, err);
                return err;
	}

       err = modem_key_mgmt_write(CONFIG_COAP_SEC_TAG,
				MODEM_KEY_MGMT_CRED_TYPE_IDENTITY,
				psk_id,
				strlen(psk_id));
	if (err &amp;lt; 0) {
		printk(&amp;quot;Bereitstellung der PSK-ID fehlgeschlagen: %d&amp;quot;, err);
                return err;
	}

#endif


#if defined(CONFIG_NET_SOCKETS_SOCKOPT_TLS)

        // Registrierung des Client PSKs.
	err = tls_credential_add(CONFIG_COAP_SEC_TAG,
				TLS_CREDENTIAL_PSK,
				client_psk,
				sizeof(client_psk));
	if (err &amp;lt; 0) {
		printk(&amp;quot;Fehler beim Registrieren von PSK: %d&amp;quot;, err);
                return err;
	}

        // Registrierung der Client Identit&amp;#228;t.
	err = tls_credential_add(CONFIG_COAP_SEC_TAG,
				TLS_CREDENTIAL_PSK_ID,
				psk_id,
				sizeof(psk_id));
	if (err &amp;lt; 0) {
		printk(&amp;quot;Fehler beim Registrieren von PSK ID: %d&amp;quot;, err);
                return err;
	}

#endif
       
        return 0;

        timer();
        

}

/*************************************************************************************************************/

static int server_initialisieren(void)
{

	int err;
	struct addrinfo *result;
	struct addrinfo hints = {
		.ai_family = AF_INET,
		.ai_socktype = SOCK_DGRAM
	};
	
        char ipv4_addr[NET_IPV4_ADDR_LEN];

	err = getaddrinfo(CONFIG_SERVER_ADDRESS, NULL, &amp;amp;hints, &amp;amp;result);
	if (err != 0) {
		printk(&amp;quot;ERROR: getaddrinfo fehlgeschlagen %d\n&amp;quot;, err);
		return -EIO;
	}

	if (result == NULL) {
		printk(&amp;quot;ERROR: Adresse nicht gefunden\n&amp;quot;);
		return -ENOENT;
	}

	/* IPv4 Address. */
	struct sockaddr_in *server4 = ((struct sockaddr_in *)&amp;amp;server);  // Socket-Adressstruktur f&amp;#252;r IPv4

	server4-&amp;gt;sin_addr.s_addr =
		((struct sockaddr_in *)result-&amp;gt;ai_addr)-&amp;gt;sin_addr.s_addr;
	server4-&amp;gt;sin_family = AF_INET;  // AF_INET  = IP Protokoll Version 4 (IPv4)
	server4-&amp;gt;sin_port = htons(CONFIG_SERVER_PORT);  //Schreibe Port in Netzwerk-Byte-Order in das Feld sin_port

	inet_ntop(AF_INET, &amp;amp;server4-&amp;gt;sin_addr.s_addr, ipv4_addr,
		  sizeof(ipv4_addr));  // Schreibe IP-Adresse des Servers in die sockaddr_in-Struktur


	printk(&amp;quot;IPv4 Adresse des Servers: %s\n&amp;quot;, ipv4_addr);


	/* Free the address. */
        freeaddrinfo(result);

	return 0;

        timer();
        
}

/*************************************************************************************************************/

static int server_verbinden(void)
{
	int err;

#if defined(CONFIG_NET_SOCKETS_ENABLE_DTLS) &amp;amp;&amp;amp; defined(CONFIG_NET_SOCKETS_SOCKOPT_TLS)

	sec_tag_t tls_tag_list[] = {
		CONFIG_COAP_SEC_TAG,
	};

	sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_DTLS_1_2);
	if (sock &amp;lt; 0) {
		printk(&amp;quot;Fehler beim Erstellen des CoAP/DTLS-Sockets: error %d\n&amp;quot;, errno);
                err = -errno;
		goto error;
	}

	err = setsockopt(sock, SOL_TLS, TLS_SEC_TAG_LIST,
			 tls_tag_list, sizeof(tls_tag_list)); // Socket-Sicherheits-Tag einrichten
	if (err &amp;lt; 0) {
		printk(&amp;quot;ERROR: TLS_SEC_TAG_LIST option: %d\n&amp;quot;, errno);
                err = -errno;
		goto error;
	}
        
#else
	sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
	if (sock &amp;lt; 0) {
		printk(&amp;quot;Fehler beim Erstellen des CoAP-Sockets: error %d\n&amp;quot;, errno);
                err = -errno;
		goto error;
	}
#endif

        ui_led_set_pattern(UI_CLOUD_CONNECTING); // Led 4 blinkt zum Signalisieren der Verbindungsherstellung zum Server

	err = connect(sock, (struct sockaddr *)&amp;amp;server,
		      sizeof(struct sockaddr_in)); // Verbindung zum Server herstellen

        // err=0 =&amp;gt; success, err&amp;lt;0 =&amp;gt; fehler
	if (err &amp;lt; 0) {
		printk(&amp;quot;Verbindung fehlgeschlagen: error %d\n&amp;quot;, errno);
                err = -errno;
		goto error;
	}

        ui_led_set_pattern(UI_CLOUD_CONNECTED);  // Led 4 leuchtet zum Signalisieren der Verbindung zum Server 

        /* Initialize FDS, for poll. */
	fds.fd = sock;
	fds.events = POLLIN;

	/* Randomize token. */
	next_token = sys_rand32_get();

	return 0;
        
        timer();
        

error:
	(void)close(sock); // beende die Verbindung zum Socket 

	return err;
}

/*************************************************************************************************************/

//int coap_ping(void)
//{
//	int err;
//	struct coap_packet ping;

//	next_token = 0;

//	err = coap_packet_init(&amp;amp;ping, data, sizeof(data),
//			       APP_COAP_VERSION, COAP_TYPE_CON,
//			       0, NULL, 0, coap_next_id());
//	if (err &amp;lt; 0) {
//		printk(&amp;quot;Failed to create CoAP request, %d\n&amp;quot;, err);
//		return err;
//	}

//	err = send(sock, ping.data, ping.offset, 0);
//	if (err &amp;lt; 0) {
//		printk(&amp;quot;Failed to send CoAP PING, %d\n&amp;quot;, errno);
//		return -errno;
//	}

//	printk(&amp;quot;CoAP PING sent: token 0x%04x\n&amp;quot;, next_token);

//	return 0;
//}

/*************************************************************************************************************/

static int uebertragung_zu_server_fn(void)
{
	int err;

        struct coap_packet request; // Anfragepaket

        cJSON *root = createJsonFromParams();  /* Gibt Payload an */

      
	char *payload = cJSON_Print(root);
	if (payload == NULL) {
		printk(&amp;quot;ERROR print...\n&amp;quot;);
	}

        printk(&amp;quot;Payload von %d bytes wird an den Californium Server zugeschickt\n&amp;quot;, strlen(payload));
       
        next_token++;

        // Initialisiere CoAP Anfrage
        err = coap_packet_init(&amp;amp;request, data, sizeof(data),
			       APP_COAP_VERSION, COAP_TYPE_NON_CON,
			       sizeof(next_token),(uint8_t *)&amp;amp;next_token,
                               COAP_METHOD_PUT, coap_next_id());

	if (err &amp;lt; 0) {
		printk(&amp;quot;CoAP-Anfrage konnte nicht erstellt werden, error %d\n&amp;quot;, err);
		return err;
	}

        // F&amp;#252;gt eine Option URI-path an das Paket an
	coap_packet_append_option(&amp;amp;request, COAP_OPTION_URI_PATH,
                                  (uint8_t *)CONFIG_COAP_RESOURCE, 
                                  strlen(CONFIG_COAP_RESOURCE));

       // F&amp;#252;gt eine content-format-option with the value JSON an das Paket an
        coap_append_option_int(&amp;amp;request,
                                COAP_OPTION_CONTENT_FORMAT,
                                  COAP_CONTENT_FORMAT_APP_JSON);

        // Payload-Marker an CoAP-Paket anh&amp;#228;ngen
        coap_packet_append_payload_marker(&amp;amp;request);

        // Payload an CoAP-Paket anh&amp;#228;ngen
        err=coap_packet_append_payload(&amp;amp;request, (uint8_t *)payload, strlen(payload));
        if (err &amp;lt; 0) {
		printk(&amp;quot;Payload konnte nicht angeh&amp;#228;ngt werden, %d\n&amp;quot;, err);
		return err;
	}           
        
        free(payload);

	/* free all objects under root and root itself */
        cJSON_Delete(root);

	err = send(sock, request.data, request.offset, 0); // Daten werden an den Port 5684 gesendet
	if (err &amp;lt; 0) {
		printk(&amp;quot;Paket konnte nicht &amp;#252;bertragen werden,error %d\n&amp;quot;, errno);
		return -errno;
	}

        printk(&amp;quot;CoAP Anfrage gesendet: token 0x%04x\n&amp;quot;, next_token);

        return 0;

        timer();
        

}

/*************************************************************************************************************/

// Ein Semaphore ist ein Kernel-Objekt, das ein traditionelles Z&amp;#228;hlsemaphor implementiert.
// Ein Semaphor wird verwendet, um den Zugriff auf eine Reihe von Ressourcen durch mehrere
// Threads zu steuern und um die Verarbeitung zwischen einem produzierenden und einem 
// verbrauchenden Thread oder Interrupt Service Routine (ISRs) zu synchronisieren.

static K_SEM_DEFINE(lte_verbunden, 0, 1); // Semaphore statisch definiert und initialisiert. 
                                          // lte_verbunden = Name des Semaphores. 0 = anf&amp;#228;ngliche Semaphorez&amp;#228;hlung 
                                          // 1 = maximal zul&amp;#228;ssige Semaphoranzahl.

static void lte_handler(const struct lte_lc_evt *const evt)
{
	switch (evt-&amp;gt;type) {
	case LTE_LC_EVT_NW_REG_STATUS: // emfangenes Ereignis mit Informationen zum Netwerkregistrierungsstatus
                                       // des Modems
		if ((evt-&amp;gt;nw_reg_status != LTE_LC_NW_REG_REGISTERED_HOME) &amp;amp;&amp;amp;
		     (evt-&amp;gt;nw_reg_status != LTE_LC_NW_REG_REGISTERED_ROAMING)) {
			break;
		}
                  
		printk(&amp;quot;Netwerkregistrierungsstatus: %s&amp;quot;,
			evt-&amp;gt;nw_reg_status == LTE_LC_NW_REG_REGISTERED_HOME ?
			&amp;quot;verbunden mit Heimnetwerk\n&amp;quot; : &amp;quot;verbunden mit Roaming\n&amp;quot;);

		k_sem_give(&amp;amp;lte_verbunden); // Gib ein Semaphor an. Setzte die Z&amp;#228;hlung von lte_verbunden auf Null 
                                            // &amp;amp;lte_verbunden= Adresse des Semapores

                timer();
                
                  
                break;                      


	case LTE_LC_EVT_PSM_UPDATE: // empfangenes Ereignis mit Informationen zu PSM-Updates. Die Updates enthalten 
                                    //  PSM-Parameter, die vom Netwerk vorgeben wurden.

                // Das zugeh&amp;#246;rige Payload ist das Mitglied psm_cfg vom Typ lte_lc_psm_cfg in dem Library lte.lc.h
                // tau = Periodisches Aktualisierungsintervall des Tracking-Bereichs.
                // active_time = Aktiv-Zeit (Zeit von RRC Leerlauf bis PSM)
		printk(&amp;quot;PSM-Parameter update: TAU: %d, Active time: %d\n&amp;quot;,
			evt-&amp;gt;psm_cfg.tau, evt-&amp;gt;psm_cfg.active_time);
		break;

	case LTE_LC_EVT_EDRX_UPDATE:{// empfangenes Ereignis mit Informationen zu eDRX-Updates. Die Updates enthalten 
                                    //  eDRX-Parameter, die vom Netwerk vorgeben wurden.

                // Das zugeh&amp;#246;rige Payload ist das Mitglied edrx_cfg vom Typ lte_lc_edrx_cfg in dem Library lte.lc.h
                // edrx = eDRX-Intervallwert [s]
                // ptw = Paging-Zeitfenster [s]
		char log_buf[60];
		ssize_t len;

		len = snprintf(log_buf, sizeof(log_buf),
			       &amp;quot;eDRX parameter update: eDRX: %f, PTW: %f\n&amp;quot;,
			       evt-&amp;gt;edrx_cfg.edrx, evt-&amp;gt;edrx_cfg.ptw);
		if (len &amp;gt; 0) {
			printk(&amp;quot;%s\n&amp;quot;, log_buf);
		}
		break;
         }

	case LTE_LC_EVT_RRC_UPDATE: // empfangenes Ereignis mit Informationen &amp;#252;ber den 
                                    // Radio Ressource Control(RRC)-Status des Modems
                
                // Das zugeh&amp;#246;rige Payload ist das Mitglied rrc_mode vom Typ lte_lc_rrc_mode in dem Library lte.lc.h
                // RRC Modus ist entweder verbunden oder idle.
		printk(&amp;quot;RRC Modus: %s&amp;quot;,
			evt-&amp;gt;rrc_mode == LTE_LC_RRC_MODE_CONNECTED ?
			&amp;quot;verbunden\n&amp;quot; : &amp;quot;Idle\n&amp;quot;);
               
                timer();
                

		break;

	case LTE_LC_EVT_CELL_UPDATE: // empfangenes Ereignis mit Informationen &amp;#252;ber die aktuell verbundene Zelle

                // Das zugeh&amp;#246;rige Payload ist das Mitglied Cell vom Typ lte_lc_cell in dem Library lte.lc.h
                // id = Mobilfunkzellenidentifikation
                // tac = Tracking area code
		printk(&amp;quot;LTE ver&amp;#228;nderte Zelle: Zelle ID: %d, Tracking area: %d\n&amp;quot;,
			evt-&amp;gt;cell.id, evt-&amp;gt;cell.tac);
		break;

	case LTE_LC_EVT_LTE_MODE_UPDATE: // Wenn ein Systemmodus konfiguiert ist,der entweder LTE-M oder NB-IoT
                                         // aktiviert, kann das Modem den aktuell aktiven LTE-Modus basierend auf
                                         // der Netwerkverf&amp;#252;gbarkeit &amp;#228;ndern. Dieses Ereignis zeigt dann an, welcher
                                         // LTE-Modus derzeit vom Modem verwendet wird.

		printk(&amp;quot;Active LTE Modus: %s&amp;quot;,
			evt-&amp;gt;lte_mode == LTE_LC_LTE_MODE_NONE ? &amp;quot;None\n&amp;quot; :
			evt-&amp;gt;lte_mode == LTE_LC_LTE_MODE_LTEM ? &amp;quot;LTE-M\n&amp;quot; :
			evt-&amp;gt;lte_mode == LTE_LC_LTE_MODE_NBIOT ? &amp;quot;NB-IoT\n&amp;quot; :
			&amp;quot;Unknown\n&amp;quot;);

                timer();
                

		break;
	default:
		break;
	}
}

/*************************************************************************************************************/

static void modem_konfigurieren(void)
{
#if defined(CONFIG_NRF_MODEM_LIB) // CONFIG_NRF_MODEM_LIB = verwende Nordic Modem Library
	if (IS_ENABLED(CONFIG_LTE_AUTO_INIT_AND_CONNECT)) { 
                  // CONFIG_LTE_AUTO_INIT_AND_CONNECT = automatische Registrierung bei LTE-M oder NB-IoT
		  // passiert nichts, falls der Modem bereits konfiguriert und LTE verbunden ist.

	} else {

		int err; // integer f&amp;#252;r errors

#if defined(CONFIG_PSM_ENABLE) // CONFIG_PSM_ENABLE fordert PSM vom Modbilfunknetz an.

		/* Das Anfordern von PSM vor der Verbindung erm&amp;#246;glicht es dem Modem, das
		 * Netwerk bereits w&amp;#228;hrend des Verbindungsvorgangs &amp;#252;ber unseren Wunsch
		 * nach einer bestimmten PSM-Konfiguration zu informieren, anstatt in 
		 * einer separaten Anfrage nach der Verbindungsherstellung, die in einigen
		 * Netzwerken abgelehnt werden kann */
		
		err = lte_lc_psm_req(true); // Anfordern des Modems, das Power saving mode zu aktivieren
		if (err &amp;lt; 0) {
                         // Falls err= negativ =&amp;gt;  Fehler aufgetreten

			printk(&amp;quot;Power Saving Mode wurde nicht aktiviert, error: %d\n&amp;quot;,
				err);
		} else{
                      // falls err=0  =&amp;gt; das Anfordern war erfolgreich

                      printk(&amp;quot;PSM-Modus aktiviert\n\n&amp;quot;);
                }
#endif

#if defined(CONFIG_EDRX_ENABLE) // CONFIG_EDRX_ENABLE fordert eDRX vom Modbilfunknetz an.

	/** Extended Discontinuous Reception (eDRX) erm&amp;#246;glicht es das Sleep mode
            in RRC idle mode auf Minuten oder Stunden zu verl&amp;#228;ngern, was noch deutlichere
            Einsparungen beim Energieverbrauch bietet*/

	err = lte_lc_edrx_req(true); // eDRX wird aktiviert
	if (err&amp;lt;0) {
		printk(&amp;quot;eDRX wurde nicht aktiviert, error: %d\n&amp;quot;, err);
	}else {
		printk(&amp;quot;eDRX aktiviert\n&amp;quot;);
	}
#endif


                ui_led_set_pattern(UI_LTE_CONNECTING); // LED3 blinkt, um der Verbindungsherstellungsvorgang 
                                                      // zu signalisieren.
		printk(&amp;quot;Verbindung zum LTE-Netz wird hergestellt\n&amp;quot;);
		printk(&amp;quot;Das kann ein paar Minuten dauern..\n&amp;quot;);
		
                // lte_lc_init_and_connect_async initialisiert das LTE-Modul, 
                // konfiguriert das Modem und verbindet sich mit dem LTE-Netzwerk.
                // lte_lc_init_and_connect_async &amp;#252;berpr&amp;#252;ft zus&amp;#228;tzlich die LTE-Ereignisse
                // vom Typ LTE_LC_EVT_NW_REG_STATUS in lte_handler(), um festzustellen, wann
                // die LTE-Verbindung besteht.

		err = lte_lc_init_and_connect_async(lte_handler);
		if (err) {
                // err= negativ =&amp;gt; Fehler aufgetreten

			printk(&amp;quot;Modem konnte nicht konfiguriert werden, error: %d\n&amp;quot;,
				err);
			return;
		}
                // err=0 =&amp;gt; besteht LTE-Verbindung 

                printk(&amp;quot;Mit LTE-Netz verbunden\n&amp;quot;);
		ui_led_set_pattern(UI_LTE_CONNECTED); // LED3 leuchtet, um das Bestehen der Verbindung vorzugeben.

                timer();
                

	}
#endif
}

/*************************************************************************************************************/
/* Gibt 0 zur&amp;#252;ck, wenn Daten verf&amp;#252;gbar sind.
 * Gibt -EAGAIN zur&amp;#252;ck, wenn eine Zeit&amp;#252;berschreitung aufgetreten ist und keine Daten geschickt sind.
 * Gibt im Falle eines Poll-Fehlers einen anderen, negativen Fehlercode zur&amp;#252;ck.
 */
static int wait(int timeout)
{
	int ret = poll(&amp;amp;fds, 1, timeout);

	if (ret &amp;lt; 0) {
		printk(&amp;quot;poll error: %d\n&amp;quot;, errno);
		return -errno;
	}

	if (ret == 0) {
		/* Timeout. */
		return -EAGAIN;
	}

	if ((fds.revents &amp;amp; POLLERR) == POLLERR) {
		printk(&amp;quot;warte: POLLERR\n&amp;quot;);
		return -EIO;
	}

	if ((fds.revents &amp;amp; POLLNVAL) == POLLNVAL) {
		printk(&amp;quot;warte: POLLNVAL\n&amp;quot;);
		return -EBADF;
	}

	if ((fds.revents &amp;amp; POLLIN) != POLLIN) {
		return -EAGAIN;
	}

	return 0;
}

/*************************************************************************************************************/

void main(void)
{
        cJSON_Init();
        
        int64_t next_msg_time = CONFIG_DATA_UPLOAD_FREQUENCY_MS;
	int err;

	printk(&amp;quot; Coap/dtls startet.....\n&amp;quot;);

        // DTLS wird initialisiert
        err = dtls_init();
        if (err&amp;lt;0) {
          printk(&amp;quot;DTLS Init Error: %d\n&amp;quot;, err);
        }else{
          printk(&amp;quot;Sicherheitsanmeldeinformationen im Modem bereitgestellt \n&amp;quot;);
        };

        // Initialisiere das Benutzeroberfl&amp;#228;chenmodul
        ui_init(ui_evt_handler);

        // Modem wird konfiguriert
#if defined(CONFIG_NRF_MODEM_LIB)
             
	modem_konfigurieren();

	k_sem_take(&amp;amp;lte_verbunden, K_FOREVER);
#endif

      next_msg_time = k_uptime_get();

        // Verbindungsaufbau zu dem Server
	err = server_initialisieren();
	if (err) {
		printk(&amp;quot;Serververbindung kann nicht initialisiert werden\n&amp;quot;);
		return;
	}
        
        // DTLS Handshake + Verbindung zum Server herstellen
	err = server_verbinden();
	if (err) {
		printk(&amp;quot;Keine Verbindung zum Server m&amp;#246;glich\n&amp;quot;);
		return;
	}

while (1) {

		if (k_uptime_get() &amp;gt;= next_msg_time) {
                        
			if (uebertragung_zu_server_fn()!= 0) {
				printk(&amp;quot;Fehler beim Senden der Anfrage, exit...\n&amp;quot;);
				break;
			}

			next_msg_time += CONFIG_DATA_UPLOAD_FREQUENCY_MS;
		}

		int64_t remaining = next_msg_time - k_uptime_get();

		if (remaining &amp;lt; 0) {
			remaining = 0;
		}

		err = wait(remaining);
		if (err &amp;lt; 0) {
			if (err == -EAGAIN) {
				continue;
			}

			printk(&amp;quot;Poll error, exit...\n&amp;quot;);
			break;
		}

                
	}

}
&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;I set the timer() at the position where i want a delay to be able to know when and what is coming as next.&lt;/p&gt;
&lt;p&gt;Any idea, if actually that which i am doing the best approach is? What do you think?&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Best regards,&lt;/p&gt;
&lt;p&gt;Cedric&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How can i set a timer in my project?</title><link>https://devzone.nordicsemi.com/thread/338236?ContentTypeID=1</link><pubDate>Tue, 09 Nov 2021 15:12:38 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:1abebc78-4099-456a-b76d-424007606883</guid><dc:creator>ced27</dc:creator><description>&lt;p&gt;Hi @Simon,&lt;/p&gt;
&lt;p&gt;Thanks your very much.&lt;/p&gt;
&lt;p&gt;BR,&lt;/p&gt;
&lt;p&gt;Cedric&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: How can i set a timer in my project?</title><link>https://devzone.nordicsemi.com/thread/338231?ContentTypeID=1</link><pubDate>Tue, 09 Nov 2021 14:55:53 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:03ab1c43-426c-4a42-853b-90c69622e494</guid><dc:creator>Simon</dc:creator><description>&lt;p&gt;I tested your sample and was able to make it work&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Extract the following project to ncs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://devzone.nordicsemi.com/cfs-file/__key/communityserver-discussions-components-files/4/simple_5F00_timer.zip"&gt;devzone.nordicsemi.com/.../simple_5F00_timer.zip&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Build it with the board nrf9160dk_nrf9160_ns&lt;/li&gt;
&lt;li&gt;Open a serial terminal and you will see the following output:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;.
.
.
.
26 NRF_I2S              Non-Secure	OK
27 NRF_GPIOTE1          Non-Secure	OK

SPM: NS image at 0x10000
SPM: NS MSP at 0x200159a0
SPM: NS reset vector at 0x12379
SPM: prepare to jump to Non-Secure image.
*** Booting Zephyr OS build v2.6.99-ncs1  ***
[00:00:00.205,627] [1B][0m&amp;lt;inf&amp;gt; asset_tracker: Timer sample started[1B][0m
[00:00:01.205,688] [1B][0m&amp;lt;inf&amp;gt; asset_tracker: Expiry function is running[1B][0m
[00:00:02.205,718] [1B][0m&amp;lt;inf&amp;gt; asset_tracker: Expiry function is running[1B][0m
[00:00:03.205,688] [1B][0m&amp;lt;inf&amp;gt; asset_tracker: Expiry function is running[1B][0m
[00:00:04.205,749] [1B][0m&amp;lt;inf&amp;gt; asset_tracker: Expiry function is running[1B][0m
[00:00:05.205,688] [1B][0m&amp;lt;inf&amp;gt; asset_tracker: Expiry function is running[1B][0m
[00:00:06.205,718] [1B][0m&amp;lt;inf&amp;gt; asset_tracker: Expiry function is running[1B][0m
[00:00:07.205,688] [1B][0m&amp;lt;inf&amp;gt; asset_tracker: Expiry function is running[1B][0m&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Best regards,&lt;/p&gt;
&lt;p&gt;Simon&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>