Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: TextLCD mbed-rtos mbed
main.cpp
- Committer:
- terryfan
- Date:
- 2016-12-02
- Revision:
- 1:57cd3ae5f44a
- Parent:
- 0:da581483b90d
- Child:
- 2:18b496a20413
File content as of revision 1:57cd3ae5f44a:
#include "mbed.h"
#include "rtos.h"
#include "TextLCD.h"
LocalFileSystem local("local");
InterruptIn vpace(p5);
InterruptIn apace(p6);
DigitalOut vsignal(p7);
DigitalOut asignal(p8);
DigitalOut asignal_led(LED1);
DigitalOut vsignal_led(LED2);
DigitalOut apace_led(LED3);
DigitalOut vpace_led(LED4);
Thread *heartmodeThread;
osThreadId heartmodeTid;
Queue<char,256> mode_q;
Queue<char,256> signal_q;
FILE * testresults;
/////////////////
TextLCD lcd(p15, p16, p17, p18, p19, p20, TextLCD::LCD16x2);
RawSerial pc(USBTX, USBRX);
char key = 'n';
int manual_mode;
int isChangingObsInt;
/////////////////
volatile char c;
volatile int mm = 0;
int lri = 1000;
int uri = 700;
int avi = 150;
int pvarp = 300;
int vrp = 200;
int arp = 50;
int twait = 10;
int thrsh = 1000;
int heartmode = 0;
void vpace_irq()
{
//heartmodeThread->signal_set(0x1);
osSignalSet(heartmodeTid, 0x1);
}
void apace_irq()
{
//heartmodeThread->signal_set(0x10);
osSignalSet(heartmodeTid, 0x10);
}
void Rx_interrupt()
{
while(pc.readable()) {
c = pc.getc();
if(c == 'm') {
mode_q.put((char*)c);
mm = 1;
} else if(c == 'r' || c == 't') {
mode_q.put((char*)c);
mm = 0;
} else if((c == 'a' || c == 'v') && mm) {
signal_q.put((char*)c);
}
}
}
void test_vrp_vv(FILE * results, Timer * ti)
{
int vrpwait = vrp/2;
int adifu,vdifu,difl = 0;
fprintf(results, " Test VRP VV\n\n Time Action\n");
osSignalWait(0x10, osWaitForever);
apace_led = 1;
Thread::wait(twait);
apace_led = 0;
osSignalWait(0x1, osWaitForever);
ti->reset();
vpace_led = 1;
Thread::wait(twait);
vpace_led = 0;
Thread::wait(vrpwait);
vsignal = 1;
vsignal_led = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "VS");
Thread::wait(twait);
vsignal_led = 0;
vsignal = 0;
Thread::wait(vrpwait);
vsignal = 1;
difl = ti->read_us();
vsignal_led = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "VS");
Thread::wait(twait);
vsignal = 0;
vsignal_led = 0;
osSignalWait(0x10, osWaitForever);
adifu = ti->read_us();
apace_led = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "AP");
Thread::wait(twait);
apace_led = 0;
osSignalWait(0x1, osWaitForever);
vdifu = ti->read_us();
vpace_led = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "VP");
Thread::wait(twait);
vpace_led = 0;
int adif = adifu-difl;
int vdif = vdifu-difl;
const char * res = ((adif >= ((lri-avi)*1000 - thrsh)) &&
(adif < ((lri-avi)*1000 + thrsh)) &&
(vdif >= (lri*1000 - thrsh)) &&
(vdif < (lri*1000 + thrsh))) ? "Passed": "Failed";
fprintf(results, "\nResult: %s %d %d\n\n", res, adif, vdif);
}
void test_pvarp_aa(FILE * results, Timer * ti)
{
int pvarpwait = pvarp/2;
int vdifu = 0;
fprintf(results, " Test PVARP AA\n\n Time Action\n");
osSignalWait(0x10, osWaitForever);
apace_led = 1;
Thread::wait(twait);
apace_led = 0;
osSignalWait(0x1, osWaitForever);
ti->reset();
vpace_led = 1;
Thread::wait(twait);
vpace_led = 0;
Thread::wait(pvarpwait);
asignal = 1;
asignal_led = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "AS");
Thread::wait(twait);
asignal_led = 0;
asignal = 0;
Thread::wait(pvarpwait);
asignal = 1;
//difl = ti->read_us();
asignal_led = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "AS");
Thread::wait(twait);
asignal_led = 0;
asignal = 0;
osSignalWait(0x1, osWaitForever);
vdifu = ti->read_us();
vpace_led = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "VP");
Thread::wait(twait);
vpace_led = 0;
int vdif = vdifu;
const char * res = ((vdif >= (uri*1000 - thrsh)) &&
(vdif < (uri*1000 + thrsh))) ? "Passed": "Failed";
fprintf(results, "\nResult: %s %d\n\n", res, vdif);
}
void test_pvarp_arp_aaa(FILE * results, Timer * ti)
{
int arpwait = arp/2;
int vdifu = 0;
fprintf(results, "Test PVARP ARP AAA\n\n Time Action\n");
osSignalWait(0x10, osWaitForever);
apace_led = 1;
Thread::wait(twait);
apace_led = 0;
osSignalWait(0x1, osWaitForever);
ti->reset();
vpace_led = 1;
Thread::wait(twait);
vpace_led = 0;
Thread::wait(pvarp);
asignal = 1;
asignal_led = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "AS");
Thread::wait(twait);
asignal_led = 0;
asignal = 0;
Thread::wait(arpwait);
asignal = 1;
asignal_led = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "AS");
Thread::wait(twait);
asignal_led = 0;
asignal = 0;
Thread::wait(arpwait);
asignal = 1;
asignal_led = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "AS");
Thread::wait(twait);
asignal_led = 0;
asignal = 0;
osSignalWait(0x1, osWaitForever);
vdifu = ti->read_us();
vpace_led = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "VP");
Thread::wait(twait);
vpace_led = 0;
int vdif = vdifu;
const char * res = ((vdif >= (uri*1000 - thrsh)) &&
(vdif < (uri*1000 + thrsh))) ? "Passed": "Failed";
fprintf(results, "\nResult: %s %d\n\n", res, vdif);
}
void test_pvarp_arp_aav(FILE * results, Timer * ti)
{
int adifu,vdifu,difl = 0;
fprintf(results, "Test PVARP ARP AAV\n\n Time Action\n");
osSignalWait(0x10, osWaitForever);
apace_led = 1;
Thread::wait(twait);
apace_led = 0;
osSignalWait(0x1, osWaitForever);
ti->reset();
vpace_led = 1;
Thread::wait(twait);
vpace_led = 0;
Thread::wait(pvarp);
asignal = 1;
asignal_led = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "AS");
Thread::wait(twait);
asignal_led = 0;
asignal = 0;
Thread::wait(arp);
asignal = 1;
asignal_led = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "AS");
Thread::wait(twait);
asignal_led = 0;
asignal = 0;
Thread::wait(20);
vsignal = 1;
difl = ti->read_us();
vsignal_led = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "VS");
Thread::wait(twait);
vsignal = 0;
vsignal_led = 0;
osSignalWait(0x10, osWaitForever);
adifu = ti->read_us();
apace_led = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "AP");
Thread::wait(twait);
apace_led = 0;
osSignalWait(0x1, osWaitForever);
vdifu = ti->read_us();
vpace_led = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "VP");
Thread::wait(twait);
vpace_led = 0;
int adif = adifu-difl;
int vdif = vdifu-difl;
const char * res = ((adif >= ((lri-avi)*1000 - thrsh)) &&
(adif < ((lri-avi)*1000 + thrsh)) &&
(vdif >= (lri*1000 - thrsh)) &&
(vdif < (lri*1000 + thrsh))) ? "Passed": "Failed";
fprintf(results, "\nResult: %s %d %d\n\n", res, adif, vdif);
}
void test_vpace_after_a(FILE * results, Timer * ti)
{
int vdifu = 0;
fprintf(results, "Test VPACE After A\n\n Time Action\n");
osSignalWait(0x10, osWaitForever);
apace_led = 1;
Thread::wait(twait);
apace_led = 0;
osSignalWait(0x1, osWaitForever);
ti->reset();
vpace_led = 1;
Thread::wait(twait);
vpace_led = 0;
Thread::wait(pvarp);
asignal = 1;
asignal_led = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "AS");
Thread::wait(twait);
asignal_led = 0;
asignal = 0;
osSignalWait(0x1, osWaitForever);
vdifu = ti->read_us();
vpace_led = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "VP");
Thread::wait(twait);
vpace_led = 0;
int vdif = vdifu;
const char * res = ((vdif >= (uri*1000 - thrsh)) &&
(vdif < (uri*1000 + thrsh))) ? "Passed": "Failed";
fprintf(results, "\nResult: %s %d\n\n", res, vdif);
}
void test_apace_vpace_av(FILE * results, Timer * ti)
{
fprintf(results, "Test APACE After V\n\n Time Action\n");
int adifu,vdifu = 0;
osSignalWait(0x10, osWaitForever);
apace_led = 1;
Thread::wait(twait);
apace_led = 0;
osSignalWait(0x1, osWaitForever);
ti->reset();
vpace_led = 1;
Thread::wait(twait);
vpace_led = 0;
osSignalWait(0x10, osWaitForever);
adifu = ti->read_us();
apace_led = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "AP");
Thread::wait(twait);
apace_led = 0;
osSignalWait(0x1, osWaitForever);
vdifu = ti->read_us();
vpace_led = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "VP");
Thread::wait(twait);
vpace_led = 0;
int adif = adifu;
int vdif = vdifu;
const char * res = ((adif >= ((lri-avi)*1000 - thrsh)) &&
(adif < ((lri-avi)*1000 + thrsh)) &&
(vdif >= (lri*1000 - thrsh)) &&
(vdif < (lri*1000 + thrsh))) ? "Passed": "Failed";
fprintf(results, "\nResult: %s %d %d\n\n", res, adif, vdif);
}
void test_avi_a(FILE * results, Timer * ti)
{
int vdifu,difl = 0;
fprintf(results, " Test AVI\n\n Time Action\n");
osSignalWait(0x10, osWaitForever);
apace_led = 1;
Thread::wait(twait);
apace_led = 0;
osSignalWait(0x1, osWaitForever);
ti->reset();
vpace_led = 1;
Thread::wait(twait);
vpace_led = 0;
Thread::wait(uri);
asignal = 1;
difl = ti->read_us();
asignal_led = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "AS");
Thread::wait(twait);
asignal_led = 0;
asignal = 0;
osSignalWait(0x1, osWaitForever);
vdifu = ti->read_us();
vpace_led = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "VP");
Thread::wait(twait);
vpace_led = 0;
int vpc = (avi*1000) + difl;
const char * res = ((vpc >= (vdifu - thrsh)) &&
(vpc < (vdifu + thrsh))) ? "Passed": "Failed";
fprintf(results, "\nResult: %s %d\n\n", res, vpc);
}
void test_uri_a(FILE * results, Timer * ti)
{
int vdifu = 0;
fprintf(results, " Test URI\n\n Time Action\n");
osSignalWait(0x10, osWaitForever);
apace_led = 1;
Thread::wait(twait);
apace_led = 0;
osSignalWait(0x1, osWaitForever);
ti->reset();
vpace_led = 1;
Thread::wait(twait);
vpace_led = 0;
Thread::wait(pvarp);
asignal = 1;
asignal_led = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "AS");
Thread::wait(twait);
asignal_led = 0;
asignal = 0;
osSignalWait(0x1, osWaitForever);
vdifu = ti->read_us();
vpace_led = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "VP");
Thread::wait(twait);
vpace_led = 0;
int vdif = vdifu;
const char * res = ((vdif >= (uri*1000 - thrsh)) &&
(vdif < (uri*1000 + thrsh))) ? "Passed": "Failed";
fprintf(results, "\nResult: %s %d\n\n", res, vdif);
}
void test_normal_10(FILE * results, Timer * ti)
{
fprintf(results, " Test Normal x10\n\n Time Action\n");
int adifu,vdifu,difl,i = 0;
osSignalWait(0x10, osWaitForever);
apace_led = 1;
Thread::wait(twait);
apace_led = 0;
osSignalWait(0x1, osWaitForever);
ti->reset();
vpace_led = 1;
Thread::wait(twait);
vpace_led = 0;
while(i < 10) {
Thread::wait(pvarp);
asignal = 1;
asignal_led = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "AS");
Thread::wait(twait);
asignal_led = 0;
asignal = 0;
Thread::wait(75);
vsignal = 1;
difl = ti->read_us();
vsignal_led = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "VS");
Thread::wait(twait);
vsignal = 0;
vsignal_led = 0;
i = i+1;
}
osSignalWait(0x10, osWaitForever);
adifu = ti->read_us();
apace_led = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "AP");
Thread::wait(twait);
apace_led = 0;
osSignalWait(0x1, osWaitForever);
vdifu = ti->read_us();
vpace_led = 1;
fprintf(results, "%6d%8s\n", ti->read_ms(), "VP");
Thread::wait(twait);
vpace_led = 0;
int adif = adifu - difl;
int vdif = vdifu - difl;
const char * res = ((adif >= ((lri-avi)*1000 - thrsh)) &&
(adif < ((lri-avi)*1000 + thrsh)) &&
(vdif >= (lri*1000 - thrsh)) &&
(vdif < (lri*1000 + thrsh))) ? "Passed": "Failed";
fprintf(results, "\nResult: %s %d %d\n\n", res, adif, vdif);
}
void testmode(void const *args)
{
Timer *t;
testresults = fopen("/local/testreport.txt", "w"); // Open "out.txt" on the local file system for writing
t = new Timer();
t->start();
test_vrp_vv(testresults, t);
test_pvarp_aa(testresults, t);
test_pvarp_arp_aaa(testresults, t);
test_pvarp_arp_aav(testresults, t);
test_vpace_after_a(testresults, t);
test_apace_vpace_av(testresults, t);
test_avi_a(testresults, t);
test_uri_a(testresults, t);
test_normal_10(testresults, t);
fclose(testresults);
}
void randommode(void const *args)
{
int aorv,sig = 0;
Timer at,vt;
at.start();
vt.start();
//osEvent ext_signal = osSignalWait(0, 1);
//int evt = ext_signal.value.signals;
//osSignalSet(heartmodeTid, 0x1);
//osSignalWait(0, osWaitForever);
while(heartmode == 0) {
aorv = (float)(rand()%2);
sig = aorv ? rand()%(lri - avi - at.read_ms()) : rand()%(lri - vt.read_ms());
osEvent ext_signal = osSignalWait(0, sig);
int evt = ext_signal.value.signals;
switch(evt) {
case(0x0):
if(aorv) {
asignal = 1;
asignal_led = 1;
Thread::wait(twait);
asignal_led = 0;
asignal = 0;
break;
} else {
vsignal = 1;
at.reset();
vt.reset();
vsignal_led = 1;
Thread::wait(twait);
vsignal_led = 0;
vsignal = 0;
break;
}
case(0x1):
at.reset();
vt.reset();
vpace_led = 1;
Thread::wait(twait);
vpace_led = 0;
break;
case(0x10):
apace_led = 1;
Thread::wait(twait);
apace_led = 0;
break;
// case(0x100):
//
}
}
}
void manualmode(void const *args)
{
while(1) {
osEvent evt = signal_q.get();
if(evt.status == osEventMessage) {
if((char)evt.value.p == 'a') {
asignal = 1;
asignal_led = 1;
Thread::wait(twait);
asignal_led = 0;
asignal = 0;
} else if((char)evt.value.p == 'v') {
vsignal = 1;
vsignal_led = 1;
Thread::wait(twait);
vsignal = 0;
vsignal_led = 0;
}
}
}
}
osThreadDef(randommode, osPriorityNormal, DEFAULT_STACK_SIZE);
osThreadDef(testmode, osPriorityNormal, DEFAULT_STACK_SIZE);
osThreadDef(manualmode, osPriorityNormal, DEFAULT_STACK_SIZE);
int main()
{
vpace.rise(&vpace_irq);
apace.rise(&apace_irq);
pc.attach(&Rx_interrupt, RawSerial::RxIrq);
//heartmodeThread = new Thread();
//Callback<void()> testmodeTask((void*)NULL,(void (*)(void *))&testmode);
heartmodeTid = osThreadCreate(osThread(randommode), NULL);
// heartmodeTid = osThreadCreate(osThread(testmode), NULL);
// heartmodeTid = osThreadCreate(osThread(manualmode), NULL);
// lcd.printf();
while(true) {
// while(pc.readable()) {
// key = pc.getc();
osEvent evt = mode_q.get();
if(evt.status == osEventMessage) {
switch((char)evt.value.p) {
//pvarp = 0.3s
case('r'):
lcd.printf("R");
// randommode.terminate();
osThreadTerminate (heartmodeTid);
if (testresults != NULL) {
fclose(testresults);
}
asignal_led = 0;
vsignal_led = 0;
apace_led = 0;
vpace_led = 0;
heartmodeTid = osThreadCreate(osThread(randommode), NULL);
// Thread::wait(100);
break;
case('t'):
lcd.printf("T");
osThreadTerminate (heartmodeTid);
if (testresults != NULL) {
fclose(testresults);
}
asignal_led = 0;
vsignal_led = 0;
apace_led = 0;
vpace_led = 0;
heartmodeTid = osThreadCreate(osThread(testmode), NULL);
break;
case('m'):
lcd.printf("M");
osThreadTerminate (heartmodeTid);
if (testresults != NULL) {
fclose(testresults);
}
asignal_led = 0;
vsignal_led = 0;
apace_led = 0;
vpace_led = 0;
heartmodeTid = osThreadCreate(osThread(manualmode), NULL);
manual_mode = 1;
break;
case('o'):
isChangingObsInt = 1;
lcd.printf("O");
break;
}
}
}
}