Initial commit
This commit is contained in:
commit
4013228679
4 changed files with 205 additions and 0 deletions
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
*.png
|
||||
*.jpg
|
||||
3
go.mod
Normal file
3
go.mod
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
module e2http
|
||||
|
||||
go 1.19
|
||||
79
httpscreen.txt
Normal file
79
httpscreen.txt
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
@name HttpScreen
|
||||
@inputs DS:wirelink
|
||||
@persist ResX ResY X Y Stage
|
||||
|
||||
DS_RESET = 1048574
|
||||
DS_MODE = 1048569
|
||||
DS_CLK = 1048575
|
||||
DS_RES_X = 1048572
|
||||
DS_RES_Y = 1048573
|
||||
|
||||
function wirelink:dsClk() {
|
||||
This[DS_CLK] = 1
|
||||
}
|
||||
|
||||
function wirelink:dsInit(Mode, ResX, ResY) {
|
||||
This[DS_RESET] = 0
|
||||
This[DS_MODE] = Mode
|
||||
This:dsClk()
|
||||
This[DS_RES_X] = ResX
|
||||
This[DS_RES_Y] = ResY
|
||||
}
|
||||
|
||||
function wirelink:dsPixel(X, Y, Pixel:number) {
|
||||
This[X + Y*ResY] = Pixel
|
||||
}
|
||||
|
||||
SERVER = "<HTTP URL>"
|
||||
IMAGE = "<IMAGE NAME>"
|
||||
|
||||
STAGE_INFO = 0
|
||||
STAGE_REQUEST = 1
|
||||
STAGE_WAIT = 2
|
||||
STAGE_RENDER = 3
|
||||
STAGE_STOP = 4
|
||||
|
||||
if (first()) {
|
||||
Stage = STAGE_INFO
|
||||
httpRequest(SERVER + "/image?name=" + IMAGE + "&action=resolution")
|
||||
runOnHTTP(1)
|
||||
}
|
||||
|
||||
if (Stage == STAGE_INFO && httpClk() == 1) {
|
||||
Res = httpData():explode(",")
|
||||
ResX = Res[1, string]:toNumber()
|
||||
ResY = Res[2, string]:toNumber()
|
||||
DS:dsInit(2, ResX, ResY)
|
||||
|
||||
Stage = STAGE_REQUEST
|
||||
}
|
||||
|
||||
interval(100)
|
||||
RENDER_STRIDE = 256
|
||||
|
||||
if (Stage == STAGE_REQUEST && httpCanRequest()) {
|
||||
httpRequest(SERVER + "/image?name=" + IMAGE + "&action=pixels&x=" + X + "&y=" + Y + "&count=" + RENDER_STRIDE + "&mode=2")
|
||||
Stage = STAGE_WAIT
|
||||
runOnHTTP(1)
|
||||
}
|
||||
if (Stage == STAGE_WAIT && httpClk() == 1) {
|
||||
Stage = STAGE_RENDER
|
||||
|
||||
Pixels = httpData():explode(",")
|
||||
for (I=1,RENDER_STRIDE) {
|
||||
DS:dsPixel(X+I, Y, Pixels[I, string]:toNumber())
|
||||
}
|
||||
|
||||
X = X + RENDER_STRIDE
|
||||
if (X >= ResX) {
|
||||
X = 0
|
||||
Y++
|
||||
}
|
||||
if (Y >= ResY) {
|
||||
Stage = STAGE_STOP
|
||||
} else {
|
||||
Stage = STAGE_REQUEST
|
||||
}
|
||||
} else {
|
||||
#print(httpData())
|
||||
}
|
||||
121
main.go
Normal file
121
main.go
Normal file
|
|
@ -0,0 +1,121 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"image"
|
||||
_ "image/jpeg"
|
||||
_ "image/png"
|
||||
"net/http"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type E2Image struct {
|
||||
file *os.File
|
||||
image image.Image
|
||||
bounds image.Rectangle
|
||||
}
|
||||
|
||||
var images map[string]E2Image
|
||||
|
||||
func getImage(name string) (E2Image, bool) {
|
||||
img, ok := images[name]
|
||||
if ok {
|
||||
return img, true
|
||||
} else {
|
||||
img := E2Image{}
|
||||
file, err := os.Open(name)
|
||||
if err != nil {
|
||||
return img, false
|
||||
}
|
||||
img.file = file
|
||||
|
||||
m, _, err := image.Decode(file)
|
||||
if err != nil {
|
||||
file.Close()
|
||||
return img, false
|
||||
}
|
||||
img.image = m
|
||||
img.bounds = m.Bounds()
|
||||
|
||||
return img, true
|
||||
}
|
||||
}
|
||||
|
||||
func convertPixel(r uint32, g uint32, b uint32) (uint32, uint32, uint32) {
|
||||
return (r / 0xFFFF) * 255, (g / 0xFFFF) * 255, (b / 0xFFFF) * 255
|
||||
}
|
||||
|
||||
func handleImage(w http.ResponseWriter, r *http.Request) {
|
||||
name := r.URL.Query().Get("name")
|
||||
img, ok := getImage(name)
|
||||
if !ok {
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
fmt.Fprintf(w, "Error")
|
||||
}
|
||||
|
||||
action := r.URL.Query().Get("action")
|
||||
switch action {
|
||||
case "resolution":
|
||||
fmt.Fprintf(w, "%d,%d", img.bounds.Max.X, img.bounds.Max.Y)
|
||||
case "pixels":
|
||||
x, _ := strconv.Atoi(r.URL.Query().Get("x"))
|
||||
y, _ := strconv.Atoi(r.URL.Query().Get("y"))
|
||||
count, _ := strconv.Atoi(r.URL.Query().Get("count"))
|
||||
width := img.bounds.Max.X
|
||||
|
||||
mode, _ := strconv.Atoi(r.URL.Query().Get("mode"))
|
||||
pixels := make([]string, count)
|
||||
for i := 0; i < count; i++ {
|
||||
xPos := (x + i) % width
|
||||
yPos := y
|
||||
if x+i >= width {
|
||||
yPos = y + 1
|
||||
}
|
||||
|
||||
r32, g32, b32, _ := img.image.At(xPos, yPos).RGBA()
|
||||
r, g, b := convertPixel(r32, g32, b32)
|
||||
switch mode {
|
||||
case 2:
|
||||
pixels[i] = strconv.FormatUint((uint64)((r*65536)+(g*256)+b), 10)
|
||||
case 3:
|
||||
pixels[i] = fmt.Sprintf("%d%d%d", r, g, b)
|
||||
default:
|
||||
pixels[i] = strconv.FormatUint((uint64)((r*65536)+(g*256)+b), 10)
|
||||
}
|
||||
}
|
||||
|
||||
fmt.Fprint(w, strings.Join(pixels, ","))
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
http.HandleFunc("/info", func(w http.ResponseWriter, r *http.Request) {
|
||||
fmt.Fprintf(w, "RemoteAddr: %s\n", r.RemoteAddr)
|
||||
for name, headers := range r.Header {
|
||||
for _, value := range headers {
|
||||
fmt.Fprintf(w, "%s: %s\n", name, value)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
http.HandleFunc("/buffer", func(w http.ResponseWriter, r *http.Request) {
|
||||
size, err := strconv.Atoi(r.URL.Query().Get("size"))
|
||||
if err != nil {
|
||||
w.WriteHeader(http.StatusBadRequest)
|
||||
fmt.Fprintf(w, "Invalid parameter")
|
||||
}
|
||||
|
||||
buffer := make([]byte, size)
|
||||
for i := 0; i < size; i++ {
|
||||
buffer[i] = 'A'
|
||||
}
|
||||
|
||||
w.Write(buffer)
|
||||
})
|
||||
|
||||
http.HandleFunc("/image", handleImage)
|
||||
|
||||
http.ListenAndServe(":1337", nil)
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue