Revision e7131d09 core/src/aos_rtcan.c

View differences:

core/src/aos_rtcan.c
20 20
#include <hal_can.h>
21 21
#include <hal_can_lld.h>
22 22
#include <aos_rtcan.h>
23
#include <aos_thread.h>
24
#include <chthreads.h>
23 25

  
24 26
#define True 1
25 27
#define False 0
26 28
#define NRT 1111111
27 29
#define HRT 0000000
28 30

  
31
/*
32
 * @brief transmit Message over CAN
33
 */
29 34
msg_t rtcan_transmit(CANDriver *canp, canmbx_t mailbox, const CANTxFrame *ctfp){
30 35
    // call cantransmit, needed params driver, mailbox and tx frame
31 36

  
......
33 38
    return transmit;
34 39
}
35 40

  
41
/*
42
 * @brief receive Message over CAN
43
 */
36 44
msg_t rtcan_receive(CANDriver *canp, canmbx_t mailbox,CANRxFrame *crfp){
37 45
    // call lld cantransmit, needed params driver, mailbox and rx frame
38 46
    return canReceiveTimeout(canp,mailbox,crfp,TIME_IMMEDIATE);
39 47
}
40 48

  
41
/** Initialize rtcan
42
void rtcanInit(){
43
    //necessary?
44
}
45

  
46
/** Start rtcan *
47
void rtcanStart(CANDriver *canp, const CANConfig *config){
48
    can_lld_Start(canp,config);
49
}
49
// Handling Message Queues
50 50

  
51
/** Stop rtcan *
52
void rtcanStop(CANDriver *canp){
53
    can_lld_Stop(canp);
51
bool enqueueMsg(uint8_t *payload, uint8_t msgType, systime_t deadline){
52
    return false;
54 53
}
55 54

  
56
/** Stop rtcan reset param and start again *
57
void rtcanReset(){}
58
*
59

  
60
msgqueue_t msgqueueInit(rtcan_msg_t* msg){
61
    struct msgqueue_t queue;
62
    queue->head = msg;
63
    queue->tail = msg;
64
    return queue;
55
bool pushRTCanMsgSorted(rtcan_msg_t *msg,msgqueue_t* msgqueue){
56
    return false;
65 57
}
66 58

  
67
/** enqueue rtcanmsg_t  *
68
void msgqueueEnqueue(msgqueue_t* mqueue,rtcan_msg_t* msg){
69
    if(!msgqueueEmpty(mqueue)){
70
    // HRT message most imminent so enqueued at head
71
        msgqueue_t* curMsg = mqueue->tail;
72
        while(curMsg->prev != mqueue->head){
73
            if(msg->laxity < curMsg->laxity){
74
                break;
75
            }
76
            curMsg = curMsg->prev;
77
        }
78
        //what about the tail?
79
        msg->prev = curMsg->prev;
80
        curMsg->prev = msg;
81

  
82
    }else{
83
        msgqueueInit(msg);
59
/*
60
 * @brief push Message to its Queue, based on type of Message
61
 */
62
void pushRTCanMsg(rtcan_msg_t *msg,msgqueue_t* msgqueue){
63
  if(msg != NULL){
64
    if(msgqueueEmpty(msgqueue)){
65
        msgqueue->head = msg;
66
        msgqueue->tail= msg;
67
        msg->next = msg;
68
        return;
69
    }
70
    //todo special case handling
71
    if(msgqueue->tail != NULL){
72
      if(msg->msgType == 10){
73
          if(pushRTCanMsgSorted(msg,msgqueue) == true){
74
              return;
75
          };
76
      }
77
      msgqueue->tail->next = msg;
78
      msg->next = msg;
79
      msgqueue->tail = msg;
80
      msgqueue->size++;
84 81
    }
82
  }
85 83
}
86 84

  
87

  
88
/** dequeue rtcanmsg *
89
rtcan_msg_t* msgqueueDequeue(msgqueue_t* mqueue){
90
    if(!msgqueueEmpty(mqueue)){
91
        rtcan_msg_t dq = mqueue->head;
92
        mqueue->head = dq->prev;
93
        return dq;
85
/*
86
 * @brief dequeue Message from Queue
87
 */
88
rtcan_msg_t* popRTCanMsg(msgqueue_t* msgqueue){
89
    if(!msgqueueEmpty(msgqueue)){
90
        return msgqueue->head;
94 91
    }
95 92
    return NULL;
96 93
}
97 94

  
95
/**
96
 * @brief schedule rtcan messages into mailboxes
97
 */
98
void schedule(){
98 99

  
100
}
99 101

  
100 102
/** empty or clear?*/
101 103
int msgqueueEmpty(msgqueue_t* mqueue){

Also available in: Unified diff