summaryrefslogtreecommitdiffstats
path: root/cpukit/include/rtems/regulatorimpl.h
blob: a5652a764d997acaae0482765653c4a4ebe3a863 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/* SPDX-License-Identifier: BSD-2-Clause */

/**
 * @file
 *
 * @ingroup RegulatorInternalAPI
 *
 * @brief Regulator Library Implementation Support
 */

/*
 * Copyright (C) 2023 On-Line Applications Research Corporation (OAR)
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

/**
 * @defgroup RegulatorInternalAPI Regulator API Internals
 *
 * @brief Regulator Internal Information
 *
 * This concerns implementation information about the Regulator.
 */

#ifndef RTEMS_REGULATORIMPL_H
#define RTEMS_REGULATORIMPL_H

#include <stdatomic.h>

#include <rtems/chain.h>


/**
 * @ingroup RegulatorInternalAPI
 *
 * This constant is used to indicate the regulator instance is initialized.
 */
#define REGULATOR_INITIALIZED 0xDeadF00d

/**
 * @ingroup RegulatorInternalAPI
 *
 * @brief Regulator Message Instance Management Structure
 */
typedef struct {
  /** This points to the message contents. */
  void   *buffer;
  /** This is the length of the message. */
  size_t  length;
} _Regulator_Message_t;

/**
 * @ingroup RegulatorInternalAPI
 *
 * @brief Regulator Statistics Private Structure
 *
 * An instance of this structure is allocated per regulator instance.
 */
typedef struct {
  /** Number of successfully obtained buffers. */
  atomic_size_t    obtained;
  
  /** Number of successfully released buffers. */
  atomic_size_t    released;

  /** Number of successfully delivered buffers. */
  atomic_size_t    delivered;
} _Regulator_Statistics;
 
/**
 * @ingroup RegulatorInternalAPI
 *
 * @brief Regulator Instance Private Structure
 *
 * An instance of this structure is allocated per regulator instance.
 */
typedef struct {
  /** Has magic value when instance is usable */
  uint32_t   initialized;

  /** Attributes for this instance -- copied from user */
  rtems_regulator_attributes  Attributes;

  /** Pointer to allocated message memory */
  void *message_memory;

  /** Pointer to allocated memory for RTEMS Message Queue for pending buffers*/
  void *message_queue_storage;

  /** RTEMS Message Queue of pending outgoing messages */
  rtems_id  queue_id;

  /** RTEMS Partition for pool of unused messages */
  rtems_id  messages_partition_id;

  /** RTEMS Task for performing output */
  rtems_id  delivery_thread_id;

  /** Id of period used by output thread */
  rtems_id  delivery_thread_period_id;

  /** Indicates Delivery thread is running */
  bool  delivery_thread_is_running;

  /** Indicates Delivery thread has been requested to exit */
  bool  delivery_thread_request_exit;

  /** Indicates Delivery thread has exited */
  bool  delivery_thread_has_exited;

  /** Internal Statistics */
  _Regulator_Statistics Statistics;

} _Regulator_Control;

#endif /* RTEMS_REGULATORIMPL_H */