summaryrefslogtreecommitdiffstats
path: root/Src/Network/IndustrialStack_LLD.h
blob: f93a615ef005013f8525d41c30cff32a1703f4dc (plain)
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
136
137
138
139
140
141
142
143
144
145
146
147
148
/*
 * Video On Demand Samples
 *
 * Copyright (C) 2015 Microchip Technology Germany II GmbH & Co. KG
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * You may also obtain this software under a propriety license from Microchip.
 * Please contact Microchip for further information.
 *
 */

/*----------------------------------------------------------*/
/*! \file
 *  \brief This component implements the MOST low level driver.
 */
/*----------------------------------------------------------*/
#ifndef INDUSTRIAL_STACK_LLD_H
#define INDUSTRIAL_STACK_LLD_H

#include <stdint.h>
#include <stdbool.h>
#include <semaphore.h>
#include "IndustrialStack_Types.h"

#define BOARD_PMS_RX_QUEUE	256
#define BOARD_PMS_RX_SIZE	64
#define BOARD_PMS_TX_SIZE	64

typedef struct
{
    int16_t payloadLen;
    uint8_t buffer[BOARD_PMS_RX_SIZE];
} QueueEntry_t;

#define QUEUE_TESTPATTERN (0x34547382)
typedef struct
{
    uint32_t testPattern;
    QueueEntry_t dataQueue[BOARD_PMS_RX_QUEUE];
    QueueEntry_t *pRx;
    QueueEntry_t *pTx;
    volatile uint32_t rxPos;
    volatile uint32_t txPos;
} Queue_t;

class CIndustrialStackLld
{
private:
    pthread_t txThread;
    pthread_t rxThread;
public:
    ///Do not use directly! (Called internally from thread context)
    Queue_t txQueue;
    ///Do not use directly! (Called internally from thread context)
    Queue_t rxQueue;
    ///Do not use directly! (Called internally from thread context)
    int hControlRx;
    ///Do not use directly! (Called internally from thread context)
    int hControlTx;
    ///Do not use directly! (Called internally from thread context)
    bool allowThreadRun;
    ///Do not use directly! (Called internally from thread context)
    sem_t txSem;
    
    CIndustrialStackLldCB *listener;
    
    /*----------------------------------------------------------*/
    /*! \brief initializes LLD
     *
     * \param controlRxHandle File handle for the RX character device
     * \param controlRxHandle File handle for the TX character device
     * \return nothing.
     */
    /*----------------------------------------------------------*/
     CIndustrialStackLld(  int controlRxHandle, int controlTxHandle );



    /*----------------------------------------------------------*/
    /*! \brief deinitializes LLD
     */
    /*----------------------------------------------------------*/
    ~CIndustrialStackLld();


    /*----------------------------------------------------------*/
    /*! \brief determins if INIC has something to read
     *
     * \return The amount of data, which will be delivered by the next call of Read
     */
    /*----------------------------------------------------------*/
    uint16_t DataAvailable();


    /*----------------------------------------------------------*/
    /*! \brief receive a control message via USB.
     *
     * \param pData - message data
     *
     * \return The amount of bytes read.
     */
    /*----------------------------------------------------------*/
    uint16_t Read( uint8_t *pData, uint32_t bufferLen );



    /*----------------------------------------------------------*/
    /*! \brief Clearing RX and TX queues.
     * 
     * \return nothing
     */
    /*----------------------------------------------------------*/
    void ClearQueues();



    /*----------------------------------------------------------*/
    /*! \brief send a control message via USB.
     *
     * \param wLen - length of message in bytes
     * \param pData - message data
     *
     * \return True if no error.
     */
    /*----------------------------------------------------------*/
    bool Write( uint16_t wLen, uint8_t *pData );
    
};

class CIndustrialStackLldCB
{
public:
    virtual void OnReadThreadEnd(CIndustrialStackLld *lld) = 0;
};

#endif // INDUSTRIAL_STACK_LLD_H