00001 /****************************************************************** 00002 * File: rtlnml.h 00003 * 00004 * Introduction: 00005 * This file creates an interface to NML that can be used by both 00006 * real-time and non-realtime C linux applications. It will be also used 00007 * by the C++ wrapper that makes these messages available to any NML 00008 * application. 00009 * 00010 * Modifications: 00011 31-May-2001 WPS modified to work with rtai as well. 00012 16-Mar-2000 WPS created. 00013 ********************************************************************/ 00014 00015 #ifndef RTLNML_H 00016 #define RTLNML_H 00017 00018 #ifdef __cplusplus 00019 extern "C" 00020 { 00021 #endif 00022 00023 #ifndef RTLNML_TYPEDEFED 00024 typedef void *rtlnml_t; /* This will be redefined in rtlnml.c but is opaque to 00025 the rest of the world. */ 00026 typedef rtlnml_t rtainml_t; 00027 #endif 00028 00029 /* All applications should call this before any other rtlnml functions. */ 00030 /* In rtlinux, call this only from init_module, never from an RT task 00031 function. */ 00032 extern void rtlnml_init (void); 00033 00034 #if !defined(rtai) && !defined(HAVE_RTAI) 00035 /* This fuction is used to create each channel. */ 00036 /* In rtlinux, call this only from init_module, never from an RT task 00037 function. */ 00038 extern rtlnml_t rtlnml_open (const char *name, /* buffer name */ 00039 const char *processname, /* process name (not used) */ 00040 const char *filename, /* configuration file (not used) */ 00041 unsigned long size, /* Maximum size of message for buffer, (actual buffer is slightly larger). */ 00042 int master); 00043 #else 00044 /* This fuction is used to create each channel. */ 00045 /* In rtai, call this only from init_module, never from an RT task 00046 function. 00047 This function is identical to rtlnml_open() except that a 00048 integer key has been added. The name is not used as a key. 00049 */ 00050 extern rtainml_t rtainml_open (const char *name, /* buffer name */ 00051 const char *processname, /* process name (not used) */ 00052 const char *filename, /* configuration file (not used) */ 00053 unsigned long size, /* Maximum size of message for buffer, (actual buffer is slightly larger). */ 00054 int master, int key); 00055 #endif 00056 00057 00058 /* These functions get and release 00059 a direct pointer to the shared memory area. 00060 If a read occurs while the 00061 writer has direct access to the shared memory a split-buffer error will 00062 occur then either rtlnml_get_direct_pointer_for_read, 00063 rtlnml_release_direct_pointer_for_read or rtlnml_read will return 00064 RTLNML_SPLIT_READ 00065 So the pointer should be released as soon as possible. 00066 Returns: 00067 See RTLNML_SPECIAL_READ_RETURN_VALUES. 00068 */ 00069 extern int rtlnml_get_direct_pointer_for_read (rtlnml_t, void **); 00070 extern int rtlnml_release_direct_pointer_for_read (rtlnml_t, void **); 00071 00072 extern int rtlnml_get_direct_pointer_for_write (rtlnml_t, void **); 00073 extern int rtlnml_release_direct_pointer_for_write (rtlnml_t, void **, 00074 long msg_type, 00075 unsigned long msg_size); 00076 00077 /* Reads from the buffer, possibly copying the contents to the location 00078 that can be obtained with rtlnml_get_local_pointer. This is 00079 safer and more flexible than using direct pointers but possibly 00080 slower. 00081 Returns: 00082 >0 -- NML message type of new NML message succesfully retrieved. 00083 otherwise -- See RTLNML_SPECIAL_READ_RETURN_VALUES. 00084 */ 00085 extern long rtlnml_read (rtlnml_t); 00086 00087 00088 /* Writes to the buffer, copying the contents from the location given. 00089 This is safer and more flexible than using direct pointers but possibly 00090 slower. 00091 Return: 00092 See RTLNML_SPECIAL_WRITE_RETURN_VALUES. 00093 */ 00094 extern long rtlnml_write (rtlnml_t, void *data, /* address of data to be copied into nml buffer. */ 00095 long msg_type, /* NML message type. */ 00096 unsigned long); /* size of message */ 00097 00098 /* This function should be called after a successful rtlnml_read to 00099 get a pointer to a local copy of the message. */ 00100 extern void *rtlnml_get_local_pointer (rtlnml_t); 00101 00102 /* Use only if you want rtlnml_read to copy data to a special location. 00103 In rtlinux, this should only be done from within init_module never, 00104 never from within a RT task function. 00105 */ 00106 extern void rtlnml_set_local_pointer (rtlnml_t, void *); 00107 00108 /* Close each channel. */ 00109 extern void rtlnml_close (rtlnml_t, const char *bufname); 00110 00111 /* This function should be called after all other rtlnml functions. */ 00112 /* In rtlinux call this only from cleanup_module, never from an RT task function. */ 00113 extern void rtlnml_exit (void); 00114 00115 enum RTLNML_SPECIAL_READ_RETURN_VALUES 00116 { 00117 RTLNML_READ_OLD = 0, 00118 RTLNML_READ_ERROR = -1, 00119 RTLNML_SPLIT_READ_ERROR = -2 00120 }; 00121 00122 enum RTLNML_SPECIAL_WRITE_RETURN_VALUES 00123 { 00124 RTLNML_WRITE_ERROR = -1, 00125 RTLNML_WRITE_OK = 0 00126 }; 00127 00128 00129 #ifdef __cplusplus 00130 } 00131 #endif 00132 00133 00134 #endif