UNPKG

node-red-contrib-tak-registration

Version:

A Node-RED node to register to TAK and to help wrap files as datapackages to send to TAK

640 lines (638 loc) 17.1 kB
import StringBuffer from '../../../../java/lang/StringBuffer' import Double from '../../../../java/lang/Double' import Integer from '../../../../java/lang/Integer' import Character from '../../../../java/lang/Character' import Comparable from '../../../../java/lang/Comparable' import Cloneable from '../../../../java/lang/Cloneable' import Serializable from '../../../../java/io/Serializable' export default class DD { constructor () { this._hi = 0.0 this._lo = 0.0 if (arguments.length === 0) { this.init(0.0) } else if (arguments.length === 1) { if (typeof arguments[0] === 'number') { let x = arguments[0] this.init(x) } else if (arguments[0] instanceof DD) { let dd = arguments[0] this.init(dd) } else if (typeof arguments[0] === 'string') { let str = arguments[0] DD.call(this, DD.parse(str)) } } else if (arguments.length === 2) { const hi = arguments[0] const lo = arguments[1] this.init(hi, lo) } } le (y) { return (this._hi < y._hi || this._hi === y._hi) && this._lo <= y._lo } extractSignificantDigits (insertDecimalPoint, magnitude) { var y = this.abs() var mag = DD.magnitude(y._hi) var scale = DD.TEN.pow(mag) y = y.divide(scale) if (y.gt(DD.TEN)) { y = y.divide(DD.TEN) mag += 1 } else if (y.lt(DD.ONE)) { y = y.multiply(DD.TEN) mag -= 1 } var decimalPointPos = mag + 1 var buf = new StringBuffer() var numDigits = DD.MAX_PRINT_DIGITS - 1 for (var i = 0; i <= numDigits; i++) { if (insertDecimalPoint && i === decimalPointPos) { buf.append('.') } var digit = Math.trunc(y._hi) if (digit < 0 || digit > 9) {} if (digit < 0) { break } var rebiasBy10 = false var digitChar = 0 if (digit > 9) { rebiasBy10 = true digitChar = '9' } else { digitChar = '0' + digit } buf.append(digitChar) y = y.subtract(DD.valueOf(digit)).multiply(DD.TEN) if (rebiasBy10) y.selfAdd(DD.TEN) var continueExtractingDigits = true var remMag = DD.magnitude(y._hi) if (remMag < 0 && Math.abs(remMag) >= numDigits - i) continueExtractingDigits = false if (!continueExtractingDigits) break } magnitude[0] = mag return buf.toString() } sqr () { return this.multiply(this) } doubleValue () { return this._hi + this._lo } subtract () { if (arguments[0] instanceof DD) { let y = arguments[0] return this.add(y.negate()) } else if (typeof arguments[0] === 'number') { let y = arguments[0] return this.add(-y) } } equals () { if (arguments.length === 1) { let y = arguments[0] return this._hi === y._hi && this._lo === y._lo } } isZero () { return this._hi === 0.0 && this._lo === 0.0 } selfSubtract () { if (arguments[0] instanceof DD) { let y = arguments[0] if (this.isNaN()) return this return this.selfAdd(-y._hi, -y._lo) } else if (typeof arguments[0] === 'number') { let y = arguments[0] if (this.isNaN()) return this return this.selfAdd(-y, 0.0) } } getSpecialNumberString () { if (this.isZero()) return '0.0' if (this.isNaN()) return 'NaN ' return null } min (x) { if (this.le(x)) { return this } else { return x } } selfDivide () { if (arguments.length === 1) { if (arguments[0] instanceof DD) { let y = arguments[0] return this.selfDivide(y._hi, y._lo) } else if (typeof arguments[0] === 'number') { let y = arguments[0] return this.selfDivide(y, 0.0) } } else if (arguments.length === 2) { const yhi = arguments[0] const ylo = arguments[1] let hc = null let tc = null let hy = null let ty = null let C = null let c = null let U = null let u = null C = this._hi / yhi c = DD.SPLIT * C hc = c - C u = DD.SPLIT * yhi hc = c - hc tc = C - hc hy = u - yhi U = C * yhi hy = u - hy ty = yhi - hy u = hc * hy - U + hc * ty + tc * hy + tc * ty c = (this._hi - U - u + this._lo - C * ylo) / yhi u = C + c this._hi = u this._lo = C - u + c return this } } dump () { return 'DD<' + this._hi + ', ' + this._lo + '>' } divide () { if (arguments[0] instanceof DD) { let y = arguments[0] let hc = null let tc = null let hy = null let ty = null let C = null let c = null let U = null let u = null C = this._hi / y._hi c = DD.SPLIT * C hc = c - C u = DD.SPLIT * y._hi hc = c - hc tc = C - hc hy = u - y._hi U = C * y._hi hy = u - hy ty = y._hi - hy u = hc * hy - U + hc * ty + tc * hy + tc * ty c = (this._hi - U - u + this._lo - C * y._lo) / y._hi u = C + c var zhi = u var zlo = C - u + c return new DD(zhi, zlo) } else if (typeof arguments[0] === 'number') { let y = arguments[0] if (Double.isNaN(y)) return DD.createNaN() return DD.copy(this).selfDivide(y, 0.0) } } ge (y) { return (this._hi > y._hi || this._hi === y._hi) && this._lo >= y._lo } pow (exp) { if (exp === 0.0) return DD.valueOf(1.0) var r = new DD(this) var s = DD.valueOf(1.0) var n = Math.abs(exp) if (n > 1) { while (n > 0) { if (n % 2 === 1) { s.selfMultiply(r) } n /= 2 if (n > 0) r = r.sqr() } } else { s = r } if (exp < 0) return s.reciprocal() return s } ceil () { if (this.isNaN()) return DD.NaN var fhi = Math.ceil(this._hi) var flo = 0.0 if (fhi === this._hi) { flo = Math.ceil(this._lo) } return new DD(fhi, flo) } compareTo (o) { var other = o if (this._hi < other._hi) return -1 if (this._hi > other._hi) return 1 if (this._lo < other._lo) return -1 if (this._lo > other._lo) return 1 return 0 } rint () { if (this.isNaN()) return this var plus5 = this.add(0.5) return plus5.floor() } setValue () { if (arguments[0] instanceof DD) { let value = arguments[0] this.init(value) return this } else if (typeof arguments[0] === 'number') { let value = arguments[0] this.init(value) return this } } max (x) { if (this.ge(x)) { return this } else { return x } } sqrt () { if (this.isZero()) return DD.valueOf(0.0) if (this.isNegative()) { return DD.NaN } var x = 1.0 / Math.sqrt(this._hi) var ax = this._hi * x var axdd = DD.valueOf(ax) var diffSq = this.subtract(axdd.sqr()) var d2 = diffSq._hi * (x * 0.5) return axdd.add(d2) } selfAdd () { if (arguments.length === 1) { if (arguments[0] instanceof DD) { let y = arguments[0] return this.selfAdd(y._hi, y._lo) } else if (typeof arguments[0] === 'number') { let y = arguments[0] let H = null let h = null let S = null let s = null let e = null let f = null S = this._hi + y e = S - this._hi s = S - e s = y - e + (this._hi - s) f = s + this._lo H = S + f h = f + (S - H) this._hi = H + h this._lo = h + (H - this._hi) return this } } else if (arguments.length === 2) { const yhi = arguments[0] const ylo = arguments[1] let H = null let h = null let T = null let t = null let S = null let s = null let e = null let f = null S = this._hi + yhi T = this._lo + ylo e = S - this._hi f = T - this._lo s = S - e t = T - f s = yhi - e + (this._hi - s) t = ylo - f + (this._lo - t) e = s + T H = S + e h = e + (S - H) e = t + h var zhi = H + e var zlo = e + (H - zhi) this._hi = zhi this._lo = zlo return this } } selfMultiply () { if (arguments.length === 1) { if (arguments[0] instanceof DD) { let y = arguments[0] return this.selfMultiply(y._hi, y._lo) } else if (typeof arguments[0] === 'number') { let y = arguments[0] return this.selfMultiply(y, 0.0) } } else if (arguments.length === 2) { const yhi = arguments[0] const ylo = arguments[1] let hx = null let tx = null let hy = null let ty = null let C = null let c = null C = DD.SPLIT * this._hi hx = C - this._hi c = DD.SPLIT * yhi hx = C - hx tx = this._hi - hx hy = c - yhi C = this._hi * yhi hy = c - hy ty = yhi - hy c = hx * hy - C + hx * ty + tx * hy + tx * ty + (this._hi * ylo + this._lo * yhi) var zhi = C + c hx = C - zhi var zlo = c + hx this._hi = zhi this._lo = zlo return this } } selfSqr () { return this.selfMultiply(this) } floor () { if (this.isNaN()) return DD.NaN var fhi = Math.floor(this._hi) var flo = 0.0 if (fhi === this._hi) { flo = Math.floor(this._lo) } return new DD(fhi, flo) } negate () { if (this.isNaN()) return this return new DD(-this._hi, -this._lo) } clone () { // try { // return null // } catch (ex) { // if (ex instanceof CloneNotSupportedException) { // return null // } else throw ex // } finally {} } multiply () { if (arguments[0] instanceof DD) { let y = arguments[0] if (y.isNaN()) return DD.createNaN() return DD.copy(this).selfMultiply(y) } else if (typeof arguments[0] === 'number') { let y = arguments[0] if (Double.isNaN(y)) return DD.createNaN() return DD.copy(this).selfMultiply(y, 0.0) } } isNaN () { return Double.isNaN(this._hi) } intValue () { return Math.trunc(this._hi) } toString () { var mag = DD.magnitude(this._hi) if (mag >= -3 && mag <= 20) return this.toStandardNotation() return this.toSciNotation() } toStandardNotation () { var specialStr = this.getSpecialNumberString() if (specialStr !== null) return specialStr var magnitude = new Array(1).fill(null) var sigDigits = this.extractSignificantDigits(true, magnitude) var decimalPointPos = magnitude[0] + 1 var num = sigDigits if (sigDigits.charAt(0) === '.') { num = '0' + sigDigits } else if (decimalPointPos < 0) { num = '0.' + DD.stringOfChar('0', -decimalPointPos) + sigDigits } else if (sigDigits.indexOf('.') === -1) { var numZeroes = decimalPointPos - sigDigits.length var zeroes = DD.stringOfChar('0', numZeroes) num = sigDigits + zeroes + '.0' } if (this.isNegative()) return '-' + num return num } reciprocal () { let hc = null let tc = null let hy = null let ty = null let C = null let c = null let U = null let u = null C = 1.0 / this._hi c = DD.SPLIT * C hc = c - C u = DD.SPLIT * this._hi hc = c - hc tc = C - hc hy = u - this._hi U = C * this._hi hy = u - hy ty = this._hi - hy u = hc * hy - U + hc * ty + tc * hy + tc * ty c = (1.0 - U - u - C * this._lo) / this._hi var zhi = C + c var zlo = C - zhi + c return new DD(zhi, zlo) } toSciNotation () { if (this.isZero()) return DD.SCI_NOT_ZERO var specialStr = this.getSpecialNumberString() if (specialStr !== null) return specialStr var magnitude = new Array(1).fill(null) var digits = this.extractSignificantDigits(false, magnitude) var expStr = DD.SCI_NOT_EXPONENT_CHAR + magnitude[0] if (digits.charAt(0) === '0') { throw new Error('Found leading zero: ' + digits) } var trailingDigits = '' if (digits.length > 1) trailingDigits = digits.substring(1) var digitsWithDecimal = digits.charAt(0) + '.' + trailingDigits if (this.isNegative()) return '-' + digitsWithDecimal + expStr return digitsWithDecimal + expStr } abs () { if (this.isNaN()) return DD.NaN if (this.isNegative()) return this.negate() return new DD(this) } isPositive () { return (this._hi > 0.0 || this._hi === 0.0) && this._lo > 0.0 } lt (y) { return (this._hi < y._hi || this._hi === y._hi) && this._lo < y._lo } add () { if (arguments[0] instanceof DD) { let y = arguments[0] return DD.copy(this).selfAdd(y) } else if (typeof arguments[0] === 'number') { let y = arguments[0] return DD.copy(this).selfAdd(y) } } init () { if (arguments.length === 1) { if (typeof arguments[0] === 'number') { let x = arguments[0] this._hi = x this._lo = 0.0 } else if (arguments[0] instanceof DD) { let dd = arguments[0] this._hi = dd._hi this._lo = dd._lo } } else if (arguments.length === 2) { const hi = arguments[0] const lo = arguments[1] this._hi = hi this._lo = lo } } gt (y) { return (this._hi > y._hi || this._hi === y._hi) && this._lo > y._lo } isNegative () { return (this._hi < 0.0 || this._hi === 0.0) && this._lo < 0.0 } trunc () { if (this.isNaN()) return DD.NaN if (this.isPositive()) return this.floor(); else return this.ceil() } signum () { if (this._hi > 0) return 1 if (this._hi < 0) return -1 if (this._lo > 0) return 1 if (this._lo < 0) return -1 return 0 } interfaces_ () { return [Serializable, Comparable, Cloneable] } getClass () { return DD } static sqr (x) { return DD.valueOf(x).selfMultiply(x) } static valueOf () { if (typeof arguments[0] === 'string') { let str = arguments[0] return DD.parse(str) } else if (typeof arguments[0] === 'number') { let x = arguments[0] return new DD(x) } } static sqrt (x) { return DD.valueOf(x).sqrt() } static parse (str) { var i = 0 var strlen = str.length while (Character.isWhitespace(str.charAt(i))) i++ var isNegative = false if (i < strlen) { var signCh = str.charAt(i) if (signCh === '-' || signCh === '+') { i++ if (signCh === '-') isNegative = true } } var val = new DD() var numDigits = 0 var numBeforeDec = 0 var exp = 0 while (true) { if (i >= strlen) break var ch = str.charAt(i) i++ if (Character.isDigit(ch)) { var d = ch - '0' val.selfMultiply(DD.TEN) val.selfAdd(d) numDigits++ continue } if (ch === '.') { numBeforeDec = numDigits continue } if (ch === 'e' || ch === 'E') { var expStr = str.substring(i) try { exp = Integer.parseInt(expStr) } catch (ex) { if (ex instanceof Error) { throw new Error('Invalid exponent ' + expStr + ' in string ' + str) } else throw ex } finally {} break } throw new Error("Unexpected character '" + ch + "' at position " + i + ' in string ' + str) } let val2 = val const numDecPlaces = numDigits - numBeforeDec - exp if (numDecPlaces === 0) { val2 = val } else if (numDecPlaces > 0) { const scale = DD.TEN.pow(numDecPlaces) val2 = val.divide(scale) } else if (numDecPlaces < 0) { const scale = DD.TEN.pow(-numDecPlaces) val2 = val.multiply(scale) } if (isNegative) { return val2.negate() } return val2 } static createNaN () { return new DD(Double.NaN, Double.NaN) } static copy (dd) { return new DD(dd) } static magnitude (x) { var xAbs = Math.abs(x) var xLog10 = Math.log(xAbs) / Math.log(10) var xMag = Math.trunc(Math.floor(xLog10)) var xApprox = Math.pow(10, xMag) if (xApprox * 10 <= xAbs) xMag += 1 return xMag } static stringOfChar (ch, len) { var buf = new StringBuffer() for (var i = 0; i < len; i++) { buf.append(ch) } return buf.toString() } static get PI () { return new DD(3.141592653589793116e+00, 1.224646799147353207e-16) } static get TWO_PI () { return new DD(6.283185307179586232e+00, 2.449293598294706414e-16) } static get PI_2 () { return new DD(1.570796326794896558e+00, 6.123233995736766036e-17) } static get E () { return new DD(2.718281828459045091e+00, 1.445646891729250158e-16) } static get NaN () { return new DD(Double.NaN, Double.NaN) } static get EPS () { return 1.23259516440783e-32 } static get SPLIT () { return 134217729.0 } static get MAX_PRINT_DIGITS () { return 32 } static get TEN () { return DD.valueOf(10.0) } static get ONE () { return DD.valueOf(1.0) } static get SCI_NOT_EXPONENT_CHAR () { return 'E' } static get SCI_NOT_ZERO () { return '0.0E0' } }