aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Embedded_SW/Embedded/Communication/CommunicationTask.c
blob: 23f193b253a9e68f33173e7a55fd53ad6d6ef738 (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
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix *
/*
 * CommunicationTask.c
 *
 *  Created on: 8 ����� 2018
 *      Author: shlomo
 */

#include "include.h"
#include "drivers/Uart_Comm/uart.h"
#include "communicationTask.h"
#include <Container.h>
#include "delay.h"
#include "modules/Diagnostics/Diagnostics.h"


Mailbox_Handle          CommunicationRxMsgQ = NULL;
Mailbox_Handle          CommunicationTxMsgQ = NULL;
#define COMMUNICATION_NUM_MSGS 50
typedef struct CommRxMessage{
    //uint16_t messageId;
    uint16_t msgSize;
    uint32_t BuffId;
}CommRxMessageStruc;
typedef struct CommTxMessage{
    //uint16_t messageId;
    uint16_t msgSize;
    char *Buff;
}CommTxMessageStruc;

int CommType = isUART;

struct serialBuffer {
  char *buffer;
  size_t used;
  size_t size;
} typedef SerialBuffer;
#define SHORT_BUFFER_SIZE 200
char CommShortRxBuffer[10][SHORT_BUFFER_SIZE];
char CommRxBuffer[COMM_MAX_BUFFER_SIZE];
SerialBuffer inBuffer[11];
bool SerialBufferUsed[11] = {false,false,false,false,false,false,false,false,false,false,false};
uint32_t initArray(size_t initialSize)
{
  if (initialSize >= COMM_MAX_BUFFER_SIZE) return 0;
  if (initialSize > SHORT_BUFFER_SIZE)
  {
      if (SerialBufferUsed[10] == true)
      {
          return 0xFF;
      }
      else
      {
          SerialBufferUsed[10] = true;
          inBuffer[10].buffer = CommRxBuffer;
          inBuffer[10].used = 0;
          inBuffer[10].size = initialSize;
          return 10;
      }
  }
  else
  {
      int i;
      for (i = 0; i < 10; i++)
      {
          if (SerialBufferUsed[i] == false)
              break;
      }
      if (i == 10) return 0xFF;
      else
      {
          SerialBufferUsed[i] = true;
          inBuffer[i].buffer = &CommShortRxBuffer[i];
          inBuffer[i].used = 0;
          inBuffer[i].size = initialSize;
          return i;
      }
  }
  /*SerialBuffer *a = &inBuffer;
  a->buffer = CommRxBuffer;
  a->used = 0;
  a->size = initialSize;
  return initialSize;*/
}

void insertArray(uint32_t buffer,char element)
{
    SerialBuffer *a = &inBuffer[buffer];
  // a->used is the number of used entries, because a->array[a->used++] updates a->used only *after* the array has been accessed.
  // Therefore a->used can go up to a->size
  a->buffer[a->used++] = element;
}

void freeArray(uint32_t buffer)
{
     SerialBufferUsed[buffer] = false;
}

uint32_t CommunicationTaskInit(void)
{
    USBCDCD_init();
    Init_U0();

    return OK;
}
uint32_t CommTxMsgCounter = 0;
uint32_t CommRxMsgCounter = 0;
uint32_t CommunicationTaskMessageReceived(uint32_t buffer,uint16_t msgSize)
{
    CommRxMessageStruc CommRxMessage;
    CommRxMsgCounter++;

    //CommRxMessage.messageId = 1;
    CommRxMessage.msgSize = msgSize;
    CommRxMessage.BuffId = buffer;
    if (CommunicationRxMsgQ != NULL)
        /*retcode =*/ Mailbox_post(CommunicationRxMsgQ , &CommRxMessage, BIOS_NO_WAIT);

    return OK;

}

/******************************************************************************
 *  ======== communicationTask ========
 *  Task for this function is created statically. See the project's .cfg file.
 *  this communication task is created statically in system initialization, in blocking mode
 *  over one of the chosen ommunication methods (USB or Blutooth).
 ******************************************************************************/
uint32_t cLength[51] = {0};
byte cindex = 0;
void communicationTask(UArg arg0, UArg arg1)
{

    CommRxMessageStruc CommRxMessage;


    //ui32RxCount = 0;
    CommunicationRxMsgQ = Mailbox_create(sizeof(CommRxMessageStruc), 4, NULL,NULL);

    /* Block while the device is NOT connected to the USB */
//    Semaphore_pend(initConnectionSem, BIOS_WAIT_FOREVER);

    while(1)
    {
        Mailbox_pend(CommunicationRxMsgQ , &CommRxMessage, BIOS_WAIT_FOREVER);
        /*switch (CommRxMessage.messageId)
        {
            case 1:*/
            cLength[cindex] = CommRxMessage.msgSize;
            if (cindex++>=50)
            cindex = 0;
            receive_callback(inBuffer[CommRxMessage.BuffId].buffer,inBuffer[CommRxMessage.BuffId].used);
            freeArray(CommRxMessage.BuffId);
       /*         break;
            default:
                break;
        }*/
    }

}
int UnSentMessages=0, deliveryfailure = 0;
bool CommunicationTaskSendMessage(char* buffer,size_t length)
{
    CommTxMessageStruc CommTxMessage;
    CommTxMsgCounter++;
    bool retcode = true;

    //CommTxMessage.messageId = 1;
    CommTxMessage.msgSize = length;
    CommTxMessage.Buff = buffer;
    UnSentMessages++;
    if (CommunicationTxMsgQ != NULL)
        retcode = Mailbox_post(CommunicationTxMsgQ , &CommTxMessage, BIOS_NO_WAIT);
    if (retcode == false)
    {
        my_free(buffer);
        deliveryfailure++;
//        CommunicationMailboxFlush();
    }


    return retcode;
}
int memoryrelease = 0;
void CommunicationMailboxFlush(void)
{
    int i;
    CommTxMessageStruc CommTxMessage;
    for
/span>++) { if (Mailbox_pend(CommunicationTxMsgQ , &CommTxMessage, BIOS_NO_WAIT)) { UnSentMessages--; LOG_ERROR(CommTxMessage.msgSize,"Flushing CommTxMessage"); my_free(CommTxMessage.Buff); memoryrelease+=CommTxMessage.msgSize; } } } int32_t SetCommunicationPath(bool UARTorUSB) { CommType = UARTorUSB; return OK; } /****************************************************************************** * ======== communicationTask ======== * Task for this function is created statically. See the project's .cfg file. * this communication task is created statically in system initialization, in blocking mode * over one of the chosen Communication methods (USB or Bluetooth). ******************************************************************************/ void communicationTxTask(UArg arg0, UArg arg1) { CommTxMessageStruc CommTxMessage; //initArray(1); CommunicationTxMsgQ = Mailbox_create(sizeof(CommTxMessageStruc), COMMUNICATION_NUM_MSGS, NULL,NULL); while(1) { Mailbox_pend(CommunicationTxMsgQ , &CommTxMessage, BIOS_WAIT_FOREVER); UnSentMessages--; if ( CommTxMessage.msgSize > COMM_MAX_BUFFER_SIZE) { LOG_ERROR(CommTxMessage.msgSize , "message too long"); } else { if (CommType == isUSB) USBCDCD_sendData(CommTxMessage.Buff, CommTxMessage.msgSize,10); else if (CommType == isUART) Uart_Tx(CommTxMessage.Buff, CommTxMessage.msgSize); } if (diagnosticscontainer_buffer == CommTxMessage.Buff) diagnosticscontainer_buffer = 0; my_free(CommTxMessage.Buff); //delayms(1); //wait 5 milliseconds between messages } }