Ooops! Imported SVN records...
This commit is contained in:
@@ -1,2 +0,0 @@
|
|||||||
This is a Subversion working copy administrative directory.
|
|
||||||
Visit http://subversion.tigris.org/ for more information.
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<wc-entries
|
|
||||||
xmlns="svn:">
|
|
||||||
<entry
|
|
||||||
committed-rev="504"
|
|
||||||
name=""
|
|
||||||
committed-date="2004-09-16T12:58:13.686683Z"
|
|
||||||
url="svn://potter/mstp/current/ports/pic18"
|
|
||||||
kind="dir"
|
|
||||||
uuid="f7de03cf-50d5-0310-9ee6-baecd260521e"
|
|
||||||
revision="512"/>
|
|
||||||
<entry
|
|
||||||
committed-rev="504"
|
|
||||||
name="rs485.c"
|
|
||||||
text-time="2004-09-16T12:55:13.000000Z"
|
|
||||||
committed-date="2004-09-16T12:58:13.686683Z"
|
|
||||||
checksum="9dc1c381333c134b8c6708b475224ca5"
|
|
||||||
kind="file"/>
|
|
||||||
</wc-entries>
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
4
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
END
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
END
|
|
||||||
@@ -1,119 +0,0 @@
|
|||||||
/*####COPYRIGHTBEGIN####
|
|
||||||
-------------------------------------------
|
|
||||||
Copyright (C) 2004 Steve Karg
|
|
||||||
|
|
||||||
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, write to:
|
|
||||||
The Free Software Foundation, Inc.
|
|
||||||
59 Temple Place - Suite 330
|
|
||||||
Boston, MA 02111-1307
|
|
||||||
USA.
|
|
||||||
|
|
||||||
As a special exception, if other files instantiate templates or
|
|
||||||
use macros or inline functions from this file, or you compile
|
|
||||||
this file and link it with other works to produce a work based
|
|
||||||
on this file, this file does not by itself cause the resulting
|
|
||||||
work to be covered by the GNU General Public License. However
|
|
||||||
the source code for this file must still be made available in
|
|
||||||
accordance with section (3) of the GNU General Public License.
|
|
||||||
|
|
||||||
This exception does not invalidate any other reasons why a work
|
|
||||||
based on this file might be covered by the GNU General Public
|
|
||||||
License.
|
|
||||||
-------------------------------------------
|
|
||||||
####COPYRIGHTEND####*/
|
|
||||||
|
|
||||||
// The module handles sending data out the RS-485 port
|
|
||||||
// and handles receiving data from the RS-485 port.
|
|
||||||
// Customize this file for your specific hardware
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
#include "mstp.h"
|
|
||||||
|
|
||||||
// Transmits a Frame on the wire
|
|
||||||
void RS485_Send_Frame(
|
|
||||||
struct mstp_port_struct_t *mstp_port, // port to send from
|
|
||||||
uint8_t frame_type, // type of frame to send - see defines
|
|
||||||
uint8_t destination, // destination address
|
|
||||||
uint8_t source, // source address
|
|
||||||
uint8_t *data, // any data to be sent - may be null
|
|
||||||
unsigned data_len) // number of bytes of data (up to 501)
|
|
||||||
{
|
|
||||||
uint8_t HeaderCRC; // used for running CRC calculation
|
|
||||||
|
|
||||||
(void)frame_type; // FIXME: temp until we implement this code
|
|
||||||
(void)destination; // FIXME: temp until we implement this code
|
|
||||||
(void)source; // FIXME: temp until we implement this code
|
|
||||||
(void)data; // FIXME: temp until we implement this code
|
|
||||||
(void)data_len; // FIXME: temp until we implement this code
|
|
||||||
// in order to avoid line contention
|
|
||||||
while (mstp_port->SilenceTimer < Tturnaround)
|
|
||||||
{
|
|
||||||
// wait, yield, or whatever
|
|
||||||
}
|
|
||||||
|
|
||||||
// Disable the receiver, and enable the transmit line driver.
|
|
||||||
|
|
||||||
// Transmit the preamble octets X'55', X'FF'.
|
|
||||||
// As each octet is transmitted, set SilenceTimer to zero.
|
|
||||||
|
|
||||||
HeaderCRC = 0xFF;
|
|
||||||
|
|
||||||
// Transmit the Frame Type, Destination Address, Source Address,
|
|
||||||
// and Data Length octets. Accumulate each octet into HeaderCRC.
|
|
||||||
// As each octet is transmitted, set SilenceTimer to zero.
|
|
||||||
|
|
||||||
// Transmit the ones-complement of HeaderCRC. Set SilenceTimer to zero.
|
|
||||||
|
|
||||||
// If there are data octets, initialize DataCRC to X'FFFF'.
|
|
||||||
|
|
||||||
// Transmit any data octets. Accumulate each octet into DataCRC.
|
|
||||||
// As each octet is transmitted, set SilenceTimer to zero.
|
|
||||||
|
|
||||||
// Transmit the ones-complement of DataCRC, least significant octet first.
|
|
||||||
// As each octet is transmitted, set SilenceTimer to zero.
|
|
||||||
|
|
||||||
// Wait until the final stop bit of the most significant CRC octet
|
|
||||||
// has been transmitted but not more than Tpostdrive.
|
|
||||||
|
|
||||||
// Disable the transmit line driver.
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// called by timer, interrupt(?) or other thread
|
|
||||||
void RS485_Check_UART_Data(struct mstp_port_struct_t *mstp_port)
|
|
||||||
{
|
|
||||||
if (mstp_port->ReceiveError == true)
|
|
||||||
{
|
|
||||||
// wait for state machine to clear this
|
|
||||||
}
|
|
||||||
// wait for state machine to read from the DataRegister
|
|
||||||
else if (mstp_port->DataAvailable == false)
|
|
||||||
{
|
|
||||||
// check for data
|
|
||||||
|
|
||||||
// if error,
|
|
||||||
// ReceiveError = TRUE;
|
|
||||||
// return;
|
|
||||||
|
|
||||||
mstp_port->DataRegister = 0; // FIXME: Get this data from UART or buffer
|
|
||||||
|
|
||||||
// if data is ready,
|
|
||||||
// DataAvailable = TRUE;
|
|
||||||
// return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
This is a Subversion working copy administrative directory.
|
|
||||||
Visit http://subversion.tigris.org/ for more information.
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<wc-entries
|
|
||||||
xmlns="svn:">
|
|
||||||
<entry
|
|
||||||
committed-rev="503"
|
|
||||||
name=""
|
|
||||||
committed-date="2004-09-16T12:45:02.597419Z"
|
|
||||||
url="svn://potter/mstp/current/ports/rtos32"
|
|
||||||
kind="dir"
|
|
||||||
uuid="f7de03cf-50d5-0310-9ee6-baecd260521e"
|
|
||||||
revision="512"/>
|
|
||||||
</wc-entries>
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
4
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
This is a Subversion working copy administrative directory.
|
|
||||||
Visit http://subversion.tigris.org/ for more information.
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<wc-entries
|
|
||||||
xmlns="svn:">
|
|
||||||
<entry
|
|
||||||
committed-rev="504"
|
|
||||||
name=""
|
|
||||||
committed-date="2004-09-16T12:58:13.686683Z"
|
|
||||||
url="svn://potter/mstp/current/test"
|
|
||||||
kind="dir"
|
|
||||||
uuid="f7de03cf-50d5-0310-9ee6-baecd260521e"
|
|
||||||
revision="512"/>
|
|
||||||
<entry
|
|
||||||
committed-rev="496"
|
|
||||||
name="ctest.c"
|
|
||||||
text-time="2004-09-15T13:53:12.000000Z"
|
|
||||||
committed-date="2004-09-14T20:53:26.281408Z"
|
|
||||||
checksum="9686a78c29a7335ad710a24c45d9a884"
|
|
||||||
kind="file"
|
|
||||||
prop-time="2004-09-15T13:53:12.000000Z"/>
|
|
||||||
<entry
|
|
||||||
committed-rev="496"
|
|
||||||
name="ctest.h"
|
|
||||||
text-time="2004-09-15T13:53:12.000000Z"
|
|
||||||
committed-date="2004-09-14T20:53:26.281408Z"
|
|
||||||
checksum="a722ba8d0b234c43b83a8a8a20f934d5"
|
|
||||||
kind="file"
|
|
||||||
prop-time="2004-09-15T13:53:12.000000Z"/>
|
|
||||||
</wc-entries>
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
4
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
END
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
END
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
END
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
END
|
|
||||||
@@ -1,182 +0,0 @@
|
|||||||
/* ctest.c: Implements the CTest Framework */
|
|
||||||
|
|
||||||
#include "ctest.h"
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <assert.h>
|
|
||||||
|
|
||||||
/* Number of tests to hold incrementally */
|
|
||||||
enum {CHUNK = 10};
|
|
||||||
|
|
||||||
Test* ct_create(const char* name, void (*init)(Test*))
|
|
||||||
{
|
|
||||||
int backOutLevel = 0;
|
|
||||||
Test* pTest = malloc(sizeof(Test));
|
|
||||||
if (pTest)
|
|
||||||
{
|
|
||||||
pTest->nPass = pTest->nFail = pTest->nTests = 0;
|
|
||||||
pTest->pStream = stdout;
|
|
||||||
|
|
||||||
/* Allocate array of fptrs: */
|
|
||||||
assert(CHUNK);
|
|
||||||
pTest->pTestFuns = calloc(CHUNK, sizeof(TestFunc));
|
|
||||||
if (pTest->pTestFuns)
|
|
||||||
{
|
|
||||||
pTest->maxTests = CHUNK;
|
|
||||||
/* Allocate test name: */
|
|
||||||
assert(name);
|
|
||||||
pTest->name = malloc(strlen(name) + 1);
|
|
||||||
if (pTest->name)
|
|
||||||
strcpy(pTest->name, name);
|
|
||||||
else
|
|
||||||
++backOutLevel;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
++backOutLevel;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Back-out allocations if memory failed: */
|
|
||||||
if (backOutLevel)
|
|
||||||
{
|
|
||||||
switch(backOutLevel)
|
|
||||||
{
|
|
||||||
case 2:
|
|
||||||
free(pTest->pTestFuns);
|
|
||||||
pTest->pTestFuns = NULL;
|
|
||||||
case 1:
|
|
||||||
free(pTest);
|
|
||||||
pTest = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (init)
|
|
||||||
{
|
|
||||||
assert(pTest);
|
|
||||||
init(pTest);
|
|
||||||
}
|
|
||||||
return pTest;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ct_destroy(Test* pTest)
|
|
||||||
{
|
|
||||||
assert(pTest);
|
|
||||||
assert(pTest->pTestFuns);
|
|
||||||
free(pTest->pTestFuns);
|
|
||||||
pTest->pTestFuns = NULL;
|
|
||||||
assert(pTest->name);
|
|
||||||
free(pTest->name);
|
|
||||||
pTest->name = NULL;
|
|
||||||
free(pTest);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ct_addTestFunction(Test* pTest, TestFunc tfun)
|
|
||||||
{
|
|
||||||
assert(pTest);
|
|
||||||
assert(pTest->pTestFuns);
|
|
||||||
if (pTest->nTests == pTest->maxTests)
|
|
||||||
{
|
|
||||||
size_t newSize = pTest->nTests + CHUNK;
|
|
||||||
TestFunc* new_pTestFuns =
|
|
||||||
realloc(pTest->pTestFuns,
|
|
||||||
newSize * sizeof(TestFunc));
|
|
||||||
if (!new_pTestFuns)
|
|
||||||
return FALSE;
|
|
||||||
pTest->pTestFuns = new_pTestFuns;
|
|
||||||
pTest->maxTests += CHUNK;
|
|
||||||
}
|
|
||||||
assert(pTest->nTests < pTest->maxTests);
|
|
||||||
pTest->pTestFuns[pTest->nTests++] = tfun;
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ct_setStream(Test* pTest, FILE* pStream)
|
|
||||||
{
|
|
||||||
pTest->pStream = pStream;
|
|
||||||
}
|
|
||||||
|
|
||||||
FILE* ct_getStream(Test* pTest)
|
|
||||||
{
|
|
||||||
return pTest->pStream;
|
|
||||||
}
|
|
||||||
|
|
||||||
long ct_report(Test* pTest)
|
|
||||||
{
|
|
||||||
assert(pTest);
|
|
||||||
if (pTest->pStream)
|
|
||||||
{
|
|
||||||
fprintf(pTest->pStream,
|
|
||||||
"Test \"%s\":\n\tPassed: %ld\n\tFailed: %ld\n",
|
|
||||||
pTest->name, pTest->nPass, pTest->nFail);
|
|
||||||
}
|
|
||||||
return pTest->nFail;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ct_succeed(Test* pTest)
|
|
||||||
{
|
|
||||||
assert(pTest);
|
|
||||||
++pTest->nPass;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ct_do_test(Test* pTest, const char* str,
|
|
||||||
bool cond, const char* file, long line)
|
|
||||||
{
|
|
||||||
assert(pTest);
|
|
||||||
if (!cond)
|
|
||||||
ct_do_fail(pTest, str, file, line);
|
|
||||||
else
|
|
||||||
ct_succeed(pTest);
|
|
||||||
}
|
|
||||||
|
|
||||||
void ct_do_fail(Test* pTest, const char* str,
|
|
||||||
const char* file, long line)
|
|
||||||
{
|
|
||||||
assert(pTest);
|
|
||||||
++pTest->nFail;
|
|
||||||
if (pTest->pStream)
|
|
||||||
{
|
|
||||||
fprintf(pTest->pStream,
|
|
||||||
"%s failure: (%s), %s (line %ld)\n",
|
|
||||||
pTest->name, str, file, line);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
long ct_getNumPassed(Test* pTest)
|
|
||||||
{
|
|
||||||
assert(pTest);
|
|
||||||
return pTest->nPass;
|
|
||||||
}
|
|
||||||
|
|
||||||
long ct_getNumFailed(Test* pTest)
|
|
||||||
{
|
|
||||||
assert(pTest);
|
|
||||||
return pTest->nFail;
|
|
||||||
}
|
|
||||||
|
|
||||||
long ct_run(Test* pTest)
|
|
||||||
{
|
|
||||||
size_t testNum;
|
|
||||||
assert(pTest);
|
|
||||||
for (testNum = 0; testNum < pTest->nTests; ++testNum)
|
|
||||||
pTest->pTestFuns[testNum](pTest);
|
|
||||||
return pTest->nFail;
|
|
||||||
}
|
|
||||||
|
|
||||||
void ct_reset(Test* pTest)
|
|
||||||
{
|
|
||||||
assert(pTest);
|
|
||||||
pTest->nFail = pTest->nPass = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char* ct_getName(Test* pTest)
|
|
||||||
{
|
|
||||||
assert(pTest);
|
|
||||||
return (pTest->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
long ct_getNumTests(Test* pTest)
|
|
||||||
{
|
|
||||||
assert(pTest);
|
|
||||||
return pTest->nTests;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
/* ctest.h
|
|
||||||
*
|
|
||||||
* Defines a test framework for C projects.
|
|
||||||
*/
|
|
||||||
#ifndef CTEST_H
|
|
||||||
#define CTEST_H
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
#define ct_test(test, cond) \
|
|
||||||
ct_do_test(test, #cond, cond, __FILE__, __LINE__)
|
|
||||||
#define ct_fail(test, str) \
|
|
||||||
ct_do_fail(test, str, __FILE__, __LINE__)
|
|
||||||
|
|
||||||
typedef struct _Test Test;
|
|
||||||
|
|
||||||
typedef void (*TestFunc)(Test*);
|
|
||||||
|
|
||||||
struct _Test
|
|
||||||
{
|
|
||||||
char* name;
|
|
||||||
FILE* pStream;
|
|
||||||
size_t nTests;
|
|
||||||
size_t maxTests;
|
|
||||||
TestFunc* pTestFuns;
|
|
||||||
long nPass;
|
|
||||||
long nFail;
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
Test* ct_create(const char* name, void (*init)(Test*));
|
|
||||||
void ct_destroy(Test* pTest);
|
|
||||||
|
|
||||||
const char* ct_getName(Test* pTest);
|
|
||||||
long ct_getNumPassed(Test* pTest);
|
|
||||||
long ct_getNumFailed(Test* pTest);
|
|
||||||
long ct_getNumTests(Test* pTest);
|
|
||||||
FILE* ct_getStream(Test* pTest);
|
|
||||||
void ct_setStream(Test* pTest, FILE* stream);
|
|
||||||
|
|
||||||
bool ct_addTestFunction(Test* pTest, TestFunc tfun);
|
|
||||||
void ct_succeed(Test* pTest);
|
|
||||||
long ct_run(Test* pTest);
|
|
||||||
long ct_report(Test* pTest);
|
|
||||||
void ct_reset(Test* pTest);
|
|
||||||
|
|
||||||
/* Not intended for end-users: */
|
|
||||||
void ct_do_test(Test* pTest, const char* str,
|
|
||||||
bool cond, const char* file, long line);
|
|
||||||
void ct_do_fail(Test* pTest, const char* str,
|
|
||||||
const char* file, long line);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
Reference in New Issue
Block a user