diff --git a/php/monoformat.php b/php/monoformat.php new file mode 100644 index 0000000..777ed64 --- /dev/null +++ b/php/monoformat.php @@ -0,0 +1,201 @@ +text); + $result = pack("vvvvvCCvv", + 17, + $this->x, + $this->y, + $this->width, + $this->height, + $this->flags, + $this->scrollSpeed, + $this->fontIndex, + $len); + $result .= (string) $this->text; + if ($len % 4 != 0) { + $n = 4 - ($len % 4); + for ($i = 0; $i < $n; ++$i) { + $result .= chr(0); + } + } + return $result; + } +} + +class CurrentTimeElement extends Element { + public $x = 0; + public $y = 0; + public $width = 0; + public $height = 0; + public $fontIndex = 0; + public $utcOffset = 0; + public $flags = 0; + + public function serialize() { + $result = pack("vvvvvvvv", + 32, + $this->x, + $this->y, + $this->width, + $this->height, + $this->fontIndex, + $this->utcOffset, + $this->flags); + return $result; + } +} + +class Section { + public function serialize() { + return ""; + } +} + +class AlwaysDrawnSection extends Section { + public $drawOnFront = false; + public $drawOnBack = false; + public $clearBeforeDrawing = false; + public $elements = []; + + public function serialize() { + $flags = 0; + if ($this->drawOnFront) { + $flags |= 0x01; + } + if ($this->drawOnBack) { + $flags |= 0x02; + } + if ($this->clearBeforeDrawing) { + $flags |= 0x04; + } + $inner = pack("vv", $flags, count($this->elements)); + foreach ($this->elements as $element) { + $inner .= $element->serialize(); + } + $len = strlen($inner) + 4; + $len = substr(pack("V", $len), 0, 3); + return pack("C", 1) . $len . $inner; + } +} + +class File { + public $sections = []; + + public function serialize() { + $nSections = count($this->sections); + $result = "\xAF\x7E\x2B\x63"; + $result .= pack("Vvv", 1, $nSections, 0); + foreach ($this->sections as $section) { + $result .= $section->serialize(); + } + return $result; + } +} + +} // namespace monoformat + +namespace { + +$roomName= "BOOL"; + +$data = json_decode(file_get_contents("https://cfp.cttue.de/tdf5/schedule/export/schedule.json"), true); +$talks = []; +$now = new DateTimeImmutable("now"); +foreach ($data["schedule"]["conference"]["days"] as $day) { + foreach ($day["rooms"][$roomName] as $t) { + [$h, $m] = explode(":", $t["duration"]); + $duration = $h * 3600 + $m * 60; + $duration = DateInterval::createFromDateString("$duration sec"); + $talk = [ + "date" => new DateTimeImmutable($t["date"]), + "duration" => $duration, + "title" => $t["title"], + ]; + $talkEnd = $talk["date"]->add($talk["duration"]); + if ($talkEnd < $now) { + continue; + } + if ($talk["date"] > $now && count($talks) > 2) { + break; + } + array_push($talks, $talk); + } +} + +$elements = []; + +function putText($x, $y, $width, $height, $text) { + global $elements; + + $e = new monoformat\HScrollTextElement(); + $e->x = $x; + $e->y = $y; + $e->width = $width; + $e->height = $height; + $e->flags = 0; + $e->scrollSpeed = 15; + $e->fontIndex = 0; + $e->text = $text; + array_push($elements, $e); +} + +$i = 0; +foreach ($talks as $talk) { + putText(10, $i * 20, 25, 20, $talk["date"]->format("H:i")); + putText(35, $i * 20, 85, 20, $talk["title"]); + ++$i; +} + +$section = new monoformat\AlwaysDrawnSection(); +$section->drawOnFront = true; +$section->drawOnBack = true; +$section->clearBeforeDrawing = true; +$section->elements = $elements; + +$file = new monoformat\File(); +array_push($file->sections, $section); + +print($file->serialize()); +} // global + +?>