From 27fd28f2e411937443217b3ff7bf9540f5cb6656 Mon Sep 17 00:00:00 2001 From: John Wiseman Date: Sat, 23 Sep 2023 07:35:22 +0100 Subject: [PATCH] 6.0.24.11 --- APRSCode.c | 16 +- Bpq32.c | 5 +- CBPQ32.vcproj | 2 +- CommonCode.c | 28 +- Debug/BuildLog.htm | Bin 0 -> 9758 bytes Debug/MCP2221.exe.embed.manifest | 8 + Debug/MCP2221.exe.embed.manifest.res | Bin 0 -> 468 bytes Debug/MCP2221.exe.intermediate.manifest | 8 + Debug/MCP2221.obj | Bin 0 -> 34772 bytes Debug/hid.obj | Bin 0 -> 53913 bytes Debug/mt.dep | 1 + Debug/vc80.idb | Bin 0 -> 257024 bytes Debug/vc80.pdb | Bin 0 -> 77824 bytes RigControl.c | 782 +++++++++++++++++++++++- SCSPactor.c | 11 +- TelnetV6.c | 4 +- UIRoutines.c | 2 +- Versions.h | 4 +- cMain.c | 4 +- rigcontrol.h | 12 +- 20 files changed, 864 insertions(+), 23 deletions(-) create mode 100644 Debug/BuildLog.htm create mode 100644 Debug/MCP2221.exe.embed.manifest create mode 100644 Debug/MCP2221.exe.embed.manifest.res create mode 100644 Debug/MCP2221.exe.intermediate.manifest create mode 100644 Debug/MCP2221.obj create mode 100644 Debug/hid.obj create mode 100644 Debug/mt.dep create mode 100644 Debug/vc80.idb create mode 100644 Debug/vc80.pdb diff --git a/APRSCode.c b/APRSCode.c index ff1c8c8..6b52b77 100644 --- a/APRSCode.c +++ b/APRSCode.c @@ -103,6 +103,7 @@ void SaveAPRSMessage(struct APRSMESSAGE * ptr); void ClearSavedMessages(); void GetSavedAPRSMessages(); static VOID GPSDConnect(void * unused); +int CanPortDigi(int Port); extern int SemHeldByAPI; extern int APRSMONDECODE(); @@ -664,9 +665,10 @@ Dll BOOL APIENTRY Init_APRS() memset(&CrossPortMap[0][0], 0, sizeof(CrossPortMap)); memset(&APRSBridgeMap[0][0], 0, sizeof(APRSBridgeMap)); - for (i = 1; i <= 32; i++) + for (i = 1; i <= MaxBPQPortNo; i++) { - CrossPortMap[i][i] = TRUE; // Set Defaults - Same Port + if (CanPortDigi(i)) + CrossPortMap[i][i] = TRUE; // Set Defaults - Same Port CrossPortMap[i][0] = TRUE; // and APRS-IS } @@ -1945,7 +1947,7 @@ static int APRSProcessLine(char * buf) { SendTo = atoi(ptr); // this gives zero for IS - if (SendTo > 32) + if (SendTo > MaxBPQPortNo) return FALSE; Object->PortMap[SendTo] = TRUE; @@ -2175,6 +2177,12 @@ static int APRSProcessLine(char * buf) if (GetPortTableEntryFromPortNum(Port) == NULL) return FALSE; + // Check that port can digi (SCS Pactor can't set digi'd bit in calls) + + if (CanPortDigi(Port) == 0) + return FALSE; + + CrossPortMap[Port][Port] = FALSE; // Cancel Default mapping CrossPortMap[Port][0] = FALSE; // Cancel Default APRSIS @@ -2218,7 +2226,7 @@ static int APRSProcessLine(char * buf) { DigiTo = atoi(ptr); // this gives zero for IS - if (DigiTo > 32) + if (DigiTo > MaxBPQPortNo) return FALSE; APRSBridgeMap[Port][DigiTo] = TRUE; diff --git a/Bpq32.c b/Bpq32.c index 370a0b6..32ba43c 100644 --- a/Bpq32.c +++ b/Bpq32.c @@ -1186,8 +1186,11 @@ along with LinBPQ/BPQ32. If not, see http://www.gnu.org/licenses // Add Chat PACLEN config (5) // Fix NC to Application Call (6) // Fix INP3 L3RTT messages on Linux and correct RTT calculation (9) -// Get Beacon config from config file on windows (9) +// Get Beacon config from config file on Windows (9) // fix processing DED TNC Emulator M command with space between M and params (10) +// Fix sending UI frames on SCSPACTOR (11) +// Dont allow ports that can't set digi'ed bit in callsigns to digipeat. (11) +// Add SDRAngel rig control (11) #define CKernel diff --git a/CBPQ32.vcproj b/CBPQ32.vcproj index 079862a..c1c95a2 100644 --- a/CBPQ32.vcproj +++ b/CBPQ32.vcproj @@ -180,7 +180,7 @@ TNC; + + if (TNC == NULL) + return TRUE; + + if (TNC->Hardware == H_SCS || TNC->Hardware == H_TRK || TNC->Hardware == H_TRKM || TNC->Hardware == H_WINRPR) + return FALSE; + + return TRUE; +} + struct PORTCONTROL * APIENTRY GetPortTableEntryFromPortNum(int portnum) { - struct PORTCONTROL * PORTVEC=PORTTABLE; + struct PORTCONTROL * PORTVEC = PORTTABLE; do { @@ -2340,6 +2359,13 @@ BOOL WriteCOMBlock(HANDLE fd, char * Block, int BytesToWrite) DWORD BytesWritten; DWORD ErrorFlags; COMSTAT ComStat; + DWORD Mask = 0; + int Err; + + Err = GetCommModemStatus(fd, &Mask); + +// if ((Mask & MS_CTS_ON) == 0) // trap com0com other end not open +// return TRUE; fWriteStat = WriteFile(fd, Block, BytesToWrite, &BytesWritten, NULL ); diff --git a/Debug/BuildLog.htm b/Debug/BuildLog.htm new file mode 100644 index 0000000000000000000000000000000000000000..d4e6e166d26985847d037284ff66e5ec7484ce53 GIT binary patch literal 9758 zcmeI2Yfl?T6o${|Ncj&dszxnsYyyF_kW|6Oq^V+{!IWNHA;88snBdsXt?F-Y`@AzA zyt}?&E)qtyR$lMU<;_`4f zwq*|~`Pp{trTt>hY{v3-W^bWVb@zv~`D{(zX6SR6s8egT`@}taKJtodcg(0QYg5~S z>U-`-jP%Hs=o5HTpCoq&(62CFXwig5_57^^%>(9EWrUAbr)38U&!9TT^(CbTR&zWy zpwpt}3ud$Keg#{E&Qp4{_>bI^q@t&z?yMr7_UT`xr?{_kZ_uL6(_gOi8(ZjdlVeVG zYAe*gqJOO`@9a4>jh1D+z_TAcyd`Ha3l)vq;A$gnaZyM9H8`1z)v2b!)vN2xNpll7 zamlD}zf20Y#+t7o8Oh`U;~cnASGpWaF5^>MhfcUILv7ZLl3d|qC*Qbi+fITl?p0>D z%zU<3nKOIC`yr(&DYC*_Ht()S_AMnI!$-)e#yYi-T8C%hTJ6{9dq8>3{o4M98klHhiW``100h1}rXH87nG_C%ad+pJ;o`YLso$t;rhY zb^Abl*&*-)|J$??KBfC*Fxj+sXuv$rVP%EcWUC%}%l4YOEoc2?0q3xU3+S}&(uODY zJ=cn=Bj)O%L|l1H!c)4McG zKA^?gR=YYWPau1(**C%J%n#@hYVv9VIDiHORxNq^i zNl5|y*|t4KUPbp_I?uFCi#^v?y12uW+U-#*OE8Pe3yHFw(a3 z@eSEdK3S-q?3 zz$x^5k;SCofAm@hsfP&rZbi;HJZ8!HWS;>q4#D+-Ly_XLaWdfN*!4p)F6A3Vdd4Hr zs2k(;GWQ4{v5)8I&|01&AXb^C{A$Fv$r3(DK3-obmD8(i&GGKb9+2HA!}fV#9L*k6 zDrsIL^Sg~$^s;MnmtxU$oV_#zchijRCSr^KQ^s}?lJ1h0q@#`}L$qX?v4t$+`msw~ z-{jk;8C&>zosLnb8Ji;FNzB+r+XKU8%!6tuaZ`0*fO?QvFyOb3o$B!-s)EuTe zd*kg|r+4=J4uN*=g#H@&nl5?OU=REbOWG3q(igP3YcIysd@=CsPt;`4Naaudi$qc% zBTf@V + + + + + + + \ No newline at end of file diff --git a/Debug/MCP2221.exe.embed.manifest.res b/Debug/MCP2221.exe.embed.manifest.res new file mode 100644 index 0000000000000000000000000000000000000000..7b55d19001b1a6c9becd61f77f12ffdedbbaed6d GIT binary patch literal 468 zcmZ8d!A`?43@s8DkhpV`i!+}rY6E-te zwqePN?PvS>B?y9mk#9D?PT`4toVEBh^-w|<1sCUS)A#3BHeBn9t-ztOCg*V&aRx@( zQki+qUndWplr!|gl%lc*a^3*);o#~r6NsRTs$sOiV9sl2`Y0Em1$MNO&Z3?9jCuk=2 n4SxP;CetD*?nDf63Q55SS@-`*t%`0d>{LefSKkRf%nyPsVFr%a literal 0 HcmV?d00001 diff --git a/Debug/MCP2221.exe.intermediate.manifest b/Debug/MCP2221.exe.intermediate.manifest new file mode 100644 index 0000000..1b520e1 --- /dev/null +++ b/Debug/MCP2221.exe.intermediate.manifest @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/Debug/MCP2221.obj b/Debug/MCP2221.obj new file mode 100644 index 0000000000000000000000000000000000000000..a0585cfc72606c567baf14a5f456ecb64352f975 GIT binary patch literal 34772 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 F{U6Jpp8Nm+ literal 0 HcmV?d00001 diff --git a/Debug/hid.obj b/Debug/hid.obj new file mode 100644 index 0000000000000000000000000000000000000000..2df9a2a7cc76139f41805df62e610d687dde3aec GIT binary patch literal 53913 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 literal 0 HcmV?d00001 diff --git a/Debug/mt.dep b/Debug/mt.dep new file mode 100644 index 0000000..63b503d --- /dev/null +++ b/Debug/mt.dep @@ -0,0 +1 @@ +Manifest resource last updated at 8:23:51.89 on 15/09/2023 diff --git a/Debug/vc80.idb b/Debug/vc80.idb new file mode 100644 index 0000000000000000000000000000000000000000..eee75b3526e62b78eea5763cb1a0a21f8f49a87a GIT binary patch literal 257024 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 literal 0 HcmV?d00001 diff --git a/Debug/vc80.pdb b/Debug/vc80.pdb new file mode 100644 index 0000000000000000000000000000000000000000..896b6cadad9fbd0e1821fa7dc6c28449a4917984 GIT binary patch literal 77824 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\r\n" "\r\n"; +// ---- G7TAJ ---- +static char SDRANGEL_MsgHddr[] = "PATCH HTTP/1.1\r\n" + "User-Agent: BPQ32\r\n" + "Host: %s\r\n" + "accept: application/json" + "Content-Type: application/json" + "Content-length: %d\r\n" + "\r\n%s"; + +static char SDRANGEL_FREQ_DATA[] = "{" + "\"deviceHwType\": \"%s\", " + "\"direction\": 0," + "\"rtlSdrSettings\": {" + " \"centerFrequency\": \"%s\"" + "}}"; + +//freq = 10489630000 + +// ---- G7TAJ ---- + int Rig_CommandEx(struct RIGPORTINFO * PORT, struct RIGINFO * RIG, TRANSPORTENTRY * Session, char * Command) @@ -2074,7 +2108,7 @@ int Rig_CommandEx(struct RIGPORTINFO * PORT, struct RIGINFO * RIG, TRANSPORTENTR memcpy(&cmd[1], &USB, 4); else if (strcmp(Mode, "LSB") == 0) memcpy(&cmd[1], &LSB, 4); - + cmd[0] = 1; len = sendto(PORT->remoteSock, cmd, 5, 0, &PORT->remoteDest, sizeof(struct sockaddr)); } @@ -2084,7 +2118,43 @@ int Rig_CommandEx(struct RIGPORTINFO * PORT, struct RIGINFO * RIG, TRANSPORTENTR sprintf(Command, "Ok\r"); return FALSE; } +// --- G7TAJ ---- + case SDRANGEL: + { + char cmd[80]; + int len = sprintf(cmd, "%.0f", Freq); + strcpy(PORT->ScanEntry.Cmd2Msg, Mode); + strcpy(PORT->ScanEntry.Cmd3Msg, FilterString); + + if (Freq > 0.0) + { + SDRANGELSendCommand(PORT, "FREQSET", cmd); + sprintf(Command, "Ok\r"); + return FALSE; + } +//TODO +/* else if (PORT->ScanEntry.Cmd2Msg[0] && Mode[0] != '*') + { + sprintf(cmd, "%s", PORT->ScanEntry.Cmd2Msg); + FLRIGSendCommand(PORT, "rig.set_mode", cmd); + } + + else if (PORT->ScanEntry.Cmd3Msg[0] && strcmp(PORT->ScanEntry.Cmd3Msg, "0") != 0) + { + sprintf(cmd, "%s", PORT->ScanEntry.Cmd3Msg); + FLRIGSendCommand(PORT, "rig.set_bandwidth", cmd); + } +*/ + else + { + sprintf(Command, "Sorry - Nothing to do\r"); + return FALSE; + } + + PORT->AutoPoll = 0; + } +// --- G7TAJ ---- @@ -2271,6 +2341,14 @@ DllExport BOOL APIENTRY Rig_Init() } else if (PORT->PortType == RTLUDP) ConnecttoRTLUDP(PORT); +//---- G7TAJ ---- + else if (PORT->PortType == SDRANGEL) + { + SDRANGELRunning = 1; + ConnecttoSDRANGEL(PORT); + + } +//---- G7TAJ ---- else if (PORT->HIDDevice) // This is RAWHID, Not CM108 OpenHIDPort(PORT, PORT->IOBASE, PORT->SPEED); else if (PORT->PTC == 0 && _stricmp(PORT->IOBASE, "CM108") != 0) @@ -2421,7 +2499,10 @@ DllExport BOOL APIENTRY Rig_Close() HAMLIBMasterRunning = 0; // Close HAMLIB thread(s) HAMLIBSlaveRunning = 0; // Close HAMLIB thread(s) - FLRIGRunning = 0; // Close FLRIG thread(s) + FLRIGRunning = 0; // Close FLRIG thread(s) +// ---- G7TAJ ---- + SDRANGELRunning = 0; // Close SDRANGEL thread(s) +// ---- G7TAJ ---- for (p = 0; p < NumberofPorts; p++) { @@ -2544,6 +2625,10 @@ BOOL Rig_Poll() ConnecttoFLRIG(PORT); else if (PORT->PortType == RTLUDP) ConnecttoRTLUDP(PORT); +// ---- G7TAJ ---- + else if (PORT->PortType == SDRANGEL) + ConnecttoSDRANGEL(PORT); +// ---- G7TAJ ---- else if (PORT->HIDDevice) OpenHIDPort(PORT, PORT->IOBASE, PORT->SPEED); else if (PORT->PTC == 0 @@ -2632,7 +2717,12 @@ BOOL Rig_Poll() case FLRIG: FLRIGPoll(PORT); + break; +// ---- G7TAJ ---- + case SDRANGEL: + SDRANGELPoll(PORT); break; } +// ---- G7TAJ ---- } // Build page for Web Display @@ -3014,6 +3104,14 @@ BOOL RigWriteCommBlock(struct RIGPORTINFO * PORT) #ifndef WIN32 BytesWritten = write(PORT->hDevice, PORT->TXBuffer, PORT->TXLen); #else + DWORD Mask = 0; + int Err; + + Err = GetCommModemStatus(PORT->hDevice, &Mask); + +// if ((Mask & MS_CTS_ON) == 0) // trap com0com other end not open +// return TRUE; + fWriteStat = WriteFile(PORT->hDevice, PORT->TXBuffer, PORT->TXLen, &BytesWritten, NULL ); #endif if (PORT->TXLen != BytesWritten) @@ -5529,6 +5627,78 @@ struct RIGINFO * RigConfig(struct TNCINFO * TNC, char * buf, int Port) goto CheckOtherParams; } +// ---- G7TAJ ---- + + if (_memicmp(ptr, "sdrangel", 5) == 0) + { + // each instance (ip addr/port) of sdrangle can have one or more sampling devices (eg rltsdr) each with one ot + // more channels (eg ssb demod, ssb mod). each set of sampling device = channel(s) is a device set. + + // We poll all devices/channels at once. we one PORT record plus a RIG record for each channel + + // Need parameters - Host:Port device channel. Device and Channel will default to zero + + int device = 0, channel = 0; + char * Name; + char * nptr1; + char * nptr2; + + + ptr = strtok_s(NULL, " \t\n\r", &Context); + + if (ptr == NULL || strlen(ptr) > 79) return FALSE; + + Name = strtok_s(NULL, " \t\n\r", &Context); + nptr1 = strtok_s(NULL, " \t\n\r", &Context); + nptr2 = strtok_s(NULL, " \t\n\r", &Context); + + if (nptr1 == 0 || nptr2 == 0 || Name == NULL || strlen(Name) > 9) + return FALSE; + + device = atoi(nptr1); + channel = atoi(nptr2); + + // Have a parameter to define port. Will decode it later + + // See if already defined. PORT->IOBASE has Host:Port + + for (i = 0; i < NumberofPorts; i++) + { + PORT = PORTInfo[i]; + + if (strcmp(PORT->IOBASE, ptr) == 0) + goto AngelRigFound; + } + + // New Port + + PORT = PORTInfo[NumberofPorts++] = zalloc(sizeof(struct RIGPORTINFO)); + PORT->PortType = SDRANGEL; + PORT->ConfiguredRigs = 0; + strcpy(PORT->IOBASE, ptr); + + // Decode host + + DecodeHAMLIBAddr(PORT, ptr); + + +AngelRigFound: + + RIG = &PORT->Rigs[PORT->ConfiguredRigs++]; + RIG->RIGOK = TRUE; + RIG->PORT = PORT; + RIG->RigAddr = device; + RIG->Channel = channel; + + strcpy(RIG->RigName, Name); + + ptr = strtok_s(NULL, " \t\n\r", &Context); + + // look for scan params + + goto CheckOtherParams; + } +// ---- G7TAJ ---- if ((_memicmp(ptr, "VCOM", 4) == 0) && TNC->Hardware == H_SCS) // Using Radio Port on PTC COMPort = 0; @@ -9633,8 +9803,616 @@ VOID ConnecttoRTLUDP(struct RIGPORTINFO * PORT) PORT->Alerted = TRUE; } +char * getObjectFromArray(char * Msg); // This gets the next object from an array ({} = object, [] = array + + + +char * getArrayFromMsg(char * Msg) +{ + // This gets the next object from an array ({} = object, [] = array + // We look for the end of the object same number of { and }, teminate after } and return pointer to next object + // So we have terminated Msg, and returned next object in array + + // Only call if Msg is the next array in Msg + + + char * ptr = Msg; + char c; + + int Open = 0; + int Close = 0; + + while (c = *(ptr++)) + { + if (c == '[') Open ++; else if (c == ']') Close ++; + + if (Open == Close) + { + *(ptr++) = 0; + return ptr; + } + } + return 0; +} + + +//----- G7TAJ ----- + +void ProcessSDRANGELFrame(struct RIGPORTINFO * PORT) +{ + + int Length; + + char * msg; + char * rest; + + struct RIGINFO * RIG; + char * ptr, * ptr1, * ptr2, * ptr3, * pos; + int Len, TotalLen; + char cmd[80]; + char ReqBuf[256]; + char SendBuff[256]; + int chunklength; + int headerlen; + int i, n = 0; + char * Sets; + char * Rest; + char * Set; + int channelcount; + char * channels; + char * channel; + char * samplingDevice; + char * save; + + //Debugprintf("Process SDRANGEL Frame %d\n", PORT->RXLen); + + msg = PORT->RXBuffer; + Length = PORT->RXLen; + + msg[Length] = 0; + + ptr1 = strstr(msg, "Transfer-Encoding: chunked" ); + + if (ptr1 == NULL) + return; + + ptr2 = strstr(ptr1, "\r\n\r\n"); + + if (ptr2 == NULL) + return; + + // ptr2 +4 points to the length of the first chunk (in hex), terminated by crlf + + chunklength = (int)strtol(ptr2 + 4, &ptr3, 16); + ptr3 += 2; // pointer to first chunk data + headerlen = ptr3 - msg; + + // make sure we have first chunk + + if (chunklength + headerlen > Length) + return; + + PORT->RXLen = 0; //we have all the frame now + PORT->Timeout = 0; + + if (strstr(ptr3, "deviceSets") == 0) + { + return; + } + + // Message has info for all rigs + + // As we mess with the message, save a copy and restore for each Rig + + save = strdup(ptr3); + + for (i = 0; i < PORT->ConfiguredRigs; i++) + { + strcpy(ptr3, save); + n = 0; + + RIG = &PORT->Rigs[i]; + RIG->RIGOK = 1; + + // we can have one or more sampling devices (eg rltsdr) each with one or + // more channels (eg ssb demod, ssb mod). each set of sampling device = channel(s) is a device set. + + // Find Device Set for this device (in RIG-> + + // Message Structure is + + //{ + // "deviceSets": [...]. + // "devicesetcount": 2, + // "devicesetfocus": 0 + //} + + // Get the device sets (JSON [..] is an array + + Sets = strchr(ptr3, '['); + + if (Sets == 0) + continue; + + Rest = getArrayFromMsg(Sets); + + // Do we need to check devicesetcount ??. Maybe use to loop through sets, or just stop at end + + // get the set for our device + + while (RIG->RigAddr >= n) + { + Set = strchr(Sets, '{'); // Position to start of first Object + + if (Set == 0) + break; + + Sets = getObjectFromArray(Set); + n++; + } + + if (Set == 0) + continue; + + + // Now get the channel. looking for key "index": + + // we could have a number of sampling devices and channels but for now get sampling device freq + // and first channel freq. Channels are in an Array + + if ((ptr = strstr(Set, "channelcount")) == 0) + continue; + + channelcount = atoi(&ptr[15]); + + if ((channels = strchr(Set, '[')) == 0) + continue; + + samplingDevice = getArrayFromMsg(channels); + + while(channelcount--) + { + channel = strchr(channels, '{'); + channels = getObjectFromArray(channel); + + if ((ptr = strstr(channel, "index"))) + { + n = atoi(&ptr[7]); + if (n == RIG->Channel) + break; + } + } + + + + if (pos = strstr(samplingDevice, "centerFrequency")) //"centerFrequency": 10489630000, + { + pos += 18; + strncpy(cmd, pos, 20); + RIG->RigFreq = atof(cmd) / 1000000.0; + } + + if (pos = strstr(channel, "deltaFrequency")) + { + pos += 17; + strncpy(cmd, pos, 20); + RIG->RigFreq += atof(cmd) / 1000000.0; + } + + + _gcvt(RIG->RigFreq, 9, RIG->Valchar); + + sprintf(RIG->WEB_FREQ,"%s", RIG->Valchar); + SetWindowText(RIG->hFREQ, RIG->WEB_FREQ); + + // we could get mode from Title line: + //"title": "SSB Demodulator", + + if (pos = strstr(channel, "title")) + { + pos += 9; + strncpy(cmd, pos, 20); + strlop(pos, ' '); + strncpy(RIG->ModeString, pos, 15); + sprintf(RIG->WEB_MODE, "%s", RIG->ModeString); + SetWindowText(RIG->hMODE, RIG->WEB_MODE); + } + + } + + + /* + while (msg && msg[0]) + { + rest = strlop(msg, ','); + + if ( pos = strstr(msg, "centerFrequency")) //"centerFrequency": 10489630000, + { + pos += 18; + strncpy(cmd, pos,20); + + RIG->RigFreq = atof(cmd) / 1000000.0; + + // printf("FREQ=%f\t%s\n", RIG->RigFreq, cmd); + + _gcvt(RIG->RigFreq, 9, RIG->Valchar); + + sprintf(RIG->WEB_FREQ,"%s", RIG->Valchar); + SetWindowText(RIG->hFREQ, RIG->WEB_FREQ); + } + + else if (memcmp(msg, "Mode:", 5) == 0) + { + if (strlen(&msg[6]) < 15) + strcpy(RIG->ModeString, &msg[6]); + } + + else if (memcmp(msg, "Passband:", 9) == 0) + { + RIG->Passband = atoi(&msg[10]); + sprintf(RIG->WEB_MODE, "%s/%d", RIG->ModeString, RIG->Passband); + SetWindowText(RIG->hMODE, RIG->WEB_MODE); + } + + msg = rest; + } + */ + free (save); +} + + + +VOID SDRANGELThread(struct RIGPORTINFO * PORT); + +VOID ConnecttoSDRANGEL(struct RIGPORTINFO * PORT) +{ + if (SDRANGELRunning) + _beginthread(SDRANGELThread, 0, (void *)PORT); + return ; +} + +VOID SDRANGELThread(struct RIGPORTINFO * PORT) +{ + // Opens sockets and looks for data + char Msg[255]; + int err, i, ret; + u_long param=1; + BOOL bcopt=TRUE; + fd_set readfs; + fd_set errorfs; + struct timeval timeout; + + if (PORT->CONNECTING) + return; + + PORT->RXLen = 0; + PORT->CONNECTING = 1; + + if (PORT->remoteSock) + { + closesocket(PORT->remoteSock); + } + + PORT->remoteSock = 0; + PORT->remoteSock = socket(AF_INET,SOCK_STREAM,0); + + if (PORT->remoteSock == INVALID_SOCKET) + { + i=sprintf(Msg, "Socket Failed for SDRAngel socket - error code = %d\r\n", WSAGetLastError()); + WritetoConsole(Msg); + + PORT->CONNECTING = FALSE; + return; + } + setsockopt(PORT->remoteSock, SOL_SOCKET, SO_REUSEADDR, (const char FAR *)&bcopt, 4); + setsockopt(PORT->remoteSock, IPPROTO_TCP, TCP_NODELAY, (const char FAR *)&bcopt, 4); + + if (connect(PORT->remoteSock,(LPSOCKADDR) &PORT->remoteDest,sizeof(PORT->remoteDest)) == 0) + { + // + // Connected successful + // + + ioctl(PORT->remoteSock, FIONBIO, ¶m); + } + else + { + if (PORT->Alerted == FALSE) + { + struct sockaddr_in * destaddr = (SOCKADDR_IN * )&PORT->remoteDest; + + err = WSAGetLastError(); + + sprintf(Msg, "Connect Failed for SDRAngel socket - error code = %d Port %d\r\n", + err, htons(destaddr->sin_port)); + + WritetoConsole(Msg); + PORT->Alerted = TRUE; + } + + closesocket(PORT->remoteSock); + + PORT->remoteSock = 0; + PORT->CONNECTING = FALSE; + return; + } + + PORT->CONNECTED = TRUE; + PORT->CONNECTING = 0; + + PORT->hDevice = (HANDLE)1; // simplifies check code + + PORT->Alerted = TRUE; + + while (PORT->CONNECTED && SDRANGELRunning) + { + FD_ZERO(&readfs); + FD_ZERO(&errorfs); + + FD_SET(PORT->remoteSock,&readfs); + FD_SET(PORT->remoteSock,&errorfs); + + timeout.tv_sec = 5; + timeout.tv_usec = 0; + + ret = select((int)PORT->remoteSock + 1, &readfs, NULL, &errorfs, &timeout); + + if (SDRANGELRunning == 0) + return; + + if (ret == SOCKET_ERROR) + { + Debugprintf("SDRAngel Select failed %d ", WSAGetLastError()); + goto Lost; + } + + if (ret > 0) + { + // See what happened + + if (FD_ISSET(PORT->remoteSock, &readfs)) + { + SDRANGELProcessMessage(PORT); + } + + if (FD_ISSET(PORT->remoteSock, &errorfs)) + { +Lost: + sprintf(Msg, "SDRAngel Connection lost for Port %s\r\n", PORT->IOBASE); + WritetoConsole(Msg); + + PORT->CONNECTED = FALSE; + PORT->Alerted = FALSE; + PORT->hDevice = 0; // simplifies check code + + closesocket(PORT->remoteSock); + PORT->remoteSock = 0; + return; + } + continue; + } + else + { + } + } + sprintf(Msg, "SDRAngel Thread Terminated Port %s\r\n", PORT->IOBASE); + WritetoConsole(Msg); +} + +/* +# 10489630000 + +CURL_DATA='{ + "deviceHwType": "RTLSDR", + "direction": 0, + "rtlSdrSettings": { + "centerFrequency": "'$1'" + } + +}'; + + +curl -X PATCH "http://127.0.0.1:8091/sdrangel/deviceset/0/device/settings" \ + -H "accept: application/json" \ + -H "Content-Type: application/json" \ + -d "$CURL_DATA" + + + + + + + + + +*/ + + +VOID SDRANGELPoll(struct RIGPORTINFO * PORT) +{ + UCHAR * Poll = PORT->TXBuffer; + + // SDRAngel can have muliple rigs but we only need to poll once to get info for all rigs so just use first entry + + struct RIGINFO * RIG = &PORT->Rigs[0]; + int Len, i; + char ReqBuf[256]; + char SendBuff[256]; + //char * SDRANGEL_GETheader = "GET /sdrangel/deviceset/%d/device/settings " + // "HTTP/1.1\nHost: %s\nConnection: keep-alive\n\r\n"; + + char * SDRANGEL_GETheader = "GET /sdrangel/devicesets " + "HTTP/1.1\nHost: %s\nConnection: keep-alive\n\r\n"; + + + if (RIG->ScanStopped == 0) + if (RIG->ScanCounter) + RIG->ScanCounter--; + + if (PORT->Timeout) + { + PORT->Timeout--; + + if (PORT->Timeout) // Still waiting + return; + + // Loop through all Rigs + + for (i = 0; i < PORT->ConfiguredRigs; i++) + { + RIG = &PORT->Rigs[i]; + + SetWindowText(RIG->hFREQ, "------------------"); + SetWindowText(RIG->hMODE, "----------"); + strcpy(RIG->WEB_FREQ, "-----------");; + strcpy(RIG->WEB_MODE, "------"); + + RIG->RIGOK = FALSE; + } + return; + } + + // Send Data if avail, else send poll + + if (RIG->NumberofBands && RIG->RIGOK && (RIG->ScanStopped == 0)) + { + if (RIG->ScanCounter <= 0) + { + // Send Next Freq + + if (GetPermissionToChange(PORT, RIG)) + { + char cmd[80]; + double freq; + + if (RIG->RIG_DEBUG) + Debugprintf("BPQ32 Change Freq to %9.4f", PORT->FreqPtr->Freq); + + _gcvt(PORT->FreqPtr->Freq / 1000000.0, 9, RIG->Valchar); // For MH + + // Send the Set Freq here, send set mode when we get a response + + memcpy(&PORT->ScanEntry, PORT->FreqPtr, sizeof(struct ScanEntry)); + +//TODO + sprintf(cmd, "%.0f", PORT->FreqPtr->Freq); + SDRANGELSendCommand(PORT, "SETFREQ", cmd); + + + PORT->CmdSent = 1; + PORT->Retries = 0; + PORT->Timeout = 10; + PORT->AutoPoll = TRUE; + + // There isn't a response to a set command, so clear Scan Lock here + ReleasePermission(RIG); // Release Perrmission + return; + } + } + } + + if (RIG->PollCounter) + { + RIG->PollCounter--; + if (RIG->PollCounter > 1) + return; + } + + if (RIG->RIGOK && (RIG->ScanStopped == 0) && RIG->NumberofBands) + return; // no point in reading freq if we are about to change it + + RIG->PollCounter = 40; + + // Read Frequency +//TODO + + +// Len = sprintf(SendBuff, SDRANGEL_GETheader, 0, &PORT->remoteDest ); // devicenum, host:port + Len = sprintf(SendBuff, SDRANGEL_GETheader, &PORT->remoteDest ); // devicenum, host:port + + if (PORT->CONNECTED) + { + if (send(PORT->remoteSock, SendBuff, Len, 0) != Len) + { + if (PORT->remoteSock) + closesocket(PORT->remoteSock); + + PORT->remoteSock = 0; + PORT->CONNECTED = FALSE; + PORT->hDevice = 0; + return; + } + } + + PORT->Timeout = 10; + PORT->CmdSent = 0; + + PORT->AutoPoll = TRUE; + + return; +} + +VOID SDRANGELSendCommand(struct RIGPORTINFO * PORT, char * Command, char * Value) +{ + int Len, ret; + char ReqBuf[512]; + char SendBuff[512]; + char ValueString[256] =""; + char * SDRANGEL_PATCHheader = "PATCH /sdrangel/deviceset/%d/device/settings " + "HTTP/1.1\nHost: %s\n" + "accept: application/json\n" + "Content-Type: application/json\n" + "Connection: keep-alive\n" + "Content-length: %d\r\n" + "\r\n%s"; + + if (!PORT->CONNECTED) + return; + + sprintf(ValueString, SDRANGEL_FREQ_DATA, "RTLSDR", Value); + + Len = sprintf(SendBuff, SDRANGEL_PATCHheader, 0, &PORT->remoteDest, strlen(ValueString), ValueString); + + ret = send(PORT->remoteSock, SendBuff, Len, 0); + + if (ret != Len) + { + if (PORT->remoteSock) + closesocket(PORT->remoteSock); + + PORT->remoteSock = 0; + PORT->CONNECTED = FALSE; + PORT->hDevice = 0; + } + + return; +} + + +void SDRANGELProcessMessage(struct RIGPORTINFO * PORT) +{ + // Called from Background thread + + int InputLen = recv(PORT->remoteSock, &PORT->RXBuffer[PORT->RXLen], 8192 - PORT->RXLen, 0); + + if (InputLen == 0 || InputLen == SOCKET_ERROR) + { + if (PORT->remoteSock) + closesocket(PORT->remoteSock); + + PORT->remoteSock = 0; + + PORT->CONNECTED = FALSE; + PORT->hDevice = 0; + return; + } + + PORT->RXLen += InputLen; + ProcessSDRANGELFrame(PORT); +} +// ---- G7TAJ ---- diff --git a/SCSPactor.c b/SCSPactor.c index 14c82c6..eff5512 100644 --- a/SCSPactor.c +++ b/SCSPactor.c @@ -1770,9 +1770,6 @@ VOID SCSPoll(int Port) Buffer[datalen] = 0; - // Buffer has an ax.25 header, which we need to pick out and set as channel 0 Connect address - // before sending the beacon - // If a Dragon with KISS over Hostmade we can just send it if (TNC->DragonKISS) @@ -1817,6 +1814,11 @@ VOID SCSPoll(int Port) return; } + // Not dragon KISS + + // Buffer has an ax.25 header, which we need to pick out and set as channel 0 Connect address + // before sending the beacon + // We also need to set Chan 0 Mycall so digi'ing can work, and put // it back after so incoming calls will work @@ -1824,7 +1826,6 @@ VOID SCSPoll(int Port) // This doesn't seem to work -/* ConvFromAX25(Buffer + 7, ICall); // Origin strlop(ICall, ' '); @@ -1867,7 +1868,7 @@ VOID SCSPoll(int Port) 1, Buffer, // Flag CmdSet as Data 2, TNC->NodeCall); // Flag as Chan 0 Command } -*/ + ReleaseBuffer((UINT *)buffptr); return; } diff --git a/TelnetV6.c b/TelnetV6.c index cbf8c4f..ad4c70b 100644 --- a/TelnetV6.c +++ b/TelnetV6.c @@ -780,6 +780,8 @@ scanCTEXT: } TCP->NumberofUsers += 1; } + else if (_memicmp(errbuf, "WL2KREPORT", 10) == 0) + TNC->WL2K = DecodeWL2KReportLine(errbuf); else if (_stricmp(param,"WebTermCSS") == 0) { TCP->WebTermCSS = _strdup(value); @@ -2492,7 +2494,7 @@ nosocks: { Port = atoi(P2); - if (Port > 33 || TCP->CMDPort[Port] == 0) + if (Port > MaxBPQPortNo || TCP->CMDPort[Port] == 0) { buffptr->Len = sprintf(&buffptr->Data[0], "Error - Invalid HOST Port\r"); C_Q_ADD(&TNC->Streams[Stream].PACTORtoBPQ_Q, buffptr); diff --git a/UIRoutines.c b/UIRoutines.c index 014fe01..923725b 100644 --- a/UIRoutines.c +++ b/UIRoutines.c @@ -153,7 +153,7 @@ VOID QueueRaw(int Port, PMESSAGEX AXMSG, int Len) AXMSG->LENGTH = Len; AXMSG->CHAIN = 0; // Clear chain in new buffer - memcpy(AXCopy, AXMSG, Len + 10); + memcpy(AXCopy, AXMSG, Len + 11); GetSemaphore(&DGSemaphore, 0); diff --git a/Versions.h b/Versions.h index 534ed21..3b3f657 100644 --- a/Versions.h +++ b/Versions.h @@ -10,8 +10,8 @@ #endif -#define KVers 6,0,24,10 -#define KVerstring "6.0.24.10\0" +#define KVers 6,0,24,11 +#define KVerstring "6.0.24.11\0" #ifdef CKernel diff --git a/cMain.c b/cMain.c index 9acb24a..d29847c 100644 --- a/cMain.c +++ b/cMain.c @@ -939,7 +939,8 @@ BOOL Start() PORT->QUAL_ADJUST = (UCHAR)PortRec->QUALADJUST; PORT->DIGIFLAG = PortRec->DIGIFLAG; - PORT->DIGIPORT = PortRec->DIGIPORT; + if (PortRec->DIGIPORT && CanPortDigi(PortRec->DIGIPORT)) + PORT->DIGIPORT = PortRec->DIGIPORT; PORT->DIGIMASK = PortRec->DIGIMASK; PORT->USERS = (UCHAR)PortRec->USERS; @@ -2075,7 +2076,6 @@ VOID TIMERINTERRUPT() L3FastTimer(); L4TimerProc(); - } // SEE IF ANY FRAMES TO TRACE diff --git a/rigcontrol.h b/rigcontrol.h index e762ea4..2868704 100644 --- a/rigcontrol.h +++ b/rigcontrol.h @@ -74,10 +74,11 @@ struct RIGINFO int ICF8101; // ICOM Land Mobile IC-F8101 char * CM108Device; // Device to open for CM108 GPIO PTT - struct _EXTPORTDATA * PortRecord[32]; // BPQ32 port record(s) for this rig (null terminated list) + struct _EXTPORTDATA * PortRecord[64]; // BPQ32 port record(s) for this rig (null terminated list) UCHAR RigAddr; - uint64_t ScanStopped; // Scanning enabled if zero. Bits used for interlocked scanning (eg winmor/pactor on same port + int Channel; // For sdrangel + uint64_t ScanStopped; // Scanning enabled if zero. Bits used for interlocked scanning (eg winmor/pactor on same port int ScanCounter; int PollCounter; // Don't poll too often; int ScanFreq; // Scan Rate @@ -198,6 +199,9 @@ struct RIGINFO #define RTLUDP 16 #define FLRIG 17 #define SDRRADIO 18 +//G7TAJ +#define SDRANGEL 19 +//G7TAJ // Yease seem to have lots of variants of the same model @@ -234,7 +238,9 @@ struct RIGPORTINFO HANDLE hPTTDevice; // May use a different port for PTT UCHAR TXBuffer[500]; // Last message sent - saved for Retry int TXLen; // Len of last sent - UCHAR RXBuffer[500]; // Message being received - may not arrive all at once +// ---- G7TAJ ---- + UCHAR RXBuffer[8192]; // Message being received - may not arrive all at once. SDRANGLE needs a lot +// ---- G7TAJ ---- int RXLen; // Data in RXBUffer BOOL AutoPoll; // set if last command was a Timer poll // Local ScanStruct for Interactive Commands