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
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 */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Tango.Protobuf.Compilers
{
    /// <summary>
    /// Represents a protobuf C# Compiler.
    /// </summary>
    /// <seealso cref="Tango.Protobuf.ProtoCompiler" />
    public class CSharpCompiler : ProtoCompiler
    {
        /// <summary>
        /// Gets t
/*
 * 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 (i=0;i<COMMUNICATION_NUM_MSGS;i++)
    {
        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
    }

}