rev.1
Dependencies: RA8875 SDFileSystem mbed
Diff: comm.cpp
- Revision:
- 0:6ef3fd4921d7
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/comm.cpp Fri Feb 17 16:53:53 2017 +0000 @@ -0,0 +1,767 @@ +// MW771 Laser Press HMI. +// V.Nemera, 10/12/2016, ver.1.0, C++ +// CPU: mbed NXP LPC1768 (ARM Cortex-M3, 32bit, 90MHz) + +#include "RA8875.h" +#include "main.h" +#include "comm.h" + +//-----------HMI i/o--------------------- +DigitalIn inEStop(p19); //input: E-Stop ON = 1 +DigitalIn inBtnStart(p20); //input: Btn Start ON = 0 +DigitalIn inLPactive(p26); //input: Laser power active = 1 +DigitalIn in1(p24); //input: in1 ON = 0 +DigitalIn in2(p23); //input: in2 ON = 0 + +DigitalOut outIrq(p14); //output: interrupt for IO +DigitalOut outLampStart(p25); //output: Start Lamp ON = 1 +DigitalOut out1(p22); //output: out1 ON = 1 +DigitalOut out2(p21); //output: out2 ON = 1 + +Ticker resetTime; //time for e-stop reset pulse + +int iCh; +char hexArr[] = "0123456789ABCDEF"; +const char err100[] = "Wrong command\n"; +const char err101[] = "No response\n"; + +Serial ioRS232(p28, p27); // tx, rx +int ioRS232baud = 115200; +int ioRS232bits = 8; +SerialBase::Parity ioRS232parity = SerialBase::None; +int ioRS232stop_bits = 1; + +Serial LasRS232(p9, p10); // tx, rx +int LasRS232baud = 57600; +int LasRS232bits = 8; +SerialBase::Parity LasRS232parity = SerialBase::None; +int LasRS232stop_bits = 1; + +char hmiLBuf[64]; //buffer hmi command to send to laser + +int indLhmi = 0; //index of buffer hmiLBuf[] + +char LasBufCom[64]; //buffer command to send to laser +char LasBufResp[64]; //buffer response from laser + +int indLCom = 0; //index of buffer LasBufCom[] +int indLResp = 0; //index of buffer LasBufResp[] + +char IOBufCom[32]; //buffer command from io controller +char IOBufResp[32]; //buffer response to send to io controller + +int indIOCom = 0; //index of buffer IOBufCom[] +int IOBufSize = 32; //buffer IOBufResp[] size +int sBio = 0; //send ioBuf pointer +int wBio = 0; //write ioBuf pointer + +char comBuf[128]; //buffer command from pc +int comBufPointer = 0; + +int sBp = 0; //send pcBuf pointer +int wBp = 0; //write pcBuf pointer +const int pcBufSize = 128; +char pcBuf[pcBufSize]; + +int stLhmi = 0; //status of hmi L.command +int stLpc = 0; //status of pc L.command +int iPCcmd = 0; //command # from pc +int stL3 = 0; //status of execution L.command +int iCounts = 0; +int iSta = 0; +int c; +int usta; +int iLasO, iLasO1, iLasO2; +int iCmax = 10; +//========================================================= +const char *cLC[80]; //array of laser commands string + +void cLCinit(void) { + cLC[0] = ""; + cLC[1] = "STA"; //cod 0x4001 STA - read laser status + cLC[2] = "RCS"; //cod 0x4002 RCS - read current setpoint + cLC[3] = "RNC"; //cod 0x4003 RNC - read minimum current setpoint + cLC[4] = "ROP"; //cod 0x4004 ROP - read output power + cLC[5] = "RPP"; //cod 0x4005 RPP - read peak power + cLC[6] = "RPW"; //cod 0x4006 RPW - read pulse width + cLC[7] = "RPRR"; //cod 0x4007 RPRR - read pulse repetition rate + cLC[8] = "RFV"; //cod 0x4008 RFV - read current software revision + cLC[9] = "RCT"; //cod 0x4009 RCT - read laser temperature + cLC[10] = "RET"; //cod 0x400A RET - read elapsed time the laser has been on + cLC[11] = "RMEC"; //cod 0x400B RMEC - read module error code + cLC[12] = "RSN"; //cod 0x400C RSN - read serial number + cLC[13] = "REC"; //cod 0x400D REC - read error counter + cLC[14] = "RICDT"; //cod 0x400E RICDT - read input circuit discharge time + cLC[15] = "RIP"; //cod 0x400F RIP - read the current IP address + cLC[16] = "RMASK"; //cod 0x4010 RMASK - read the current subnet mask + cLC[17] = "RDGW"; //cod 0x4011 RDGW - read the current default gateway address + cLC[18] = "RMAC"; //cod 0x4012 RMAC - read MAC address + cLC[19] = "RBAUD"; //cod 0x4013 RBAUD - read the current RS232 baud rate + cLC[20] = ""; + cLC[21] = ""; + cLC[22] = ""; + cLC[23] = ""; + cLC[24] = ""; + cLC[25] = ""; + cLC[26] = ""; + cLC[27] = ""; + cLC[28] = ""; + cLC[29] = ""; + cLC[30] = ""; + cLC[31] = ""; + cLC[32] = "EPM"; //cod 0x4020 EPM - enable pulse mode + cLC[33] = "DPM"; //cod 0x4021 DPM - disable pulse mode + cLC[34] = "ABN"; //cod 0x4022 ABN - aiming beam on + cLC[35] = "ABF"; //cod 0x4023 ABF - aiming beam off + cLC[36] = "EEC"; //cod 0x4024 EEC - enable external analog power control input + cLC[37] = "DEC"; //cod 0x4025 DEC - disable external analog power control input + cLC[38] = "EGM"; //cod 0x4026 EGM - enable gate mode (internal pulse generator gated by external modulation input) + cLC[39] = "DGM"; //cod 0x4027 DGM - disable gate mode + cLC[40] = "EMOD"; //cod 0x4028 EMOD - enable external modulation input + cLC[41] = "DMOD"; //cod 0x4029 DMOD - disable external modulation input + cLC[42] = "ELE"; //cod 0x402A ELE - enable external emission input + cLC[43] = "DLE"; //cod 0x402B DLE - disable external emission input + cLC[44] = "EHC"; //cod 0x402C EHC - enable compatibility mode + cLC[45] = "EDC"; //cod 0x402D EDC - disable compatibility mode + cLC[46] = "EEABC"; //cod 0x402E EEABC - enable external aiming beam control input + cLC[47] = "DEABC"; //cod 0x402F DEABC - disable external aiming beam control input + cLC[48] = "EWPM"; //Enable Waveform Pulse Mode + cLC[49] = "DWPM"; //Disable Waveform Pulse Mode + cLC[50] = "PCFG"; //Configure Waveform Mode + cLC[51] = "RCE"; //Reset critical error + cLC[52] = "RERR"; //Resers any resettable errors + cLC[53] = "EMON"; //Start Emission + cLC[54] = "EMOFF"; //Stop Emission + cLC[55] = ""; + cLC[56] = ""; + cLC[57] = ""; + cLC[58] = ""; + cLC[59] = ""; + cLC[60] = ""; + cLC[61] = ""; + cLC[62] = ""; + cLC[63] = ""; + cLC[64] = "SDC "; //cod 0x4040 SDC - set diode current, min current < xx.x% < 100% + cLC[65] = "SPW "; //cod 0x4041 SPW - set pulse width, xx.x mS + cLC[66] = "SPRR "; //cod 0x4042 SPRR - set pulse repetition rate, xxx Hz + cLC[67] = "SIP "; //cod 0x4043 SIP - set IP, xxx.xxx.xxx.xxx + cLC[68] = "SMASK "; //cod 0x4044 SMASK - set subnet mask, xxx.xxx.xxx.xxx + cLC[69] = "SDGW "; //cod 0x4045 SDGW - set default gateway, xxx.xxx.xxx.xxx + cLC[70] = "SMAC "; //cod 0x4046 SMAC - set MAC address xx-xx-xx-xx-xx-xx + cLC[71] = "SBAUD "; //cod 0x4047 SBAUD - set baud rate x (0-110,1-300,2-1200,3-2400,4-4800,5-9600 + // 6-19200,7-38400,8-57600default,9-115200) + cLC[72] = "PRSEL "; //Select Profile + cLC[73] = "SQSEL "; //Select Sequence + cLC[74] = ""; + cLC[75] = ""; + cLC[76] = ""; + cLC[77] = ""; + cLC[78] = ""; + cLC[79] = ""; +} + +//------------------------------------------- +int SetLasComm(int icLC) { + for(int i=0; i<15; i++) { //wait 15*20ms stLhmi=0 (last command executed) + if(stLhmi == 0) { + indLhmi++; + for(int j=0; j<indLhmi; j++) {hmiLBuf[j] = '\0';} + indLhmi = strlen(cLC[icLC]); + strncpy(hmiLBuf, cLC[icLC], indLhmi); + //pc.printf("-s%i %s %s %i\n", icLC, hmiLBuf, cLC[icLC], indLhmi); + if(icLC == 1) iSta = 1; + stLhmi = 2; + wait_ms(20); + return 0; + } + else { + wait_ms(20); + } + } + //pc.printf("-e%i %s %s %i\n", icLC, hmiLBuf, cLC[icLC], indLhmi); + return 1; +} + +void initHMIio(void) { + ioRS232.format(ioRS232bits, ioRS232parity, ioRS232stop_bits); + ioRS232.baud(ioRS232baud); + + LasRS232.format(LasRS232bits, LasRS232parity, LasRS232stop_bits); + LasRS232.baud(LasRS232baud); + + outIrq = 0; //output: interrupt for IO + outLampStart = 0; //output: Start Lamp ON = 1 + out1 = 0; //output: out1 ON = 1 + out2 = 0; //output: out2 ON = 1 + + cLCinit(); + + for(int i=0; i<64; i++) { + LasBufCom[i] = '\0'; + LasBufResp[i] = '\0'; + } +} +//write char to pc buffer +void wrChar(char cCh) { + pcBuf[wBp++] = (cCh); + if(wBp == pcBufSize) {wBp = 0;} +} +//write char array to pc buffer +void wrCharArr(const char* err) { + int iM; + iM = strlen(err); + for(int i=0; i<iM; i++) { + wrChar(err[i]); + } +} +//write 16bit word to pc buffer +void wrWord(uint16_t uWrd) { + wrChar(hexArr[uWrd/4096]); + uWrd = uWrd % 4096; + wrChar(hexArr[uWrd/256]); + uWrd = uWrd % 256; + wrChar(hexArr[uWrd/16]); + wrChar(hexArr[uWrd%16]); +} +//write 32bit word to pc buffer +void wrInt(int i32) { + wrWord((uint16_t)(i32/65536)); + wrWord((uint16_t)(i32%65536)); +} + +void comParser() { + if(comBufPointer < 2) { + wrCharArr(err100); //err100 = Wrong command + wrChar('>'); + comBufPointer =0; + return; + } + //pc.printf("1 %i 2 %i\n", comBuf[0], comBuf[1]); + + //for (int j = 3; j < comBufPointer; j++) { + // pc.printf("%i %i \n", j, comBuf[j]); + //} + + int a = comBuf[0]; + int b = comBuf[1]; + + //----------------------- + if (((a == 76) || (a == 108)) && (b == 32)) { //L<SP> or l<SP> + if(stLpc == 0) { +// pc.printf("<%i>", comBufPointer); + iPCcmd = 1; + } + else { + wrChar('?'); + wrChar('>'); + } + } + + //----------------------- + else if (((a == 76) || (a == 108)) && ((b == 83) || (b == 15))) { //LS or ls + iPCcmd = 2; + } + + //----------------------- + else if (((a == 76) || (a == 108)) && ((b == 73) || (b == 105))) { //LI or li + iPCcmd = 3; + } + + //----------------------- + else if(((a == 76) || (a == 108)) & ((b == 65) || (b == 97))) { //LA or la + iPCcmd = 4; + } + + //----------------------- + else if(((a == 76) || (a == 108)) & ((b == 67) || (b == 99))) { //LC or lc + iPCcmd = 5; + } + + //----------------------- + else if(((a == 76) || (a == 108)) & ((b == 82) || (b == 114))) { //LR or lr + iPCcmd = 6; + } + + else { + wrCharArr(err100); //err100 = Wrong command + wrChar('>'); + comBufPointer =0; + } +} +//========================================================= +void wrIOChar(char cCh) { //write 1 char to io buffer + IOBufResp[wBio++] = (cCh); + if(wBio == IOBufSize) wBio = 0; +} + +void wrIObyte(int iCh) { //write byte (2 char) to io buffer + iCh = iCh & 0xFF; + wrIOChar(hexArr[iCh/16]); + wrIOChar(hexArr[iCh%16]); +} + +void wrIOword(uint16_t uWrd) { //write 16bit word (4 char) to io buffer + wrIOChar(hexArr[uWrd/4096]); + uWrd = uWrd % 4096; + wrIOChar(hexArr[uWrd/256]); + uWrd = uWrd % 256; + wrIOChar(hexArr[uWrd/16]); + wrIOChar(hexArr[uWrd%16]); +} + +void wrIOint(int i32) { //write 32bit word to io buffer + wrIOword((uint16_t)(i32/65536)); + wrIOword((uint16_t)(i32%65536)); +} +void ioSt(void) { + int b0st = 0; //send bits d7-d4 + if(in2) b0st = b0st + 1; + if(flagParChanged == 0) b0st = b0st + 2; + if(flagLrsConnected) b0st = b0st + 4; + if(flagLcomProcess) b0st = b0st + 8; + wrIOChar(hexArr[b0st]); + + b0st = 0; //send bits d3-d0 + if(inEStop) b0st = b0st + 1; + if(inBtnStart) b0st = b0st + 2; + if(inLPactive) b0st = b0st + 4; + if(in1) b0st = b0st + 8; + wrIOChar(hexArr[b0st]); + + wrIOChar(0xD); //send <CR> +} + +void sendIOerr(int iErr) { + wrIOChar(hexArr[iErr | 8]); //1<err> send + wrIOChar(0x30); //0-status send + ioSt(); + showTPstatus(iErr); +} + +void sendIOstatus(void) { + uint8_t b0st = 0; + if(flagParChanged == 0) { + b0st = 0x0010; //param. send request + + led3 = 1; + wait_us(4); + led3 = 0; + } + else b0st = ioReq << 4; //another requests + wrIObyte(b0st); + + ioSt(); + flagParChanged = 1; +} + +void sendIOpar(void) { + int b0par; + + wrIOChar(0x30); //0000-ready & no err + wrIOChar(0x31); //1-parameters send + + b0par = prPar[progNumber].wMode + (prPar[progNumber].Lmode * 64); + wrIObyte(b0par); //send mode + + wrIObyte(prPar[progNumber].LPbeg); + wrIObyte(prPar[progNumber].LPend); + wrIOword(prPar[progNumber].Lfreq); + wrIObyte(prPar[progNumber].Lpulse); + wrIObyte(prPar[progNumber].amplBeg); + wrIObyte(prPar[progNumber].amplEnd); + wrIObyte(prPar[progNumber].wFreq); + wrIOword(prPar[progNumber].wTime); + wrIObyte(prPar[progNumber].amplNum); + + wrIOChar(0xD); //senr <CR> + //flagParChanged = 1; + c7 = c7 | 0x7700; +} + +void sendIOout(void) { + for(int i=0; i<2; i++) { + ioPar.o3[i] = IOBufCom[i+2]; + ioPar.o2[i] = IOBufCom[i+4]; + ioPar.o1[i] = IOBufCom[i+6]; + } + + if(bitOstate > 0x7F) { //send output + wrIOChar(0x30); //0000-ready & no err + wrIOChar(0x32); //2-output send + + wrIObyte(bitOstate & 0x7F); + wrIOChar(0xD); //senr <CR> + } + else sendIOstatus(); +} + +void sendIOinp(void) { + for(int i=0; i<2; i++) { + ioPar.i3[i] = IOBufCom[i+8]; + ioPar.i2[i] = IOBufCom[i+10]; + ioPar.i1[i] = IOBufCom[i+12]; + ioPar.aiLPow[i] = IOBufCom[i+14]; + ioPar.aiLCur[i] = IOBufCom[i+16]; + ioPar.aiLTemp[i] = IOBufCom[i+18]; + ioPar.aiLBR[i] = IOBufCom[i+20]; + } + sendIOstatus(); +} + +void flip() { + out2 = 0; + led4 = 0; + wait_us(1); + led4 = 1; + wait_us(2); + led4 = 0; + // pc.printf("o20 "); + +} + +void sendIOmsg(int iMsg) { + switch (iMsg) { + case 48: //0-READY FOR WELDING + showTPstatus(16); + int t = SetLasComm(52); + flagWeld = 0; + sendIOstatus(); + break; + case 49: {showTPstatus(17); flagWeld = 0; sendIOstatus(); break;} //1-WOBBLE HEAD INIT... + case 50: {showTPstatus(18); flagWeld = 0; sendIOstatus(); break;} //2-WOBBLE HEAD ERROR + case 51: {showTPstatus(19); flagWeld = 0; sendIOstatus(); break;} //3-IO CONTROLLER ERROR + case 52: {showTPstatus(20); flagWeld = 1; sendIOstatus(); break;} //4-WELDING IN PROGRESS.. + case 53: //5-auto reset e-stop + showTPstatus(16); + out2 = 1; + led4 = 1; + resetTime.attach(&flip, 0.5); //the address of the function to be attached (flip) to ticker + //printf("o21 "); + flagWeld = 0; + sendIOstatus(); + break; + case 54: //6-send laser command + if(TPstatus == 0) wrIOChar(0x30); //0000-ready & no err + else wrIOChar(0x38); //1000-not ready & no err + wrIOChar(0x33); //3-laser STA send + + wrIOint(usta); + wrIOChar(0xD); //senr <CR> + + flagWeld = 0; + break; + } +} + +void ioCommand(void) { + if(indIOCom < 2) { + sendIOerr(06); //err 06 = Short command + indIOCom =0; + return; + } + int a = IOBufCom[0]; + int b = IOBufCom[1]; + if (((a == 67) || (a == 99)) && (b == 48)) sendIOstatus(); //C0 or c0 + else if (((a == 67) || (a == 99)) && (b == 49)) sendIOpar(); //C1 or c1 + else if (((a == 67) || (a == 99)) && (b == 50)) sendIOout(); //C2 or c2 + else if (((a == 67) || (a == 99)) && (b == 51)) sendIOinp(); //C3 or c3 + else if ((a == 69) || (a == 101)) sendIOmsg(b); //E<b> or e<b> command + else sendIOerr(07); //err 07 = Wrong command + indIOCom =0; +} + +//========================================================= + +//execute L.command +void LaserCommand(void) //laser control +{ + if(stL3 == 0) { // check commands will be execute + + if(stLhmi == 2) {stL3 = stL3 + 1;} //command from hmi + if(iPCcmd != 0) { //command from pc + stLpc = 2; + stL3 = stL3 + 2; + } + if(stL3 == 0) flagLcomProcess = 0; + else flagLcomProcess = 1; + } + + if(stL3 & 1) { //hmi command + if(stLhmi == 2) { //send hmi command to laser + while(LasRS232.readable()) { + iLasO = LasRS232.getc(); + } + iLasO = 0; + + for (int i = 0; i < indLhmi; i++) { + LasRS232.printf("%c", hmiLBuf[i]); + } + LasRS232.printf("\r"); + iCounts = 0; + stLhmi = 3; + } + else if(stLhmi == 3) { //wait response from laser + if(LasRS232.readable()) { +lasRS2: + iLasO = LasRS232.getc(); + LasBufResp[indLResp++] = (char)iLasO; + if(iLasO == 13) { + stLhmi = 4; + iCounts = 0; + flagLrsConnected = 1; + } + if(LasRS232.readable()) goto lasRS2; + } + else { + ++iCounts; + if(iCounts > 400) { + indStat = 11; //error 11 - lazer does not answer + indLResp = 0; + stLhmi = 0; + stL3 = stL3 & 0xE; //no hmi command + flagLrsConnected = 0; + } + } + } + else if(stLhmi == 4) { //response to hmi + //printf("L %c %c\n", *LasBufResp, *hmiLBuf); + if (*LasBufResp == *hmiLBuf) { + if (iSta == 1) { //update L.status to hmi + c = 0; + for(int i=6; i<indLResp; i++) { + c = (c * 10) + LasBufResp[i-1] - '0'; + } + usta = c; + iSta = 0; + } + indStat = 0; //done + stLhmi = 5; + } + else { + indStat = 12; //error 12 - laser command error + stLhmi = 5; + } + } + else if(stLhmi == 5) { //delay for next command + ++iCounts; + if(iCounts > iCmax) { + indLResp = 0; + stL3 = stL3 & 0xE; //no hmi command + stLhmi = 0; + } + } + } + + else if(stL3 & 2) { //pc command + if(iPCcmd == 1) { + if(stLpc == 2) { //send pc command to laser + while(LasRS232.readable()) { + iLasO2 = LasRS232.getc(); + } + for (int i = 2; i < (comBufPointer-1); i++) { + LasRS232.printf("%c", comBuf[i]); + //pc.printf("a%c ", comBuf[i]); + } + LasRS232.printf("\r"); + iCounts = 0; + stLpc = 3; + } + else if(stLpc == 3) { //wait response from laser + if(LasRS232.readable()) { +lasRS1: + iCh = LasRS232.getc(); + iCounts = 0; + if(iCh == 13) { //CR - carrier return + wrChar('\n'); //send LF to pc + wrChar('>'); + stLpc = 4; + } + else { + wrChar(char(iCh)); + } + if(LasRS232.readable()) goto lasRS1; + } + else { + ++iCounts; + if(iCounts > 400) { //200mS + wrCharArr(err101); //err101 = "No response\n" + comBufPointer =0; + stL3 = stL3 & 0xD; + iPCcmd = 0; + stLpc = 0; + } + } + } + else if(stLpc == 4) { //delay for next command + ++iCounts; + if(iCounts > iCmax) { + comBufPointer =0; + stL3 = stL3 & 0xD; + iPCcmd = 0; + stLpc = 0; + } + } + + } + else if(iPCcmd == 2) { + + wrChar('S'); + wrChar('T'); + wrChar('A'); + wrChar(' '); + wrInt(usta); + wrChar('\n'); + wrChar('>'); + comBufPointer =0; + stL3 = stL3 & 0xD; + iPCcmd = 0; + stLpc = 0; + + } + else if(iPCcmd == 3) { + + wrChar('I'); + wrChar(' '); + wrWord(wBp); + wrChar(' '); + wrWord(sBp); + wrChar(' '); + //wrChar('\n'); + int a = sBp; + for(int i=0; i<32; i++) { + wrChar(pcBuf[a--]); + if(a<0) {a=pcBufSize-1;} + } + wrChar('\n'); + wrChar('>'); + comBufPointer =0; + stL3 = stL3 & 0xD; + iPCcmd = 0; + stLpc = 0; + + } + else if(iPCcmd == 4) { + + wrChar('L'); + wrChar('A'); + wrChar(' '); + wrInt(a7); + wrChar(' '); + wrInt(b7); + wrChar(' '); + wrInt(c7); + wrChar(' '); + wrInt(d7); + wrChar('\n'); + wrChar('>'); + comBufPointer =0; + stL3 = stL3 & 0xD; + iPCcmd = 0; + stLpc = 0; + a7 = 0; b7 = 0; c7 = 0; d7 = 0; + } + else if(iPCcmd == 5) { +/* + wrInt(indLCabcc); + wrChar(' '); + wrChar('L'); + wrChar('C'); + wrChar(' '); + wrChar('"'); + + for(int i=0; i<indLCabcc; i++) { + wrChar(LabccBufCom[i]); + } +*/ a7=0; b7=0, c7=0; d7=0; + wrChar('5'); + wrChar('\n'); + wrChar('>'); + comBufPointer =0; + stL3 = stL3 & 0xD; + iPCcmd = 0; + stLpc = 0; + + } + else if(iPCcmd == 6) { + pc.printf("wMode %i\n", prPar[progNumber].wMode); + pc.printf("Lmode %i\n", prPar[progNumber].Lmode); + pc.printf("LPbeg %i\n", prPar[progNumber].LPbeg); + pc.printf("LPend %i\n", prPar[progNumber].LPend); + pc.printf("Lfreq %i\n", prPar[progNumber].Lfreq); + pc.printf("Lpulse %i\n", prPar[progNumber].Lpulse); + pc.printf("amplBeg %i\n", prPar[progNumber].amplBeg); + pc.printf("amplEnd %i\n", prPar[progNumber].amplEnd); + pc.printf("wFreq %i\n", prPar[progNumber].wFreq); + pc.printf("wTime %i\n", prPar[progNumber].wTime); + pc.printf("amplNum %i\n", prPar[progNumber].amplNum); + + wrChar('\n'); + wrChar('>'); + comBufPointer =0; + stL3 = stL3 & 0xD; + iPCcmd = 0; + stLpc = 0; + + } + } +} + +void flipRS(void) { + led2 = 1; + //check io RS232 command + if(ioRS232.readable()) { +flip01: + iCh = ioRS232.getc(); + IOBufCom[indIOCom++] = (char)iCh; + if(iCh == 13) { //CR - carriage return + ioCommand(); + } + if(ioRS232.readable()) goto flip01; + } + //check response + if(ioRS232.writeable()) { + if(sBio != wBio) { //ioBuf not empty + int ff = 12; +flip02: + ioRS232.putc(IOBufResp[sBio++]); + if(sBio == IOBufSize) {sBio = 0;} + --ff; + if((sBio != wBio) && (ff > 0)) goto flip02; + } + } + //check pc RS232 command + if(pc.readable()) { + iCh = pc.getc(); + comBuf[comBufPointer++] = (char)iCh; + wrChar(iCh); + if(iCh == 10) { //LF - new line + comParser(); + } + } + + if(pc.writeable()) { + if(sBp != wBp) { //pcBuf not empty + pc.putc(pcBuf[sBp++]); + if(sBp == pcBufSize) {sBp = 0;} + } + } + //serve Laser RS232 command + LaserCommand(); + led2 = 0; +} + +//========================================================= +int lampSt; + +void main_cycle_add(void) +{ + if((flagWeld == 0) & (lampSt == 1)) { + outLampStart = 0; + lampSt = 0; + } + else if((flagWeld == 1) & (lampSt == 0)) { + outLampStart = 1; + lampSt = 1; + } +} +