|
|
@@ -75,7 +75,7 @@ let AH = 600
|
|
|
let AC = 300
|
|
|
let ABUFSZ = AW * AH * 4
|
|
|
|
|
|
-// Geometry (Nucleus matches bootloader MAX_R exactly)
|
|
|
+// Geometry
|
|
|
let NUC_R = 28
|
|
|
let INNER_R = 120
|
|
|
let OUTER_R = 200
|
|
|
@@ -183,6 +183,71 @@ func blit(_ src: UnsafeMutablePointer<UInt8>,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+// ── Isolated IPC Client (talks to arkrt daemon) ──
|
|
|
+
|
|
|
+func queryIPC(cmdId: UInt16, payload: String = "") -> String {
|
|
|
+ let fd = socket(AF_UNIX, 1, 0)
|
|
|
+ if fd < 0 { return "ERROR" }
|
|
|
+ defer { close(fd) }
|
|
|
+
|
|
|
+ var addr = sockaddr_un()
|
|
|
+ addr.sun_family = sa_family_t(AF_UNIX)
|
|
|
+ let socketPath = "/dev/arkrt.sock"
|
|
|
+ let pathBytes = socketPath.utf8CString
|
|
|
+ withUnsafeMutablePointer(to: &addr.sun_path) { sunPathPtr in
|
|
|
+ let rawPtr = UnsafeMutableRawPointer(sunPathPtr).assumingMemoryBound(to: CChar.self)
|
|
|
+ for i in 0..<min(pathBytes.count, 108) {
|
|
|
+ rawPtr[i] = pathBytes[i]
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ let addrSize = MemoryLayout<sockaddr_un>.size
|
|
|
+ let connectResult = withUnsafePointer(to: &addr) { addrPtr in
|
|
|
+ addrPtr.withMemoryRebound(to: sockaddr.self, capacity: 1) { saPtr in
|
|
|
+ connect(fd, saPtr, socklen_t(addrSize))
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if connectResult < 0 {
|
|
|
+ return "OFFLINE"
|
|
|
+ }
|
|
|
+
|
|
|
+ // Construct strict binary request header
|
|
|
+ let payloadData = payload.data(using: .utf8) ?? Data()
|
|
|
+ var request = Data()
|
|
|
+ var bigEndianCmd = cmdId.bigEndian
|
|
|
+ var bigEndianLen = UInt32(payloadData.count).bigEndian
|
|
|
+ withUnsafeBytes(of: &bigEndianCmd) { request.append(contentsOf: $0) }
|
|
|
+ withUnsafeBytes(of: &bigEndianLen) { request.append(contentsOf: $0) }
|
|
|
+ request.append(payloadData)
|
|
|
+
|
|
|
+ // Send request
|
|
|
+ request.withUnsafeBytes { reqBytes in
|
|
|
+ _ = write(fd, reqBytes.baseAddress, reqBytes.count)
|
|
|
+ }
|
|
|
+
|
|
|
+ // Read response
|
|
|
+ let bufSize = 4096
|
|
|
+ let respBuf = UnsafeMutablePointer<UInt8>.allocate(capacity: bufSize)
|
|
|
+ defer { respBuf.deallocate() }
|
|
|
+
|
|
|
+ let bytesRead = read(fd, respBuf, bufSize)
|
|
|
+ if bytesRead < 6 {
|
|
|
+ return "ERROR_RESP"
|
|
|
+ }
|
|
|
+
|
|
|
+ let responseBuffer = UnsafeRawBufferPointer(start: respBuf, count: bytesRead)
|
|
|
+ let respCmd = responseBuffer.load(fromByteOffset: 0, as: UInt16.self).bigEndian
|
|
|
+ let respLen = responseBuffer.load(fromByteOffset: 2, as: UInt32.self).bigEndian
|
|
|
+
|
|
|
+ if respCmd == cmdId && bytesRead >= 6 + Int(respLen) {
|
|
|
+ let respPayloadBytes = UnsafeRawBufferPointer(rebasing: responseBuffer[6..<(6 + Int(respLen))])
|
|
|
+ return String(decoding: respPayloadBytes, as: UTF8.self)
|
|
|
+ }
|
|
|
+
|
|
|
+ return "INVALID_DATA"
|
|
|
+}
|
|
|
+
|
|
|
// ══════════════════════════════════════════════════════════════════
|
|
|
|
|
|
func drawSwiftSplash() {
|
|
|
@@ -216,7 +281,7 @@ func drawSwiftSplash() {
|
|
|
let sx = (scrW - AW) / 2
|
|
|
let sy = (scrH - AH) / 2
|
|
|
|
|
|
- // ── Pre-render static nucleus template (rings drawn dynamically in phases) ──
|
|
|
+ // ── Pre-render static nucleus template ──
|
|
|
memset(tpl, 0, ABUFSZ)
|
|
|
diskAA(tpl, Double(AC), Double(AC), Double(NUC_R), 255)
|
|
|
|
|
|
@@ -225,17 +290,15 @@ func drawSwiftSplash() {
|
|
|
memset(work, 0, ABUFSZ)
|
|
|
|
|
|
let t = Double(frame) / 34.0
|
|
|
- let easeOut = 1.0 - pow(1.0 - t, 3.0) // ease-out cubic
|
|
|
+ let easeOut = 1.0 - pow(1.0 - t, 3.0)
|
|
|
|
|
|
let curInnerR = Double(INNER_R) * easeOut
|
|
|
let curOuterR = Double(OUTER_R) * easeOut
|
|
|
let curElR = max(1.0, Double(ELEC_R) * easeOut)
|
|
|
let ringBright = UInt8(60.0 * easeOut)
|
|
|
|
|
|
- // Draw nucleus
|
|
|
diskAA(work, Double(AC), Double(AC), Double(NUC_R), 255)
|
|
|
|
|
|
- // Draw expanding rings
|
|
|
if curInnerR > Double(NUC_R) {
|
|
|
ringAA(work, Double(AC), Double(AC), curInnerR, RING_T, ringBright)
|
|
|
}
|
|
|
@@ -245,7 +308,6 @@ func drawSwiftSplash() {
|
|
|
|
|
|
let angle = Double(frame) * 0.10
|
|
|
|
|
|
- // Inner electrons
|
|
|
for i in 0..<2 {
|
|
|
let a = angle + Double(i) * Double.pi
|
|
|
let ex = Double(AC) + cos(a) * curInnerR
|
|
|
@@ -253,7 +315,6 @@ func drawSwiftSplash() {
|
|
|
diskAA(work, ex, ey, curElR, 255)
|
|
|
}
|
|
|
|
|
|
- // Outer electrons (counter-rotating)
|
|
|
for i in 0..<2 {
|
|
|
let a = -angle * 0.6 + Double(i) * Double.pi
|
|
|
let ex = Double(AC) + cos(a) * curOuterR
|
|
|
@@ -262,7 +323,7 @@ func drawSwiftSplash() {
|
|
|
}
|
|
|
|
|
|
blit(work, fbp, sx, sy, lineLen, scrH)
|
|
|
- usleep(16666) // 60 fps target
|
|
|
+ usleep(16666)
|
|
|
}
|
|
|
|
|
|
// ── Pre-render static stable orbit template for Phase 2 ──
|
|
|
@@ -277,7 +338,6 @@ func drawSwiftSplash() {
|
|
|
|
|
|
let angle = (35.0 * 0.10) + Double(frame) * 0.05
|
|
|
|
|
|
- // Inner orbit — 2 electrons
|
|
|
for i in 0..<2 {
|
|
|
let a = angle + Double(i) * Double.pi
|
|
|
let ex = Double(AC) + cos(a) * Double(INNER_R)
|
|
|
@@ -285,7 +345,6 @@ func drawSwiftSplash() {
|
|
|
diskAA(work, ex, ey, Double(ELEC_R), 255)
|
|
|
}
|
|
|
|
|
|
- // Outer orbit — 2 electrons
|
|
|
for i in 0..<2 {
|
|
|
let a = -angle * 0.6 + Double(i) * Double.pi
|
|
|
let ex = Double(AC) + cos(a) * Double(OUTER_R)
|
|
|
@@ -310,10 +369,8 @@ func drawSwiftSplash() {
|
|
|
let curElR = max(1.0, Double(ELEC_R) * (1.0 - easeIn))
|
|
|
let nucG = Double(NUC_R) + easeIn * 20.0
|
|
|
|
|
|
- // Nucleus
|
|
|
diskAA(work, Double(AC), Double(AC), nucG, 255)
|
|
|
|
|
|
- // Fading rings
|
|
|
if curInner > nucG + 2.0 {
|
|
|
ringAA(work, Double(AC), Double(AC), curInner, RING_T, UInt8(60.0 * (1.0 - t)))
|
|
|
}
|
|
|
@@ -321,7 +378,6 @@ func drawSwiftSplash() {
|
|
|
ringAA(work, Double(AC), Double(AC), curOuter, RING_T, UInt8(60.0 * (1.0 - t)))
|
|
|
}
|
|
|
|
|
|
- // Fast spiral rotation
|
|
|
let angle = baseAngle + t * Double.pi * 6.0
|
|
|
|
|
|
if curElR > 1.0 {
|
|
|
@@ -369,6 +425,7 @@ func drawSwiftSplash() {
|
|
|
""")
|
|
|
print("\nArkOS Initialized. Drawing 'Swift' via native Swift runtime!\n")
|
|
|
|
|
|
+ // Draw gradient below text
|
|
|
for y in 200..<scrH {
|
|
|
for x in 0..<scrW {
|
|
|
let off = (x + Int(vinfo.xoffset)) * bpp +
|
|
|
@@ -385,7 +442,21 @@ func drawSwiftSplash() {
|
|
|
munmap(fb_ptr, scrSz)
|
|
|
close(fd)
|
|
|
|
|
|
- while true { }
|
|
|
+ // Query system info from the background system service daemon (arkrt)
|
|
|
+ let ip = queryIPC(cmdId: 102)
|
|
|
+ let battery = queryIPC(cmdId: 103)
|
|
|
+ let sysTime = queryIPC(cmdId: 101)
|
|
|
+
|
|
|
+ print("──────────────────────────────────────────────────────")
|
|
|
+ print(" ArkOS Service Framework Status (Via Isolated IPC):")
|
|
|
+ print(" - Interface IP : \(ip)")
|
|
|
+ print(" - System Time : \(sysTime)")
|
|
|
+ print(" - Battery Level : \(battery)")
|
|
|
+ print("──────────────────────────────────────────────────────\n")
|
|
|
+
|
|
|
+ while true {
|
|
|
+ usleep(500_000)
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
drawSwiftSplash()
|