1 // **********************************************************************************
    2 //   Custom DPA Handler code example - Reading by FRC                               *
    3 // **********************************************************************************
    4 // Copyright (c) MICRORISC s.r.o.
    5 //
    6 // File:    $RCSfile: CustomDpaHandler-Coordinator-FRCandSleep.c,v $
    7 // Version: $Revision: 1.25 $
    8 // Date:    $Date: 2021/04/26 15:13:50 $
    9 //
   10 // Revision history:
   11 //   2017/03/13  Release for DPA 3.00
   12 //   2015/08/05  Release for DPA 2.20
   13 //   2014/10/31  Release for DPA 2.10
   14 //
   15 // **********************************************************************************
   16 
   17 // Online DPA documentation https://doc.iqrf.org/DpaTechGuide/
   18 
   19 // Default IQRF include (modify the path according to your setup)
   20 #include "IQRF.h"
   21 
   22 // Implement Custom DPA Handler for Coordinator
   23 #define COORDINATOR_CUSTOM_HANDLER
   24 
   25 // Default DPA header (modify the path according to your setup)
   26 #include "DPA.h"
   27 // Default Custom DPA Handler header (modify the path according to your setup)
   28 #include "DPAcustomHandler.h"
   29 
   30 // Application periodically sends a FRC request 0x81 and waits till nodes wake up from sleep
   31 // Result is send to the Interface master
   32 
   33 // Sleep time between FRC requests, unit is 2.097
   34 #define SLEEP_TIME  5
   35 
   36 // Calculation of the 10ms measurements from the C point of view, add 5% gap
   37 #define SleepIn10msPlusGap  ( ( ( (uns24)SLEEP_TIME ) * ( 2097 * 1.05 ) ) / 10 )
   38 
   39 #if SleepIn10msPlusGap >= 0x8000
   40 #error Too long sleep time to be measured by DpaTicks. 
   41 #error Maximum time is 312 s.
   42 #endif
   43 
   44 // Must be the 1st defined function in the source code in order to be placed at the correct FLASH location!
   45 //############################################################################################
   46 bit CustomDpaHandler()
   47 //############################################################################################
   48 {
   49   // Handler presence mark
   50   clrwdt();
   51 
   52   // Detect DPA event to handle
   53   switch ( GetDpaEvent() )
   54   {
   55     // -------------------------------------------------
   56     case DpaEvent_Init:
   57 
   58       // Give GSM GW time to start SPI master
   59       waitDelay( 100 );
   60 
   61       break;
   62 
   63       // -------------------------------------------------
   64     case DpaEvent_Idle:
   65       // Do a quick background work when RF packet is not received
   66 
   67       // Time undercount?
   68       if ( DpaTicks.15 == 1 )
   69       {
   70         pulseLEDG();
   71         // Use FRC peripheral
   72         _PNUM = PNUM_FRC;
   73         // Run FRC
   74         _PCMD = CMD_FRC_SEND;
   75         // FRC = FRC_AcknowledgedBroadcastBytes
   76         _DpaMessage.PerFrcSend_Request.FrcCommand = FRC_AcknowledgedBroadcastBytes;
   77         // Length of DPA Request
   78         // DPA request length
   79         _DpaMessage.PerFrcSend_Request.UserData[0] = 8;
   80         // OS_SLEEP request
   81         _DpaMessage.PerFrcSend_Request.UserData[1] = PNUM_OS;
   82         _DpaMessage.PerFrcSend_Request.UserData[2] = CMD_OS_SLEEP;
   83         // Any HWPID
   84         _DpaMessage.PerFrcSend_Request.UserData[3] = ( HWPID_DoNotCheck >> 0 ) & 0xFF;
   85         _DpaMessage.PerFrcSend_Request.UserData[4] = ( HWPID_DoNotCheck >> 8 ) & 0xFF;
   86         // Sleep time
   87         _DpaMessage.PerFrcSend_Request.UserData[5] = ( SLEEP_TIME >> 0 ) & 0xFF;;
   88         _DpaMessage.PerFrcSend_Request.UserData[6] = ( SLEEP_TIME >> 8 ) & 0xFF;
   89         // LEDG pulse ofter wake up
   90         _DpaMessage.PerFrcSend_Request.UserData[7] = 0b0.0100;
   91         // Total length of data
   92         _DpaDataLength = 8 + sizeof( _DpaMessage.PerFrcSend_Request.FrcCommand );
   93         // Run FRC
   94         DpaApiLocalRequest();
   95         // Send to IFace master
   96         _NADR = COORDINATOR_ADDRESS;
   97         _NADRhigh = 0;
   98         DpaApiSendToIFaceMaster( 0, 0 );
   99 
  100         // Use FRC peripheral
  101         _PNUM = PNUM_FRC;
  102         // Run FRC extra result
  103         _PCMD = CMD_FRC_EXTRARESULT;
  104         // Total length of data
  105         _DpaDataLength = 0;
  106         // Run FRC extra result
  107         DpaApiLocalRequest();
  108         // Send to IFace master
  109         _NADR = COORDINATOR_ADDRESS;
  110         _NADRhigh = 0;
  111         DpaApiSendToIFaceMaster( 0, 0 );
  112 
  113         pulseLEDR();
  114 
  115         // Disable interrupts to make sure 16b variable DpaTicks access is atomic
  116         GIE = FALSE;
  117         // Setup "timer" for sleep time, unit is 10ms, add 5% safe gap
  118         DpaTicks = (uns16)SleepIn10msPlusGap;
  119         GIE = TRUE;
  120       }
  121       break;
  122   }
  123 
  124   return FALSE;
  125 }
  126 
  127 //############################################################################################
  128 // Default Custom DPA Handler header; 2nd include to implement Code bumper to detect too long code of the Custom DPA Handler (modify the path according to your setup) 
  129 #include "DPAcustomHandler.h"
  130 //############################################################################################