The present disclosure relates generally to methods and systems for journaling and accessing sensor and configuration data.
Collection and processing of sensor readings and other data in typical limited resource systems presents a number of significant implementation problems. Typical limited resource systems have limited memory and processing capabilities. Often, data is collected and produced during interrupt processing on the system, and is subject to very rapid change. In many cases, the timeliness of these changes is critical, and the duration of significant changes may be very short (milliseconds are not uncommon). As a result, a number of serious design problems emerge in such systems for collecting and processing data.
For example, typical systems often have difficulty quickly and efficiently reporting new sensor readings to collection systems. In addition, typical systems are often unable to prevent short-term (millisecond range) updates, which may be significant, from being “missed” by processing code, such as code for implementing value thresholds, or for reporting value updates across a network. Furthermore, certain typical systems are unable to allow “slow running” code, such as notification routines for sending data through e-mail or FTP, to view data in a “stable” state, so that a set of related values can be reported or processed in a consistent state (“temporal integrity”). Also, these systems often have difficulty delivering multiple data values consistently to collection systems, so that processing code does not observe temporary data inconsistencies (“transactional integrity”).
Many typical systems write and rewrite single data structures, typically with some sort of semaphore or other mutual exclusion mechanism, and rely on frequent polling by data monitoring applications to observe problems or report changes. Other systems work on a “process on update” model, where the act of updating the data also includes immediately calling the necessary processing code, so that the data update is handled, but limits how much processing can be done before another data update can be reported and handled.
Large scale data processing systems, such as distributed relational database systems (RDBMS), often face variations of problems, such as frequent update, multiple users with differing rates of processing, and significant integrity requirements. A common mechanism used to aid in addressing these problems in many DBMS systems is the use of a data journal.
Unfortunately, such classic database systems are not suitable for limited resource monitoring systems for a number of reasons. First, they typically require large database applications, along with large amounts of file system based storage. Secondly, their client interfaces are exclusively “user-mode” useable as opposed to being useable by interrupt mode or kernel mode application code. Lastly, typical database systems lack the real-time to near real-time responsiveness needed both for data update and data access by limited resource monitoring system applications. Accordingly, there is a need for an improved system and method of accessing sensor and configuration data.
In a particular embodiment, the disclosure is directed to a system including a processor, a sensor interface responsive to the processor and memory responsive to the processor. The memory includes program instructions operable to direct the processor to implement a kernel-mode device driver for manipulating a journal based data system associated with data received via the sensor interface.
In another embodiment, the disclosure is directed to a system including a memory including a plurality of variable definitions, a plurality of variable update records, and a plurality of context records. Each variable definition of the plurality of variable definitions has an associated variable and includes an oldest update field and a latest update field. Each variable update record has an associated variable and includes a variable value, a next update pointer, and a previous update pointer. The previous update pointer of a first variable update record associated with one variable points to the oldest update field of a variable definition associated with the one variable. The next update pointer of a second variable update record associated with the one variable points to the latest update field of the variable definition associated with the one variable. Each context record of the plurality of context records has an associated current timestamp field and a context update field pointing to a third variable update record of the plurality of variable update records.
In a further embodiment, the disclosure is directed to a method for accessing a value associated with a variable at a target time. The method includes searching a variable record table for a variable record. The variable record has a variable identification associated with the variable, a latest update pointer, a creation time not greater than the target time, and a latest update time. The method includes selectively searching a set of update records starting with a first update record indicated by the latest update pointer and following a previous update pointer included in the first update record to a subsequent update record.
In another embodiment, the disclosure is directed to a method for managing memory. The method includes determining an oldest timestamp of interest, searching a set of update records starting at a specified start point and proceeding chronologically to subsequent update records until identifying a first update record with a timestamp newer that the oldest timestamp of interest, setting the specified start point to the record chronologically following the first update record and revising a variable record associated with the first update record.
The present disclosure describes a method and system for utilization of data journaling techniques to produce a real-time sensor monitoring and data processing system suitable for use in embedded monitoring appliances or, alternatively, in systems, such as PCs and servers.
The term ‘monitoring appliance’, as used in this disclosure, generally refers to a low-cost computing device built to perform a well-defined set of functions centered around the acquisition and processing of analog and digital sensor readings. Unlike personal computers (PCs) and other large scale computing devices, monitoring appliances typically have limited storage and limited computing power. Storage generally includes RAM and Flash memory. In general, mechanisms for collecting and producing the sensor readings in an appliance involves significant interrupt mode and kernel mode processing unlike monitoring applications on PC devices. Applications on PC devices typically do the bulk of data collection and processing in processes in “user mode,” where full operating system functionality is available. In particular examples, the monitoring appliance may include applications for alarming and data communication through networks using standards such as HTTP, FTP, SMTP, SMS, and SNMP.
The disclosure presents a memory and processing-based system for implementing a journaling style data model (which may not have a file system or high-level operating system functionality). A journal based data model includes a set of variable updates. Such a journaling style data model may be used on a monitoring appliance. In one particular embodiment, the journaling style data model may be implemented in a kernel mode or as a device driver. Kernel-mode generally includes running with supervisor privilege within the kernel of the operating system. Device driver generally includes a specialized piece of code, either integrated with or loaded by the operating system kernel, that runs with kernel privilege and provides a service or access to a hardware device. In one exemplary embodiment, the system provides interfaces for interrupt, kernel, and user mode update and access to the data model, including transactional data update (with rollback) from interrupt, kernel, and user mode. The system may also include access to stable “snapshots” of the state of the data model as of a given time without copying the data model. The system may provide support for step-by-step traversal of the update sequence for the data model, allowing even slow applications to avoid missing short-term data events. Each step in the traversal provides a stable view of the whole data model at the point in time in the data model's history that corresponds to the time of the last update read. The system may provide support for efficiently reclaiming journal space as accessing applications move past the older updates. The system may also provide mechanisms for defining named variables of various data types, as well as supporting “meta-data” for these variables.
In one exemplary embodiment, a monitoring appliance monitors a space and, in some embodiments, equipment, such as computer equipment. The monitoring appliance may communicate data associated with the space and the equipment to a remote system. For example, the monitoring appliance may gather environmental data, such as temperature, air flow, humidity, leak detection, power quality, and motion detection.
The monitoring appliance includes a journaling database system. The monitoring appliance may also include or communicate with sensors or cameras. The journaling system may be a kernel-mode driver including a table of variable records, a plurality of variable updates, and a plurality of context records.
The sensor interfaces 106 may interact with sensors, such as analog or digital sensors. For example, the sensor interfaces 106 may gather temperature, humidity, airflow, video, audio, dry-contact, and other data from specific sensors. Network interfaces 116 may provide communications connectivity. For example, the monitoring appliance may communicate with wired and wireless networks, such as Ethernet, telephony, Blue Tooth®, 802.11, 802.16 and other networks.
Memory 118 generally takes the form of random access memory (RAM) and flash memory. However, permanent data storage may be provided. The memory includes tables and record sets 108, 110, and 112, which form the base data structures for the journaling data model 122. The table of variable definitions 108 contains records describing data objects within the data model. In a particular implementation, these records are arranged in a hash table, such as a table hashed using the name of each variable, to allow fast lookup. For faster access, the records describing each variable may be fixed in memory, allowing a pointer or some other index to be used as a handle for accessing a variable.
The global set of variable update records 110, also referred to as a global journal, includes an ordered journal of updates, providing a history of the value updates of sensor values. Each update record is also a member of a variable-specific update set, allowing the value history for a given variable to be easily accessed. In one particular embodiment, the global set or global journal 10 is implemented as a next update pointer in each update record.
The set of context records 112 describes “views” into the data model for each of the applications accessing the data model. Each context record may include a pointer into the global update journal and a corresponding update timestamp. The pointer indicates where in the history of the data model the context is referring. Context records may also include support for filtering the view of the data, for example, by restricting the view to selected variables that are of interest.
Memory 118 may also include other data 114 such as threshold data, application data, video data, audio data, alert and alarm contact data, and other data objects associated with performing monitoring functionality. Memory 118 may also include computer-implemented programs 120 configured to direct circuitry 104 to provide functionality, such as, for example, data monitoring, alert and alarm functionality, data transfer, and network communications. For example, the programs 120 may include a data monitoring application with data objects useful in comparing data to threshold values and useful in determining alarm conditions. The programs and instructions 120 may further include applications configured to contact, notify or alert other systems and personnel when alarm conditions occur. The programs and instructions 120 may further include applications, such as web servers and email applications, for transferring or communicating information and data. For example, the programs and instructions 120 may be configured to direct the circuitry 104 to communicate via the network interfaces 116 using communications standards, such as FTP, SNMP, SMTP, HTTP, and SMS.
Each variable record in the data model defines a uniquely named entity, typically using a textual name, with a specific data type. In a particular embodiment, each sensor in the system has an associated variable for which the current value is the sensor reading. Other data, such as configuration, error conditions, status, and security settings can be stored as variables. An exemplary structure for a variable record is represented in Table 1.
The variable records may be stored in or accessed via an open hash table, with the records hashed by the ID_string. As shown in
Variable records referenced in the hash table may be uniquely identified by ID_string in combination with creation time. Creation time is useful in handling the situation in which a variable is deleted and recreated during the lifetime of the journal. When the hash table is searched for a variable, the lookup is relative to a desired time reference, for example, either the present time or the context used to view the data. The combination of the creation time and the time of the last update of a given variable is used to select from among the records that may exist for a given variable ID. If the variable is deleted, the time of the last update is the time of the deletion. Likewise, if no variable record existed at the desired time reference, which may be before or after the variable was created or destroyed, the lookup can recognize the absence of the variable record and act accordingly.
Each variable record may also include descriptive data, such as the data type, attribute flags, and class of the variable. In a particular embodiment, a significant variety of data types are supported, including signed and unsigned integers (32-bit and 64-bit), single and double precision floating point numbers, Booleans, strings, string lists, timestamps, byte arrays and structured data values, such as lists of other data value primitives with ID strings for each.
This exemplary embodiment also supports a variety of attribute flags including basic access control, such as a read-only flag, a constant flag, and an undeletable flag; name scope control, such as a flag indicating that the variable ID is globally unique across multiple systems or locally unique; and persistence control, such as a flag for indicating that the variable should be saved to permanent storage and restored when the system is restarted.
In an exemplary embodiment, each variable record also includes a variable update record. This variable update record stores the “oldest” value of the variable, which provides the base-line version of the variable. The updates contained in the journal are, generally, assumed to be relative to the base-line values stored in the variable records. For example, if no update is in the journal, or if the update is after the time in question, the “oldest” value embedded in the variable will be used to describe the value of the variable.
Variable values may be stored in variable update records. In one particular embodiment, each variable record consists of the fields depicted in Table 2.
Variable update records may be linked into two different ordered sets. One set represents the value history of the specific variable, such as through using the next_var_update and prev_var_update pointers, and the other set represents the global value history or global journal for the variables in the system. In both cases, the order of the records may be sorted by update timestamp with records “before” a given record having a timestamp equal to or lower than that of a given record, and records “after” a given record having a timestamp equal to or higher than that of the given record. This ordering is naturally produced due to the insertion process, since newer updates will have higher timestamps than older ones.
In general, references to “timestamp” in this disclosure are intended to refer to numeric values representing an ordered sequence of time in history. Depending upon the implementation, timestamps may be literal timestamps with sufficient resolution so that matching values can be considered by the system to be “simultaneous” or an incrementing “version stamp” where each atomic update or set of updates receives a new value which is higher than all previous values, such as by using an incrementing counter. In general, the mechanism used for producing timestamps should satisfy the following exemplary rules:
For a given variable, the combination of the variable record and its update records form a doubly-linked circular list. For example, as shown in
Similarly, the update records, including those embedded in the variable record, are linked and ordered into a single list, representing the global value journal for the whole data system. As shown in
In general, when the value of a variable is updated, a new update record is created and initialized with a new value, an appropriate timestamp, and pointer to the variable record. The new update is added to both the end of the global journal (using the “journal_end” pointer) and the newest end of the variables local set of values (using the ‘latest update’ pointer in the variable record). The simple structure of the journal allows this operation to be quickly accomplished, even in interrupt mode with, for example, protection provided by interrupt disables, spin locks, or other system appropriate mechanisms. If interrupt mode update and/or access is not used, semaphores can also be used for providing concurrency protection.
Since the value history of a variable is likely to be of interest, deletion of a variable is treated as a special case of a value update. A special reserved value is stored in the value field of the update record, indicating that the current value is now “deleted”. When the variable is being accessed for its value at a given point in time, the search of the hash table can quickly determine that a given variable record did not exist at a given point in time by comparing the desired timestamp to the creation time and to the value and timestamp of the latest update. If the creation time is newer than the timestamp, the variable did not exist yet. If the value is ‘deleted’ and the timestamp is before the desired time, the variable no longer existed at that time.
Stable reader access to the data model and journal may be accomplished using data records known as ‘access contexts’. In a particular implementation, an access context consists of the fields depicted in Table 3.
The current_ts field is used to provide a target time when the value of a variable is requested and to prevent pruning of updates. The minimum value of the current_ts field for active access contexts can be found, maintained, and used for setting the limit on what portion of the journal is pruned.
The ‘next_update’ pointer is used to point directly into the update journal, allowing updates to be read, one by one, from the journal. When it is combined with the current_ts, the system can determine when more than one update occurred simultaneously. The updates can be read, one-by-one, and some may be found to have the same update timestamp.
In a particular implementation, the other fields (Type_Flags_Mask, Type_Flags_Value, cls, meta_flt) are used to “filter” the variables shown through the access context to only those of interest. Each of these fields, when defined, provides matching requirements for different fields in the variable record to be matched in order for a variable to be “of interest” to the access context. The other fields may be used to allow quick traversal of the update journal. Updates associated with variables not matching the filters are skipped without being reported to the reader of the access context.
Enumeration of the variable population and associated values at the given time represented by the access context may be accomplished by traversing the hash table of the variable records, skipping records representing variables that do not exist at the target time and records that do not match the access context's filters, and reading the values using the current timestamp as the target time. For large variable populations with frequent filtering, additional hashing or sorting of variable records with common filtered attributes may be performed to increase search efficiency.
Accessing the value of a variable at a given time may be accomplished as shown in
In a particular embodiment, the update list for a given variable is a simple, double-linked list, which may be traversed linearly to find a value. Linear traversal is generally desirable where the length of the update history for a given variable is small, timestamp comparisons are very fast, and most value queries are for either the current value (the first in the list) or one of the most recent values (those closest to the start of the search). In implementations where these assumptions may be inappropriate, use of a heap, binary tree, or other data structure providing a faster-than-linear lookup may be used.
Since the access contexts consist of a very small set of data, contexts can be easily created or copied. One common use of access contexts is for threshold processing. Threshold processing code may operate either by reading updates, one by one, and checking for threshold violations on those variables of interest that are changing values or by skipping forward by prescribed periods of time, and traversing all desired data. Checking one by one prevents the need to poll all variables frequently since the threshold code can assume that a variable representing a sensor still has the same value as the last time it was read unless a new value update is reported. If a problem is found, it is commonly the case that another program, such as a notification process for sending e-mail or generating reports, is invoked. By copying the access context and passing the copy to the notification program, the system provides that the notification process reports on the same system state, including the same sensor values and other configuration data, as present at the time that the problem was reported. Meanwhile, the threshold processing code can continue to process newer data updates, without waiting for the notification code in order to preserve the data state, and without causing the notification code to potentially report “newer” system state than intended. When the notification process is completed, it can close or release the access context, allowing the system to prune the journal of the older updates that are no longer of interest.
The journal supports being “pruned” based on retiring records in the journal older than the oldest timestamp of interest, as shown in
Pruning of the journal can be initiated for a variety of reasons, including closing of data model readers, resulting in changes in the oldest timestamp of interest; readers moving forward through the journal also causing such changes; or resource constraints, such as the population of update records exceeding a system prescribed limit or age limit.
Another use of data stabilization is for potentially long-running data processing, such as saving the variable data to disk or accessing the data across a network. The time-consistency gained by the access context allows the “slowness” of these mechanisms to not cause problems with their successful execution either by forcing the sensors and other data “updaters” to block or stop updating temporarily, or by requiring the production of a memory expensive copy of the data into fast storage, such as RAM, so that the slow processing can have a stable data image on which to operate. The option for such processes to “listen” for just the values that have been updated, by, for example, traversing the update journal, also allows for efficient incremental data communication such as only sending the data updates across a network, instead of a full copy of mostly-unchanged data.
Variable records also support a mechanism for providing additional “supporting data” for the variables. Such “metadata” provide a means by which additional information on the variables, such as units, value ranges, labels, access control, and other application-specific data can be “tied to” the variables.
In a particular implementation, each “metadata slot” is defined by a record containing the slot's ID string, its data type (supporting the same types as the variable data supports), and any access control information. Each “metadata slot value” contains a pointer to the record defining the slot, the value of the slot, and pointers for chaining with the other metadata slot values for a given variable.
Multi-update transactions may be implemented by accumulating a desired set of update records without adding them to the journal or the variables' update chains until the transaction is “committed”. When committed, updates in the chain are given the same update timestamp, added to the global journal, and linked into each of the update chains for each of the update variables as if the updates were done one by one. Only the commit processing is performed within the “mutual exclusion” (interrupt disable or semaphore, as indicated earlier) section of the code. The transaction can be accumulated step-by-step without entering the critical section. Likewise, the transactions can be “rolled-back” by simply deleting the chain of updates before commit. Similarly, creation of new variable objects within a transaction is accomplished by accumulating the new variable records, and adding them (and setting the creation timestamp) when the commit is complete.
In a particular implementation, each variable can optionally be assigned to be of a certain class. Variable classes are defined by data structures that include a unique ID string, a pointer to a parent class (if any), access privileges, and a list of class-specific metadata values. Exemplary Classes are used in the following ways:
The exemplary implementation includes multiple access methods for the data model implementation. Exemplary methods of access include implementation of these functions:
An exemplary implementation is based around a kernel-mode device driver and provides a set of C-callable function calls providing the full set of data model capabilities. A kernel-mode implementation generally means running with supervisor privilege within the kernel of the operating system. A device driver generally means a specialized piece of code, either integrated with or loaded by the operating system kernel, that run with kernel privilege and provides a service or access to a hardware device. These interfaces are designed to be called either from interrupt-context or task-mode, allowing their use from other kernel-mode device drivers and subsystems.
A particular exemplary implementation provides a character device driver interface, including a full set of ioctl( )-based functions, for implementing the full set of data model capabilities. In addition, the character driver includes support for asynchronous (non-blocking) I/O, allowing select( ) to be used for timed waiting for updates from an access context.
In addition, a more friendly C-style interface may be provided through a shared library (which may be implemented using the character driver interfaces). An object-based C++ style interface may be used for implementation, as well. To allow easy use from scripting environments, several command-line interface tools may be implemented using the C-style library, providing access and modification mechanisms. The exemplary implementation may also include a set of CGI (Common Gateway Interface) modules implementing both query and update XML grammars for the data model. The Appendix depicts an exemplary XML grammar. These grammars may allow a full set of methods for querying the data model and returning subsets of the data model, as well as creating, modifying, and deleting data within the model. These XML-based web interfaces may provide a programmatically friendly way for a Java-based application provided as a GUI implementation, a centralized mass administration tool, and other third party applications to interact with the device implementing the data model. A query CGI may include support for both inputting an XML-based query (as form-data input of a POST) and returning the data in the response, or running pre-canned queries stored on the device and tied to defined URLs. An exemplary implementation may also include support for substitution of values derived from the data model into standard HTML documents using an XML-based macro grammar.
An exemplary implementation may include a custom SNMP subagent, which provides a mechanism for defining tables to the SNMP agent representing the values and metadata slots of variables of a given class. These mappings may provide a means by which variables in the data model, such as sensors and configuration data, can be easily published for access through standard SNMP access mechanisms.
Another exemplary implementation may include mechanisms for generating XML-based reports (using the same grammars as used for the Web Access), and delivering these reports using FTP to an FTP server, HTTP POST-ing (form data delivery) to a remote web server, or SMTP-based e-mail delivery.
A further exemplary implementation may include an application for utilizing the C-style library interface for monitoring data updates, and storing copies of the variables marked as persistent (using the type flags) to an XML-based file encoding. At system restart, this file may be used to drive the data model updates to restore those variables to the state corresponding to the last stored state. This same mechanism can be used for saving and restoring configuration data externally from the device.
The above disclosed subject matter is to be considered illustrative, and not restrictive, and the appended claims are intended to cover all such modifications, enhancements, and other embodiments which fall within the true scope of the present invention. For example, the above data model and journaling application may be implemented on PCs and server systems. Thus, to the maximum extent allowed by law, the scope of the present invention is to be determined by the broadest permissible interpretation of the following claims and their equivalents, and shall not be restricted or limited by the foregoing detailed description, including the APPENDIX.
The present application claims priority from U.S. provisional patent application No. 60/462,847, filed Apr. 14, 2003, entitled “METHOD AND SYSTEM FOR JOURNALING AND ACCESSING SENSOR AND CONFIGURATION DATA,” naming inventor Michael Primm, which application is incorporated by reference herein in its entirety.
Number | Name | Date | Kind |
---|---|---|---|
3810138 | Thompson et al. | May 1974 | A |
4349879 | Peddie et al. | Sep 1982 | A |
4521645 | Carroll | Jun 1985 | A |
4535598 | Mount | Aug 1985 | A |
4568934 | Allgood | Feb 1986 | A |
4636652 | Raes | Jan 1987 | A |
4637020 | Schinabeck | Jan 1987 | A |
4650347 | Shigemura et al. | Mar 1987 | A |
4668939 | Kimura et al. | May 1987 | A |
4718025 | Minor et al. | Jan 1988 | A |
4747041 | Engel et al. | May 1988 | A |
4751648 | Sears, III et al. | Jun 1988 | A |
4816208 | Woods et al. | Mar 1989 | A |
4823290 | Fasack et al. | Apr 1989 | A |
4964065 | Hicks et al. | Oct 1990 | A |
5043807 | Rabii | Aug 1991 | A |
5061916 | French et al. | Oct 1991 | A |
5086385 | Launey et al. | Feb 1992 | A |
5097328 | Boyette | Mar 1992 | A |
5109278 | Erickson et al. | Apr 1992 | A |
5153837 | Shaffer et al. | Oct 1992 | A |
5157732 | Ishii et al. | Oct 1992 | A |
5189394 | Walter et al. | Feb 1993 | A |
5216623 | Barrett et al. | Jun 1993 | A |
5220522 | Wilson et al. | Jun 1993 | A |
5225997 | Lederer et al. | Jul 1993 | A |
5229850 | Toyoshima | Jul 1993 | A |
5262758 | Nam et al. | Nov 1993 | A |
5289275 | Ishii et al. | Feb 1994 | A |
5367670 | Ward et al. | Nov 1994 | A |
5382943 | Tanaka | Jan 1995 | A |
5395042 | Riley et al. | Mar 1995 | A |
5400246 | Wilson et al. | Mar 1995 | A |
5404136 | Marsden | Apr 1995 | A |
5475364 | Kenet | Dec 1995 | A |
5488430 | Hong | Jan 1996 | A |
5491511 | Odle | Feb 1996 | A |
5508941 | Leplingard et al. | Apr 1996 | A |
5528507 | McNamara et al. | Jun 1996 | A |
5548659 | Okamoto | Aug 1996 | A |
5553609 | Chen et al. | Sep 1996 | A |
5561476 | Kershaw et al. | Oct 1996 | A |
5566339 | Perholtz et al. | Oct 1996 | A |
5572195 | Heller et al. | Nov 1996 | A |
5581478 | Cruse et al. | Dec 1996 | A |
5586202 | Ohki et al. | Dec 1996 | A |
5588067 | Peterson et al. | Dec 1996 | A |
5589764 | Lee | Dec 1996 | A |
5602585 | Dickinson et al. | Feb 1997 | A |
5621662 | Humphries et al. | Apr 1997 | A |
5634002 | Polk et al. | May 1997 | A |
5659470 | Goska et al. | Aug 1997 | A |
5664202 | Chen et al. | Sep 1997 | A |
5715160 | Plotke | Feb 1998 | A |
5731832 | Ng | Mar 1998 | A |
5732074 | Spaur et al. | Mar 1998 | A |
5742762 | Scholl et al. | Apr 1998 | A |
RE35793 | Halpern | May 1998 | E |
5768430 | Takashima et al. | Jun 1998 | A |
5778168 | Fuller | Jul 1998 | A |
5798798 | Rector et al. | Aug 1998 | A |
5805458 | McNamara et al. | Sep 1998 | A |
5812055 | Candy et al. | Sep 1998 | A |
5818725 | McNamara et al. | Oct 1998 | A |
5822302 | Landry, Jr. et al. | Oct 1998 | A |
5826253 | Bredenberg | Oct 1998 | A |
5829130 | Miller | Nov 1998 | A |
5870575 | Kahle et al. | Feb 1999 | A |
5892440 | Bryan | Apr 1999 | A |
5905867 | Giorgio et al. | May 1999 | A |
5926210 | Hackett et al. | Jul 1999 | A |
5937092 | Wootton et al. | Aug 1999 | A |
5937097 | Lennon | Aug 1999 | A |
5949974 | Ewing et al. | Sep 1999 | A |
5955946 | Beheshti et al. | Sep 1999 | A |
5963457 | Kanoi et al. | Oct 1999 | A |
5968116 | Day, II et al. | Oct 1999 | A |
5974237 | Shurmer et al. | Oct 1999 | A |
5978594 | Bonnell et al. | Nov 1999 | A |
5978912 | Rakavy et al. | Nov 1999 | A |
5987614 | Mitchell et al. | Nov 1999 | A |
5991775 | Beardsley et al. | Nov 1999 | A |
5991885 | Chang et al. | Nov 1999 | A |
6001065 | DeVito | Dec 1999 | A |
6052750 | Lea | Apr 2000 | A |
6055480 | Nevo et al. | Apr 2000 | A |
6057834 | Pickover | May 2000 | A |
6058434 | Wilt et al. | May 2000 | A |
6078253 | Fowler | Jun 2000 | A |
6081606 | Hansen et al. | Jun 2000 | A |
6085243 | Fletcher et al. | Jul 2000 | A |
6088816 | Nouri et al. | Jul 2000 | A |
6094676 | Nolet et al. | Jul 2000 | A |
6100806 | Gaukel | Aug 2000 | A |
6104755 | Ohara | Aug 2000 | A |
6105061 | Nakai | Aug 2000 | A |
6108782 | Fletcher et al. | Aug 2000 | A |
6112235 | Spofford | Aug 2000 | A |
6115468 | De Nicolo | Sep 2000 | A |
6122603 | Budike, Jr. | Sep 2000 | A |
6125145 | Koyanagi et al. | Sep 2000 | A |
6138078 | Canada et al. | Oct 2000 | A |
6138249 | Nolet | Oct 2000 | A |
6139177 | Venkatraman et al. | Oct 2000 | A |
6144770 | Lennon | Nov 2000 | A |
6148262 | Fry | Nov 2000 | A |
6157943 | Meyer | Dec 2000 | A |
6160584 | Yanagita | Dec 2000 | A |
6160926 | Dow et al. | Dec 2000 | A |
6167406 | Hoskins et al. | Dec 2000 | A |
6170007 | Venkatraman et al. | Jan 2001 | B1 |
6173323 | Moghe | Jan 2001 | B1 |
6175866 | Holloway et al. | Jan 2001 | B1 |
6175927 | Cromer et al. | Jan 2001 | B1 |
6177884 | Hunt et al. | Jan 2001 | B1 |
6182094 | Humpleman et al. | Jan 2001 | B1 |
6182157 | Schlener et al. | Jan 2001 | B1 |
6189109 | Sheikh et al. | Feb 2001 | B1 |
6195018 | Ragle et al. | Feb 2001 | B1 |
6208261 | Olstead | Mar 2001 | B1 |
6208345 | Sheard et al. | Mar 2001 | B1 |
6215404 | Morales | Apr 2001 | B1 |
6219628 | Kodosky et al. | Apr 2001 | B1 |
6229429 | Horon | May 2001 | B1 |
6236332 | Conkright et al. | May 2001 | B1 |
6246780 | Sato | Jun 2001 | B1 |
6259956 | Myers et al. | Jul 2001 | B1 |
6266721 | Sheikh et al. | Jul 2001 | B1 |
6271845 | Richardson | Aug 2001 | B1 |
6281790 | Kimmel et al. | Aug 2001 | B1 |
6282546 | Gleichauf et al. | Aug 2001 | B1 |
6298144 | Pucker, II et al. | Oct 2001 | B1 |
6304900 | Cromer et al. | Oct 2001 | B1 |
6311105 | Budike, Jr. | Oct 2001 | B1 |
6311214 | Rhoads | Oct 2001 | B1 |
6324644 | Rakavy et al. | Nov 2001 | B1 |
6324654 | Wahl et al. | Nov 2001 | B1 |
6329792 | Dunn et al. | Dec 2001 | B1 |
6332202 | Sheikh et al. | Dec 2001 | B1 |
6336175 | Shaath et al. | Jan 2002 | B1 |
6338094 | Scott et al. | Jan 2002 | B1 |
6353834 | Wong et al. | Mar 2002 | B1 |
6360255 | McCormack et al. | Mar 2002 | B1 |
6363421 | Barker et al. | Mar 2002 | B2 |
6363422 | Hunter et al. | Mar 2002 | B1 |
6373840 | Chen | Apr 2002 | B1 |
6374296 | Lim et al. | Apr 2002 | B1 |
6375614 | Braun et al. | Apr 2002 | B1 |
6381700 | Yoshida | Apr 2002 | B1 |
6389464 | Krishnamurthy et al. | May 2002 | B1 |
6396534 | Mahler et al. | May 2002 | B1 |
6400103 | Adamson | Jun 2002 | B1 |
6400996 | Hoffberg et al. | Jun 2002 | B1 |
6402691 | Peddicord et al. | Jun 2002 | B1 |
6404348 | Wilfong | Jun 2002 | B1 |
6405216 | Minnaert et al. | Jun 2002 | B1 |
6421690 | Kirk, III | Jul 2002 | B1 |
6442706 | Wahl et al. | Aug 2002 | B1 |
6449745 | Kim et al. | Sep 2002 | B1 |
6477667 | Levi et al. | Nov 2002 | B1 |
6496105 | Fisher et al. | Dec 2002 | B2 |
6505086 | Dodd, Jr. et al. | Jan 2003 | B1 |
6510350 | Steen, III et al. | Jan 2003 | B1 |
6529230 | Chong | Mar 2003 | B1 |
6529936 | Mayo et al. | Mar 2003 | B1 |
6553336 | Johnson et al. | Apr 2003 | B1 |
6553418 | Collins et al. | Apr 2003 | B1 |
6591279 | Emens et al. | Jul 2003 | B1 |
6640145 | Hoffberg et al. | Oct 2003 | B2 |
6681787 | Tinsley et al. | Jan 2004 | B2 |
6714977 | Fowler et al. | Mar 2004 | B1 |
6754657 | Lomet | Jun 2004 | B2 |
6754743 | Maessen | Jun 2004 | B2 |
6990513 | Belfiore et al. | Jan 2006 | B2 |
7010662 | Aasheim et al. | Mar 2006 | B2 |
7051096 | Krawiec et al. | May 2006 | B1 |
7207041 | Elson et al. | Apr 2007 | B2 |
20010005894 | Fukui | Jun 2001 | A1 |
20010047213 | Sepe, Jr. | Nov 2001 | A1 |
20010047410 | Defosse | Nov 2001 | A1 |
20010052006 | Barker et al. | Dec 2001 | A1 |
20010055965 | Delp et al. | Dec 2001 | A1 |
20020003575 | Marchese | Jan 2002 | A1 |
20020023258 | Elwahab et al. | Feb 2002 | A1 |
20020041603 | Kato | Apr 2002 | A1 |
20020043969 | Duncan et al. | Apr 2002 | A1 |
20020071031 | Lord et al. | Jun 2002 | A1 |
20020072868 | Bartone et al. | Jun 2002 | A1 |
20020083378 | Nickels | Jun 2002 | A1 |
20020152298 | Kikta et al. | Oct 2002 | A1 |
20030098789 | Murakami et al. | May 2003 | A1 |
20030099254 | Richter | May 2003 | A1 |
Number | Date | Country |
---|---|---|
3855395 | Jun 1996 | AU |
5601198 | Jul 1998 | AU |
0016673 | Jun 2000 | AU |
2300053-AA | Feb 1999 | CA |
2310275-AA | Jun 1999 | CA |
2328939-AA | Sep 1999 | CA |
87100353 | Sep 1988 | CN |
1294350 | May 2001 | CN |
0444997 | Feb 1991 | EP |
0 591 585 | Apr 1994 | EP |
0738065 | Mar 1996 | EP |
0744112 | Nov 1996 | EP |
0859489 | Jan 1998 | EP |
0978780 | Aug 1998 | EP |
0917034 | Oct 1998 | EP |
0917034 | Oct 1998 | EP |
0963076 | May 1999 | EP |
0964551 | Jun 1999 | EP |
0 927 933 | Jul 1999 | EP |
0977112 | Jul 1999 | EP |
0956680 | Nov 1999 | EP |
1014622 | Dec 1999 | EP |
0 990 986 | Apr 2000 | EP |
0992100 | Apr 2000 | EP |
1002268 | May 2000 | EP |
1 009 130 | Jun 2000 | EP |
1032884 | Sep 2000 | EP |
1 049 291 | Nov 2000 | EP |
1115264 | Dec 2000 | EP |
1124301 | Dec 2000 | EP |
1 096 724 | May 2001 | EP |
1 150 188 | Oct 2001 | EP |
1142289 | Oct 2001 | EP |
1 178 628 | Feb 2002 | EP |
9826895 | Jan 1999 | GB |
9913682 | Aug 1999 | GB |
2335124 | Sep 1999 | GB |
2343036 | Apr 2000 | GB |
2344718 | Jun 2000 | GB |
2351205 | Dec 2000 | GB |
2344718 | Jan 2001 | GB |
2355163 | Apr 2001 | GB |
2359369 | Aug 2001 | GB |
9300145 | Aug 1993 | HU |
3099398 | Apr 1991 | JP |
5040889 | Feb 1993 | JP |
6105376 | Apr 1994 | JP |
6119581 | Apr 1994 | JP |
8307541 | Nov 1996 | JP |
11164035 | Jun 1999 | JP |
11219388 | Aug 1999 | JP |
2000092092 | Mar 2000 | JP |
2000134606 | May 2000 | JP |
2000151606 | May 2000 | JP |
2000-209204 | Jul 2000 | JP |
2000278773 | Oct 2000 | JP |
0443058 | Jun 2001 | TW |
0448349 | Aug 2001 | TW |
WO-9521506 | Aug 1995 | WO |
WO-9615615 | May 1996 | WO |
WO-9730879 | Aug 1997 | WO |
WO-9801838 | Jan 1998 | WO |
WO-9826541 | Jun 1998 | WO |
WO-9908183 | Feb 1999 | WO |
WO 9915950 | Apr 1999 | WO |
WO-9945445 | May 1999 | WO |
WO-9927456 | Jun 1999 | WO |
WO-0035177 | Jun 2000 | WO |
WO-0039724 | Jul 2000 | WO |
WO-0054557 | Sep 2000 | WO |
WO-0073866 | Dec 2000 | WO |
WO-0079500 | Dec 2000 | WO |
WO-0079500 | Dec 2000 | WO |
WO-0101366 | Jan 2001 | WO |
WO-0108396 | Feb 2001 | WO |
WO-0127763 | Apr 2001 | WO |
WO-0157631 | Aug 2001 | WO |
WO-0161665 | Aug 2001 | WO |
WO-0169405 | Sep 2001 | WO |
WO-0169405 | Sep 2001 | WO |
WO 0169504 | Sep 2001 | WO |
WO-0179935 | Oct 2001 | WO |
WO-0157477 | Nov 2001 | WO |
WO-0182028 | Nov 2001 | WO |
WO-0193042 | Dec 2001 | WO |
WO-0193508 | Dec 2001 | WO |
WO-0197907 | Dec 2001 | WO |
WO-0199402 | Dec 2001 | WO |
WO-0201877 | Jan 2002 | WO |
WO-0211391 | Feb 2002 | WO |
0233980 | Apr 2002 | WO |
WO-0237280 | May 2002 | WO |
WO-0247044 | Jun 2002 | WO |
WO-0247369 | Jun 2002 | WO |
WO-0248830 | Jun 2002 | WO |
WO-0249285 | Jun 2002 | WO |
Number | Date | Country | |
---|---|---|---|
20040236718 A1 | Nov 2004 | US |
Number | Date | Country | |
---|---|---|---|
60462847 | Apr 2003 | US |