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: EthernetInterface MbedJSONValue SDFileSystem mbed-rtos mbed
Fork of Gate_Aidik_FRDM_v2 by
main.cpp
- Committer:
- irsanjul
- Date:
- 2016-08-22
- Revision:
- 0:fbb75122015f
- Child:
- 1:021273f6b9f4
- Child:
- 2:e870bcd7e63b
File content as of revision 0:fbb75122015f:
#include "mbed.h"
#include "EthernetInterface.h"
#include "SDFileSystem.h"
#include <string>
#define IP_CONF_PORT 50004
#define ijo 0
#define merah 1
UDPSocket sock, ip_conf, trx_ser; //gen_con,
Endpoint multi, server; //,multi_data;
SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd");
DigitalOut Stdby_R(LED2), Sopir_R(LED3), Res_R(LED1), MT_R(LED4), Gate(PTB9), Sleep(PTA1), Reset(PTB23, 1);
DigitalInOut Std_G(PTC5), Std_R(PTC7), Spr_G(PTC0), Spr_R(PTC9), Mt_G(PTC8), Mt_R(PTC1), Pow(PTB19), iBtn(PTB18);
DigitalIn print_er(PTC2), print_done(PTB2);
Serial dbg(USBTX, USBRX);
Serial pc(PTC17, PTC16);
char IP[16], SUBNET[16], GATEWAY[16], MCAST[16];
char PortListen[6], PortSend[6], PortHeartB[6];
char IDX[4];
char Baud[6];
int BAUD = 19200;
int width, TICK = 0;
unsigned char ID[8], idx, idy, id_addr = 0x33, ix, er_tmp1 = 0, er_tmp2 = 0,
sprmt = 0; // state = 1,
char text[26], ch, rx_buff[6], tx_buff[7], //86
hex[17] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B',
'C', 'D', 'E', 'F' }; //,
/*Contoh format data
<02>GI01S0123456789ABCDEF00<03>
<02>GI01M0123456789ABCDEF00<03>
<02> ->start
GI -> Lokasi <G = Gate> <I = Input> <O = Output>
01 -> ID
S -> Supir <S = Supir> <M = MT>
0123456789ABCDEF -> iButton data
00 -> reserved
<03> -> stop
format heartbeat
<02>GI0100000000<03>
format validasi
<02>V01<03>
1, idle
2, stdby/ idle
3, merah/sopir
4, bitu/ MT
5, buka gate
format ipconfig
<02> 192.168.1.116, 255.255.255.0, 192.168.1.1, 192.168.1.10, 50000, 50001, 50003, GI01$<03>
#192.168.1.116, 255.255.255.0, 192.168.1.1, 192.168.1.10, 50000, 50001, 50003, GI01$
2, stdby
3, merah/sopir
4, biru MT
*/
void Standby(bool warna, bool nyala) {
switch (nyala) {
case 0:
if (warna == ijo) {
Stdby_R = 0; // led 2
Std_G.output();
Std_G.write(0);
Std_G.input();
Std_G.mode(PullUp);
} else if (warna == merah) {
Std_R.output();
Std_R.write(0);
Std_R.input();
Std_R.mode(PullUp);
}
break;
case 1:
if (warna == ijo) {
Stdby_R = 1;
Std_G.output();
Std_G.write(1);
} else if (warna == merah) {
Std_R.output();
Std_R.write(1);
}
break;
}
}
void Sopir(bool warna, bool nyala) {
switch (nyala) {
case 0:
if (warna == ijo) {
Sopir_R = 0; // led 3
Spr_G.output();
Spr_G.write(0);
Spr_G.input();
Spr_G.mode(PullUp);
} else if (warna == merah) {
Spr_R.output();
Spr_R.write(0);
Spr_R.input();
Spr_R.mode(PullUp);
}
break;
case 1:
if (warna == ijo) {
Sopir_R = 1;
Spr_G.output();
Spr_G.write(1);
} else if (warna == merah) {
Spr_R.output();
Spr_R.write(1);
}
break;
}
}
void eMTy(bool warna, bool nyala) {
switch (nyala) {
case 0:
if (warna == ijo) {
MT_R = 0; // led 4
Mt_G.output();
Mt_G.write(0);
Mt_G.input();
Mt_G.mode(PullUp);
} else if (warna == merah) {
Mt_R.output();
Mt_R.write(0);
Mt_R.input();
Mt_R.mode(PullUp);
}
break;
case 1:
if (warna == ijo) {
MT_R = 1;
Mt_G.output();
Mt_G.write(1);
} else if (warna == merah) {
Mt_R.output();
Mt_R.write(1);
}
break;
}
}
void mbed_config_init() {
char chr[256];
int ilx = 0;
unsigned char n = 0, x = 0;
FILE *fp = fopen("/sd/IPCONF.TXT", "r");
if (fp == NULL)
dbg.printf("Error opening file");
else {
//dbg.printf("File Exist!\r\n");
do {
ilx++;
chr[ilx] = fgetc(fp);
//dbg.printf("%c",chr[ilx]);
} while (chr[ilx] != '$');
fclose(fp);
}
ilx = 1;
do {
if (chr[ilx] == '#') {
ilx = ilx + 1;
n = 1;
dbg.printf("Start file\r\n");
} else if (chr[ilx] == ',') {
n++;
x = 0;
ilx = ilx + 2;
}
switch (n) {
case 0:
break;
case 1:
IP[x] = chr[ilx];
break;
case 2:
SUBNET[x] = chr[ilx];
break;
case 3:
GATEWAY[x] = chr[ilx];
break;
case 4:
MCAST[x] = chr[ilx];
break;
case 5:
PortListen[x] = chr[ilx];
break;
case 6:
PortSend[x] = chr[ilx];
break;
case 7:
PortHeartB[x] = chr[ilx];
break;
case 8:
IDX[x] = chr[ilx];
break;
case 9:
Baud[x] = chr[ilx];
break;
}
x++;
ilx++;
} while (chr[ilx] != '$');
dbg.printf("IP Device = %s\r\n", IP);
dbg.printf("Subnet = %s\r\n", SUBNET);
dbg.printf("Gateway = %s\r\n", GATEWAY);
dbg.printf("Multicast IP = %s\r\n", MCAST);
dbg.printf("Server to mBed = %s\r\n", PortListen);
dbg.printf("mBed to Multicast = %s\r\n", PortSend);
dbg.printf("HeartBeat Port = %s\r\n", PortHeartB);
dbg.printf("device IDX = %s\r\n", IDX);
dbg.printf("Serial Baudrate = %s\r\n", Baud);
BAUD = atoi(Baud);
}
unsigned char reset(void) {
for (idx = 0; idx < 8; idx++) {
ID[idx] = 0;
}
ix = 0;
iBtn.output();
iBtn.write(0);
wait_us(480);
iBtn.write(1);
iBtn.mode(PullUp);
iBtn.input();
for (int i = 0; i < 180; i++) {
wait_us(1);
if (iBtn == 0) {
ix = 1;
}
}
wait_us(1);
if (ix == 0) {
return 0;
} else
return 1;
}
int write() {
iBtn.output();
iBtn.write(1);
for (idx = 0; idx < 8; idx++) {
for (int i = 0; i < 35; i++) {
wait_us(1);
if (i >= 2) {
iBtn.write((id_addr >> idx) & 1);
} else
iBtn.write(0);
}
iBtn.write(1);
}
wait_us(2);
return 0;
}
int read() {
iBtn.output();
iBtn.write(1);
for (idx = 0; idx < 8; idx++) {
for (idy = 0; idy < 8; idy++) {
width = 0;
iBtn.output();
iBtn.write(0);
wait_us(1);
iBtn.input();
for (int i = 0; i < 35; i++) {
wait_us(1);
if (iBtn.read()) {
width++;
}
}
if (width > 25) {
ID[idx] |= (1 << idy);
}
}
}
for (idx = 0; idx < 8; idx++) {
text[((7 - idx) * 2) + 7] = hex[ID[idx] & 0x0f];
text[((7 - idx) * 2) + 6] = hex[(ID[idx] >> 4) & 0x0f];
}
std::string str;
std::size_t found1;
str += text;
found1 = str.find("FFFFFFFFFF");
if(found1 == std::string::npos)
{
found1 = str.find("000000000000");
if(found1 == std::string::npos)
{
dbg.printf(text);
dbg.printf("\r\n");
}
}
return 0;
}
int cmpstr(const char *str, const char *sub) {
int length = strlen(sub);
if (length == 0)
return 0;
int count = 0;
for (str = strstr(str, sub); str; str = strstr(str + length, sub))
++count;
return count;
}
void Hartbit(unsigned char std) {
char hb_buff[20], hb_num[10];
static int hb;
hb_buff[0] = IDX[0];
hb_buff[1] = IDX[1];
hb_buff[2] = IDX[2];
hb_buff[3] = IDX[3];
multi.set_address(MCAST, atoi(PortHeartB));
hb++;
switch (std) {
case 0:
//Standby(0, 1);
if (hb < 375) {
Sopir(0, 1);
} else if ((hb >= 375) && (hb < 750)) {
Sopir(0, 0);
} else if ((hb >= 750) && (hb < 1125)) {
Sopir(0, 1);
} else if ((hb >= 1125) && (hb < 1500))
Sopir(0, 0);
if (hb >= 1500) {
sprintf(hb_num, "%d", TICK);
strcat(hb_buff, hb_num);
sock.sendTo(multi, hb_buff, sizeof(hb_buff));
hb = 0;
TICK++;
}
break;
case 1:
Standby(0, 0);
Standby(0, 1);
if (hb < 750) {
Standby(0, 1);
} else if ((hb >= 750) && (hb < 1500)) {
Standby(0, 0);
} else if ((hb >= 1500) && (hb < 2250)) {
Standby(0, 1);
} else if ((hb >= 2250) && (hb < 3000))
Standby(0, 0);
if (hb >= 3000) {
sprintf(hb_num, "%d", TICK);
strcat(hb_buff, hb_num);
sock.sendTo(multi, hb_buff, sizeof(hb_buff));
hb = 0;
TICK++;
}
break;
case 2:
Standby(0, 1);
if (hb >= 7000) {
sprintf(hb_num, "%d", TICK);
strcat(hb_buff, hb_num);
sock.sendTo(multi, hb_buff, sizeof(hb_buff));
hb = 0;
TICK++;
}
break;
}
}
int openForce() {
int n = sock.receiveFrom(server, rx_buff, sizeof(rx_buff));
if (n != 0) {
if ((rx_buff[1] == 'V') && (rx_buff[3] == '5')) {
eMTy(0, 0);
Sopir(0, 0);
wait(1);
Gate = 1; //BYPASS
wait_ms(1500); //BYPASS
Gate = 0; //BYPASS
sprmt = 0;
tx_buff[4] = 'P';
tx_buff[5] = '0';
tx_buff[6] = '0';
multi.set_address(MCAST, atoi(PortSend));
sock.sendTo(multi, tx_buff, sizeof(tx_buff));
} else if (rx_buff[1] == 'R') {
tx_buff[4] = 'P';
tx_buff[5] = '0';
tx_buff[6] = '0';
sprmt = 0;
multi.set_address(MCAST, atoi(PortSend));
sock.sendTo(multi, tx_buff, sizeof(tx_buff));
eMTy(0, 0);
Sopir(0, 0);
Gate = 0;
}
} else {
return 0;
}
return 0;
}
void write_config(char buff[90]){
FILE *fp = fopen("/sd/IPCONF.TXT", "w");
fprintf(fp, buff);
fclose(fp);
}
int set_IP() {
char ptr_data;
//server.set_address(SERVER,ER_SEND_PORT);
//char print_rx_buff[128];
char conf_buff[1024] = { 0 }, print_init[20] = { 0x1b, 0x40, 0x1b, 0x54,
0x1b/*,0x57*/, 0x00, 0x1b, 0x77, 0x00, 0x12, 0x1b, 0x43, 0x00, 0x06,
0x1b, 0x6c, 0x01, 0x12 };
int n = ip_conf.receiveFrom(server, conf_buff, sizeof(conf_buff));
if (n >= 0) {
//printf("Packet from \"%s\": %s\n", server.get_address(), conf_buff);
if (conf_buff[0] == '^') {
if (conf_buff[1] == 'R') {
Reset = 0;
} else if (conf_buff[1] == 'S') {
Sleep = 1;
Gate = 0;
int stop = 0;
while(stop != 1)
{
Spr_G.input();
Spr_G.mode(PullUp);
Mt_G.input();
Mt_G.mode(PullUp);
Std_G.input();
Std_G.mode(PullUp);
ip_conf.receiveFrom(server, conf_buff, sizeof(conf_buff));
if (conf_buff[0] == '^')
{
if (conf_buff[1] == 'W')
{
stop = 1;
Sleep = 0;
}
else if (conf_buff[1] == 'R')
{
stop = 0;
}
else if (conf_buff[1] == 'S')
{
stop = 0;
}
else stop = 0;
}
else if (conf_buff[0] == '2') stop = 0;
else stop = 0;
}
//sock.close(true);
} else if (conf_buff[1] == 'W') {
Sleep = 0;
//sock.bind(atoi(PortListen));
}
} else if (conf_buff[0] == '#') {
write_config(conf_buff);
} else if (conf_buff[0] == 0x0f) {
dbg.printf("%s", print_init);
pc.printf("%s", conf_buff);
ptr_data = *strchr(conf_buff, 0x1d);
if (ptr_data != NULL) {
tx_buff[4] = 'D';
tx_buff[5] = '0';
tx_buff[6] = '1';
multi.set_address(MCAST, atoi(PortSend));
sock.sendTo(multi, tx_buff, sizeof(tx_buff));
dbg.printf("Printer Done\r\n");
}
} else
return 0;
} else {
return 0;
}
return 0;
}
void flush(void)
{
int chk;
do
{
char flush_buff[1024] = { 0 };
chk = ip_conf.receiveFrom(server, flush_buff, sizeof(flush_buff));
//clear flush_buff
for(int i = 0; i <sizeof(flush_buff); i++)
{
flush_buff[i] = '\0';
}
}while (chk > 0);
}
void Set_IP_Manual()
{
sprintf(IP,"192.168.0.14");
sprintf(SUBNET, "255.255.255.0");
sprintf(GATEWAY, "192.168.0.1");
sprintf(MCAST, "224.1.1.8");
sprintf(PortListen, "50007");
sprintf(PortSend, "50001");
sprintf(PortHeartB, "50003");
sprintf(IDX, "GI01");
BAUD = 19200;
dbg.printf("IP Device = %s\r\n", IP);
dbg.printf("Subnet = %s\r\n", SUBNET);
dbg.printf("Gateway = %s\r\n", GATEWAY);
dbg.printf("Multicast IP = %s\r\n", MCAST);
dbg.printf("Server to mBed = %s\r\n", PortListen);
dbg.printf("mBed to Multicast = %s\r\n", PortSend);
dbg.printf("HeartBeat Port = %s\r\n", PortHeartB);
dbg.printf("device IDX = %s\r\n", IDX);
}
int main(void) {
mkdir("/sd/", 0777);
mbed_config_init(); // Digunakan jika setting ip melalui micro sd
Set_IP_Manual(); // Digunakan jika setting ip secara manual
dbg.printf("\r\nPrinter Baud = %d\r\n",BAUD);
pc.baud(BAUD);
dbg.baud(BAUD);
dbg.printf("System Start \r\n");
EthernetInterface eth;
eth.init(IP, SUBNET, GATEWAY);
int n = eth.connect();
if (!n) {
dbg.printf("Ethernet is not connect");
} else
dbg.printf("Ethernet is connect");
ip_conf.bind(IP_CONF_PORT);
ip_conf.set_blocking(false, 0);
server.set_address(MCAST, 50002);
sock.bind(atoi(PortListen));
sock.set_blocking(false, 0);
text[0] = 2;
text[1] = IDX[0];
text[2] = IDX[1];
text[3] = IDX[2];
text[4] = IDX[3];
text[22] = '0';
text[23] = '0';
text[24] = 3;
unsigned char tmp, sndrcv = 0, tmpx = 0;
int timeout = 0;
dbg.printf("Device Ready\r\n");
tx_buff[0] = IDX[0];
tx_buff[1] = IDX[1];
tx_buff[2] = IDX[2];
tx_buff[3] = IDX[3];
tx_buff[4] = 'R';
tx_buff[5] = '0';
multi.set_address(MCAST, atoi(PortSend));
sock.sendTo(multi, tx_buff, sizeof(tx_buff));
eMTy(ijo, 0);
eMTy(merah, 0);
Sopir(ijo, 0);
Sopir(merah, 0);
Standby(ijo, 0);
Standby(merah, 0);
Res_R = 1;
flush(); // clear ethernet port
while (true) {
for (idx = 0; idx < 6; idx++) {
rx_buff[idx] = 0;
}
switch (sndrcv) {
case 0: {
tmp = reset();
if (tmp == 1) {
if (tmpx == 0) {
if (sprmt == 0) {
Sopir(0, 1);
} else {
eMTy(0, 1);
}
wait_ms(70);
reset();
write();
read();
if (sprmt == 0) {
Sopir(0, 0);
text[5] = 'S';
} else {
eMTy(0, 0);
text[5] = 'M';
}
if (cmpstr(text, "F") < 10) {
multi.set_address(MCAST, atoi(PortSend));
sock.sendTo(multi, text, sizeof(text));
sndrcv = 1;
}
}
}
if (sprmt == 0) {
if (sndrcv == 1) {
Hartbit(2);
} else
Hartbit(1);
} else if (sprmt == 1)
Hartbit(0);
tmpx = tmp;
openForce();
break;
}
case 1: {
sock.bind(atoi(PortListen));
int n = sock.receiveFrom(server, rx_buff, sizeof(rx_buff));
if (n != 0) {
dbg.printf("Packet from \"%s\": %s\n", server.get_address(),
rx_buff);
if ((rx_buff[1] == 'V') && (rx_buff[3] == '3')) {
sndrcv = 0;
Sopir(0, 1);
sprmt = 1;
tx_buff[4] = 'O';
tx_buff[5] = 'K';
tx_buff[6] = '!';
multi.set_address(MCAST, atoi(PortSend));
sock.sendTo(multi, tx_buff, sizeof(tx_buff));
dbg.printf("Data S Valid..\r\n");
} else if ((rx_buff[1] == 'A') && (rx_buff[3] == '3')) {
sndrcv = 0;
Sopir(0, 0);
eMTy(0, 1);
wait_ms(200);
eMTy(0, 0);
sprmt = 0;
tx_buff[4] = 'O';
tx_buff[5] = 'K';
tx_buff[6] = '!';
multi.set_address(MCAST, atoi(PortSend));
sock.sendTo(multi, tx_buff, sizeof(tx_buff));
dbg.printf("Data S Not Valid, but M valid, reset!!!!\r\n");
} else if ((rx_buff[1] == 'V') && (rx_buff[3] == '4')) {
Sopir(0, 1);
eMTy(0, 1);
wait_ms(500);
/*
Lakukan perubahan disini menyangkut dengan:
- delay lebih lama
- sprmt yang ditambah
*/
tx_buff[4] = 'O';
tx_buff[5] = 'K';
tx_buff[6] = '!';
multi.set_address(MCAST, atoi(PortSend));
sock.sendTo(multi, tx_buff, sizeof(tx_buff));
dbg.printf("Data M Valid..\r\n");
} else if ((rx_buff[1] == 'A') && (rx_buff[3] == '4')) {
sndrcv = 0;
if (sprmt == 0) {
Sopir(0, 0);
} else {
Sopir(0, 1);
}
eMTy(0, 0);
tx_buff[4] = 'O';
tx_buff[5] = 'K';
tx_buff[6] = '!';
multi.set_address(MCAST, atoi(PortSend));
sock.sendTo(multi, tx_buff, sizeof(tx_buff));
dbg.printf("Data M Not Valid, refresh!!!!\r\n");
} else if (rx_buff[1] == 'R') {
sndrcv = 0;
Sopir(0, 0);
eMTy(0, 0);
sprmt = 0;
tx_buff[4] = 'O';
tx_buff[5] = 'K';
tx_buff[6] = '!';
multi.set_address(MCAST, atoi(PortSend));
sock.sendTo(multi, tx_buff, sizeof(tx_buff));
dbg.printf("All Data Not Valid, reset!!!!\r\n");
}
} else {
timeout++;
if (timeout >= 12000) {
sndrcv = 0;
timeout = 0;
}
}
Stdby_R = 1;
openForce();
break;
}
}
// membaca perintah dari server dari port 5004
set_IP();
// cek printer
if (!print_er) {
er_tmp2 = 0;
if (er_tmp1 < 3) {
tx_buff[4] = 'X';
tx_buff[5] = '0';
tx_buff[6] = '1';
multi.set_address(MCAST, atoi(PortSend));
dbg.printf("Printer Error\r\n");
sock.sendTo(multi, tx_buff, sizeof(tx_buff));
} else
er_tmp1 = 5;
er_tmp1++;
} else if (print_er) {
er_tmp1 = 0;
if (er_tmp2 < 3) {
tx_buff[4] = 'N';
tx_buff[5] = '0';
tx_buff[6] = '1';
dbg.printf("Printer Fixed\r\n");
multi.set_address(MCAST, atoi(PortSend));
sock.sendTo(multi, tx_buff, sizeof(tx_buff));
} else
er_tmp2 = 5;
er_tmp2++;
}
}
}
