From 4a6850e522b91eb009ddd0ed9d9f542f1baf1bee Mon Sep 17 00:00:00 2001
From: Jonas Karlsson <jonas.karlsson@enea.com>
Date: Fri, 21 Feb 2014 14:01:38 +0100
Subject: ose: Updating event and signal API for OSE

---
 lib/ose/doc/src/ose_erl_driver.xml      |  9 +++++----
 lib/ose/doc/src/ose_signals_chapter.xml | 23 +++++++++++++++++++++--
 2 files changed, 26 insertions(+), 6 deletions(-)

(limited to 'lib/ose')

diff --git a/lib/ose/doc/src/ose_erl_driver.xml b/lib/ose/doc/src/ose_erl_driver.xml
index 93cbd91be7..1d89d7aeea 100644
--- a/lib/ose/doc/src/ose_erl_driver.xml
+++ b/lib/ose/doc/src/ose_erl_driver.xml
@@ -68,12 +68,13 @@
       </desc>
     </func>
     <func>
-      <name><ret>ErlDrvEvent</ret><nametext>erl_drv_ose_event_alloc(SIGSELECT signo, ErlDrvOseEventId id, ErlDrvOseEventId (*resolve_signal)(union SIGNAL* sig))</nametext></name>
+      <name><ret>ErlDrvEvent</ret><nametext>erl_drv_ose_event_alloc(SIGSELECT signo, ErlDrvOseEventId id, ErlDrvOseEventId (*resolve_signal)(union SIGNAL* sig), void *extra)</nametext></name>
       <desc>
         <marker id="erl_drv_ose_event_alloc"></marker>
         <p>Create a new <c>ErlDrvEvent</c> associated with <c>signo</c>,
 	<c>id</c> and uses the <c>resolve_signal</c> function to extract
-	the <c>id</c> from a signal with <c>signo</c>. See
+	the <c>id</c> from a signal with <c>signo</c>. The <c>extra</c>
+	parameter can be used for additional data. See
 	<seealso marker="ose_signals_chapter#driver">
 	Signals in a Linked-in driver</seealso> in the OSE User's Guide.
       </p>
@@ -89,10 +90,10 @@
       </desc>
     </func>
     <func>
-      <name><ret>void</ret><nametext>erl_drv_ose_event_fetch(ErlDrvEvent drv_event, SIGSELECT *signo, int *id)</nametext></name>
+      <name><ret>void</ret><nametext>erl_drv_ose_event_fetch(ErlDrvEvent drv_event, SIGSELECT *signo, ErlDrvOseEventId *id, void **extra)</nametext></name>
       <desc>
         <marker id="erl_drv_ose_event_fetch"></marker>
-        <p>Write the signal number and id associated with <c>drv_event</c>
+        <p>Write the signal number, id and any extra data associated with <c>drv_event</c>
 	into <c>*signo</c> and <c>*id</c> respectively. <c>NULL</c> can be
 	also passed as <c>signo</c> or <c>id</c> in order to ignore that field.
 	</p>
diff --git a/lib/ose/doc/src/ose_signals_chapter.xml b/lib/ose/doc/src/ose_signals_chapter.xml
index 85849e1a39..c8d98f4099 100644
--- a/lib/ose/doc/src/ose_signals_chapter.xml
+++ b/lib/ose/doc/src/ose_signals_chapter.xml
@@ -77,7 +77,12 @@
       in this case the port id that we got in the
       <seealso marker="erts:driver_entry#start">start</seealso> callback is
       used. The third argument is a function pointer to a function that can
-      be used to figure out the id from a given signal. There is a complete
+      be used to figure out the id from a given signal. The fourth argument can
+      point to any additional data you might want to associate with the event.
+      There is a complete. You can examine the data contained in the event with
+      <seealso marker="ose_erl_driver#erl_drv_ose_event_fetch">erl_drv_ose_event_fetch</seealso>
+      , eg:
+      <code>erl_drv_ose_event_fetch(event, &amp;signal, &amp;port, (void **)&amp;extra);</code>
       example of what this could look like in
       <seealso marker="#example">the next section</seealso>.
       <note>It is very important to issue the driver_select call before
@@ -132,8 +137,12 @@ static ErlDrvSSizeT control(ErlDrvData driver_data, unsigned int cmd,
                             char **rbuf, ErlDrvSizeT rlen) {
   ErlDrvPort port = (ErlDrvPort)driver_data;
 
+  /* An example of extra data to associate with the event */
+  char *extra_data = driver_alloc(80);
+  snprintf("extra_data, "Event, sig_no: 1234, and port: %d", port);
+
   /* Create a new event to select on */
-  ErlDrvOseEvent evt = erl_drv_ose_event_alloc(1234,port,resolver);
+  ErlDrvOseEvent evt = erl_drv_ose_event_alloc(1234,port,resolver, extra_data);
 
   /* Make sure to do the select call _BEFORE_ the signal arrives.
      The signal might get lost if the hunt call is done before the
@@ -147,11 +156,16 @@ static ErlDrvSSizeT control(ErlDrvData driver_data, unsigned int cmd,
 }
 
 static void ready_input(ErlDrvData driver_data, ErlDrvEvent evt) {
+  char *extra_data;
   /* Get the first signal payload from the event */
   union SIGNAL *sig = erl_drv_ose_get_signal(evt);
   ErlDrvPort port = (ErlDrvPort)driver_data;
   while (sig != NULL) {
     if (sig->signo == 1234) {
+      /* Print out the string we added as the extra parameter */
+      erl_drv_ose_event_fetch(evt, NULL, NULL, (void **)&amp;extra_data);
+      printf("We've received: %s\n", extra_data);
+
       /* If it is our signal we send a message with the sender of the signal
          to the controlling erlang process */
       ErlDrvTermData reply[] = { ERL_DRV_UINT, (ErlDrvUInt)sender(&amp;sig) };
@@ -172,6 +186,11 @@ static void ready_input(ErlDrvData driver_data, ErlDrvEvent evt) {
 
 static void stop_select(ErlDrvEvent event, void *reserved)
 {
+  /* Free the extra_data */
+  erl_drv_ose_event_fetch(evt, NULL, NULL, (void **)&amp;extra_data);
+  driver_free(extra_data);
+
+  /* Free the event itself */
   erl_drv_ose_event_free(event);
 }
 
-- 
cgit v1.2.3