diff --git a/docusaurus.config.ts b/docusaurus.config.ts index 39d46c65d..2f6e72d25 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -84,6 +84,7 @@ const config: Config = { {to: '/blog', label: 'Blog', position: 'left'}, {to: '/research', label: 'Research', position: 'left'}, {to: '/community', label: 'Community', position: 'left'}, + {to: '/events', label: 'Events', position: 'left'}, { type: 'docsVersionDropdown', position: 'right', diff --git a/src/components/Events/events.tsx b/src/components/Events/events.tsx new file mode 100644 index 000000000..cc14851b9 --- /dev/null +++ b/src/components/Events/events.tsx @@ -0,0 +1,92 @@ +export interface Event { + title: string; + date: string; + endDate?: string; + location: string; + description: string; + link?: string; + type: "conference" | "workshop" | "meetup" | "webinar" | "hackathon" | "tutorial"; + isUpcoming: boolean; + isExternal?: boolean; // true if link goes to external site +} + +// Add your events here +// Events are automatically sorted by date +export const events: Event[] = [ + // Upcoming Events + { + title: "ReCPS: Workshop on Reactive Cyber-Physical Systems", + date: "2026-04-20", + endDate: "2026-04-22", + location: "Verona, Italy (DATE 2026 Conference)", + description: + "Workshop on Reactive Cyber-Physical Systems: Design, Simulation, and Coordination, co-located with the Design, Automation and Test in Europe (DATE) Conference 2026.", + link: "/events/recps-2026", + type: "workshop", + isUpcoming: true, + }, + // Past Events + { + title: "TCRS '25: Time-Centric Reactive Software", + date: "2025-10-02", + location: "Taipei, Taiwan (ESWEEK 2025)", + description: + "Third edition of the workshop on Time-Centric Reactive Software, co-located with Embedded Systems Week (ESWEEK) 2025 at the Taipei International Convention Center.", + link: "https://www.tcrs.io/", + type: "workshop", + isUpcoming: false, + isExternal: true, + }, + { + title: "TCRS '24: Time-Centric Reactive Software", + date: "2024-10-03", + location: "Raleigh, NC, USA (ESWEEK 2024)", + description: + "Second edition of the workshop on Time-Centric Reactive Software, co-located with Embedded Systems Week (ESWEEK) 2024.", + link: "https://www.tcrs.io/2024/", + type: "workshop", + isUpcoming: false, + isExternal: true, + }, + { + title: "TCRS '23: Time-Centric Reactive Software", + date: "2023-05-09", + location: "San Antonio, Texas (CPS-IoT Week 2023)", + description: + "First edition of the workshop on Time-Centric Reactive Software, co-located with ACM/IEEE CPS-IoT Week 2023.", + link: "https://www.tcrs.io/2023/", + type: "workshop", + isUpcoming: false, + isExternal: true, + }, + { + title: "Lingua Franca Tutorial at ESWEEK 2021", + date: "2021-10-08", + location: "Online (EMSOFT Conference)", + description: + "A comprehensive tutorial introducing Lingua Franca, a polyglot coordination language for concurrent and time-sensitive applications. Part of the Embedded Systems Week (ESWEEK) 2021.", + link: "/events/esweek-2021-tutorial", + type: "tutorial", + isUpcoming: false, + }, +]; + +// Helper to sort events by date +export const sortEventsByDate = (eventList: Event[], ascending = true): Event[] => { + return [...eventList].sort((a, b) => { + const dateA = new Date(a.date).getTime(); + const dateB = new Date(b.date).getTime(); + return ascending ? dateA - dateB : dateB - dateA; + }); +}; + +export const upcomingEvents = sortEventsByDate( + events.filter((e) => e.isUpcoming), + true +); + +export const pastEvents = sortEventsByDate( + events.filter((e) => !e.isUpcoming), + false +); + diff --git a/src/components/Events/index.tsx b/src/components/Events/index.tsx new file mode 100644 index 000000000..55e313ffe --- /dev/null +++ b/src/components/Events/index.tsx @@ -0,0 +1,231 @@ +import clsx from "clsx"; + +import Translate from "@docusaurus/Translate"; +import Layout from "@theme/Layout"; +import Heading from "@theme/Heading"; +import Link from "@docusaurus/Link"; + +import { Event, upcomingEvents, pastEvents } from "./events"; +import styles from "./styles.module.css"; + +// Calendar icon +const CalendarIcon = () => ( + + + + + + +); + +// Location pin icon +const LocationIcon = () => ( + + + + +); + +// Empty calendar icon +const EmptyCalendarIcon = () => ( + + + + + + +); + +const formatDate = (dateStr: string, endDateStr?: string): string => { + const options: Intl.DateTimeFormatOptions = { + year: "numeric", + month: "long", + day: "numeric", + }; + const startDate = new Date(dateStr).toLocaleDateString("en-US", options); + + if (endDateStr) { + const endDate = new Date(endDateStr).toLocaleDateString("en-US", options); + return `${startDate} - ${endDate}`; + } + + return startDate; +}; + +// External link icon +const ExternalLinkIcon = () => ( + + + + + +); + +const EventCard = ({ event }: { event: Event }) => { + const typeClassName = styles[event.type] || ""; + const linkProps = event.isExternal + ? { target: "_blank", rel: "noopener noreferrer" } + : {}; + + return ( +
+
+
+
+ + {event.type} + + + {event.link ? ( + + {event.title} + {event.isExternal && } + + ) : ( + event.title + )} + +
+
+
+
+

{event.description}

+
+ + {formatDate(event.date, event.endDate)} + + + {event.location} + +
+
+ {event.link && ( +
+ + {event.isExternal ? "Visit Website" : "Learn More"} + {event.isExternal && } + +
+ )} +
+ ); +}; + +const EmptyState = ({ message }: { message: string }) => ( +
+ +

{message}

+
+); + +export default function Events(): JSX.Element { + return ( + + {/* Hero Section */} +
+
+ + Events + +

+ + Join us at conferences, workshops, and tutorials to learn more about + Lingua Franca and connect with the community. + +

+
+
+ + {/* Upcoming Events */} +
+
+ + Upcoming Events + + {upcomingEvents.length > 0 ? ( +
+
+ {upcomingEvents.map((event, idx) => ( + + ))} +
+
+ ) : ( + + )} +
+
+ + {/* Past Events */} +
+
+ + Past Events + + {pastEvents.length > 0 ? ( +
+
+ {pastEvents.map((event, idx) => ( + + ))} +
+
+ ) : ( + + )} +
+
+
+ ); +} + diff --git a/src/components/Events/styles.module.css b/src/components/Events/styles.module.css new file mode 100644 index 000000000..809202199 --- /dev/null +++ b/src/components/Events/styles.module.css @@ -0,0 +1,136 @@ +/** + * Events page styles + */ + +.eventCard { + border-left: 4px solid var(--ifm-color-primary); + transition: transform 0.2s ease, box-shadow 0.2s ease; +} + +.eventCard:hover { + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); +} + +[data-theme="dark"] .eventCard:hover { + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); +} + +.eventType { + display: inline-block; + padding: 2px 10px; + border-radius: 12px; + font-size: 0.75rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.5px; +} + +.conference { + background-color: #e3f2fd; + color: #1565c0; +} + +[data-theme="dark"] .conference { + background-color: #1565c0; + color: #e3f2fd; +} + +.workshop { + background-color: #f3e5f5; + color: #7b1fa2; +} + +[data-theme="dark"] .workshop { + background-color: #7b1fa2; + color: #f3e5f5; +} + +.meetup { + background-color: #e8f5e9; + color: #2e7d32; +} + +[data-theme="dark"] .meetup { + background-color: #2e7d32; + color: #e8f5e9; +} + +.webinar { + background-color: #fff3e0; + color: #ef6c00; +} + +[data-theme="dark"] .webinar { + background-color: #ef6c00; + color: #fff3e0; +} + +.hackathon { + background-color: #fce4ec; + color: #c2185b; +} + +[data-theme="dark"] .hackathon { + background-color: #c2185b; + color: #fce4ec; +} + +.tutorial { + background-color: #e0f7fa; + color: #00838f; +} + +[data-theme="dark"] .tutorial { + background-color: #00838f; + color: #e0f7fa; +} + +.eventMeta { + display: flex; + flex-wrap: wrap; + gap: 16px; + margin-top: 8px; + font-size: 0.9rem; + color: var(--ifm-color-emphasis-700); +} + +.eventMeta svg { + margin-right: 4px; + vertical-align: middle; +} + +.emptyState { + text-align: center; + padding: 60px 20px; + color: var(--ifm-color-emphasis-600); +} + +.emptyState svg { + margin-bottom: 16px; + opacity: 0.5; +} + +.heroSection { + background: linear-gradient(135deg, var(--ifm-color-primary-darker) 0%, var(--ifm-color-primary) 100%); + color: white; + padding: 60px 0; + text-align: center; +} + +[data-theme="dark"] .heroSection { + background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%); +} + +.heroTitle { + color: white; + margin-bottom: 16px; +} + +.heroSubtitle { + opacity: 0.9; + max-width: 600px; + margin: 0 auto; + font-size: 1.1rem; +} + diff --git a/src/pages/events.tsx b/src/pages/events.tsx new file mode 100644 index 000000000..4f1495983 --- /dev/null +++ b/src/pages/events.tsx @@ -0,0 +1,3 @@ +import Events from "@site/src/components/Events"; +export default Events; + diff --git a/src/pages/events/esweek-2021-tutorial.tsx b/src/pages/events/esweek-2021-tutorial.tsx new file mode 100644 index 000000000..80c441d7c --- /dev/null +++ b/src/pages/events/esweek-2021-tutorial.tsx @@ -0,0 +1,339 @@ +import clsx from "clsx"; +import Layout from "@theme/Layout"; +import Heading from "@theme/Heading"; +import Link from "@docusaurus/Link"; + +import styles from "./event-page.module.css"; + +interface VideoSection { + title: string; + description: string; + videoUrl: string; + topics: { name: string; timestamp: string; url: string }[]; +} + +const videoSections: VideoSection[] = [ + { + title: "Part I: Introduction", + description: + "This part briefly describes the background of the project and explains how to get started with the software.", + videoUrl: + "https://www.youtube.com/watch?v=7vkhX5tS_oI&list=PL4zzL7roKtfXyKE3k8lOwPub9YEjulS4o&index=1", + topics: [ + { + name: "Introduction", + timestamp: "0:00", + url: "https://www.youtube.com/watch?v=7vkhX5tS_oI&list=PL4zzL7roKtfXyKE3k8lOwPub9YEjulS4o&index=1&t=0s", + }, + { + name: "Motivation", + timestamp: "1:01", + url: "https://www.youtube.com/watch?v=7vkhX5tS_oI&list=PL4zzL7roKtfXyKE3k8lOwPub9YEjulS4o&index=1&t=61s", + }, + { + name: "Overview of this tutorial", + timestamp: "3:05", + url: "https://www.youtube.com/watch?v=7vkhX5tS_oI&list=PL4zzL7roKtfXyKE3k8lOwPub9YEjulS4o&index=1&t=185s", + }, + { + name: "History of the project", + timestamp: "11:08", + url: "https://www.youtube.com/watch?v=7vkhX5tS_oI&list=PL4zzL7roKtfXyKE3k8lOwPub9YEjulS4o&index=1&t=668s", + }, + { + name: "Participating", + timestamp: "14:57", + url: "https://www.youtube.com/watch?v=7vkhX5tS_oI&list=PL4zzL7roKtfXyKE3k8lOwPub9YEjulS4o&index=1&t=897s", + }, + { + name: "Getting started", + timestamp: "15:25", + url: "https://www.youtube.com/watch?v=7vkhX5tS_oI&list=PL4zzL7roKtfXyKE3k8lOwPub9YEjulS4o&index=1&t=925s", + }, + { + name: "Native releases (Epoch IDE and lfc)", + timestamp: "17:43", + url: "https://www.youtube.com/watch?v=7vkhX5tS_oI&list=PL4zzL7roKtfXyKE3k8lOwPub9YEjulS4o&index=1&t=1063s", + }, + { + name: "Virtual Machine with LF pre-installed", + timestamp: "21:51", + url: "https://www.youtube.com/watch?v=7vkhX5tS_oI&list=PL4zzL7roKtfXyKE3k8lOwPub9YEjulS4o&index=1&t=1311s", + }, + ], + }, + { + title: "Part II: Hello World", + description: + "This part introduces the language with a simple example.", + videoUrl: + "https://www.youtube.com/watch?v=GNwaf4OpfPM&list=PL4zzL7roKtfXyKE3k8lOwPub9YEjulS4o&index=2", + topics: [ + { + name: "Open Epoch and create a project", + timestamp: "0:00", + url: "https://www.youtube.com/watch?v=GNwaf4OpfPM&list=PL4zzL7roKtfXyKE3k8lOwPub9YEjulS4o&index=2&t=0s", + }, + { + name: "Hello World", + timestamp: "1:44", + url: "https://www.youtube.com/watch?v=GNwaf4OpfPM&list=PL4zzL7roKtfXyKE3k8lOwPub9YEjulS4o&index=2&t=104s", + }, + { + name: "Adding a timer", + timestamp: "4:44", + url: "https://www.youtube.com/watch?v=GNwaf4OpfPM&list=PL4zzL7roKtfXyKE3k8lOwPub9YEjulS4o&index=2&t=284s", + }, + ], + }, + { + title: "Part III: Target Languages", + description: + "This part describes how different target languages work with Lingua Franca.", + videoUrl: + "https://www.youtube.com/watch?v=k0LtpH9VFCE&list=PL4zzL7roKtfXyKE3k8lOwPub9YEjulS4o&index=3", + topics: [], + }, + { + title: "Part IV: Basic Concepts", + description: + "This part covers fundamental concepts including composing reactors, parameters, state variables, and physical actions.", + videoUrl: + "https://www.youtube.com/watch?v=tl3F_jgc248&list=PL4zzL7roKtfXyKE3k8lOwPub9YEjulS4o&index=4", + topics: [], + }, + { + title: "Part V: Concurrency", + description: + "This part focuses on how the language expresses concurrency, exploits multicore, and supports distributed execution.", + videoUrl: + "https://www.youtube.com/watch?v=MoTf8L0jOD0&list=PL4zzL7roKtfXyKE3k8lOwPub9YEjulS4o&index=5", + topics: [ + { + name: "Introduction", + timestamp: "0:00", + url: "https://www.youtube.com/watch?v=MoTf8L0jOD0&list=PL4zzL7roKtfXyKE3k8lOwPub9YEjulS4o&index=5&t=0s", + }, + { + name: "Banks and Multiports", + timestamp: "0:39", + url: "https://www.youtube.com/watch?v=MoTf8L0jOD0&list=PL4zzL7roKtfXyKE3k8lOwPub9YEjulS4o&index=5&t=39s", + }, + { + name: "Utilizing Multicore", + timestamp: "9:29", + url: "https://www.youtube.com/watch?v=MoTf8L0jOD0&list=PL4zzL7roKtfXyKE3k8lOwPub9YEjulS4o&index=5&t=569s", + }, + { + name: "Tracing", + timestamp: "17:49", + url: "https://www.youtube.com/watch?v=MoTf8L0jOD0&list=PL4zzL7roKtfXyKE3k8lOwPub9YEjulS4o&index=5&t=1069s", + }, + { + name: "Performance", + timestamp: "23:40", + url: "https://www.youtube.com/watch?v=MoTf8L0jOD0&list=PL4zzL7roKtfXyKE3k8lOwPub9YEjulS4o&index=5&t=1420s", + }, + { + name: "Federated Execution", + timestamp: "29:25", + url: "https://www.youtube.com/watch?v=MoTf8L0jOD0&list=PL4zzL7roKtfXyKE3k8lOwPub9YEjulS4o&index=5&t=1765s", + }, + ], + }, + { + title: "Part VI: Research Overview", + description: + "This part focuses on a few of the research projects that have been stimulated by the Lingua Franca project.", + videoUrl: + "https://www.youtube.com/watch?v=afJowM35YHg&list=PL4zzL7roKtfXyKE3k8lOwPub9YEjulS4o&index=6", + topics: [ + { + name: "Introduction", + timestamp: "0:00", + url: "https://www.youtube.com/watch?v=afJowM35YHg&list=PL4zzL7roKtfXyKE3k8lOwPub9YEjulS4o&index=6&t=0s", + }, + { + name: "AUTOSAR", + timestamp: "6:15", + url: "https://www.youtube.com/watch?v=afJowM35YHg&list=PL4zzL7roKtfXyKE3k8lOwPub9YEjulS4o&index=6&t=375s", + }, + { + name: "Autoware/Carla", + timestamp: "14:27", + url: "https://www.youtube.com/watch?v=afJowM35YHg&list=PL4zzL7roKtfXyKE3k8lOwPub9YEjulS4o&index=6&t=867s", + }, + { + name: "Bare Iron Platforms", + timestamp: "27:43", + url: "https://www.youtube.com/watch?v=afJowM35YHg&list=PL4zzL7roKtfXyKE3k8lOwPub9YEjulS4o&index=6&t=1663s", + }, + { + name: "Modal Models", + timestamp: "34:36", + url: "https://www.youtube.com/watch?v=afJowM35YHg&list=PL4zzL7roKtfXyKE3k8lOwPub9YEjulS4o&index=6&t=2076s", + }, + { + name: "Automated Verification", + timestamp: "40:32", + url: "https://www.youtube.com/watch?v=afJowM35YHg&list=PL4zzL7roKtfXyKE3k8lOwPub9YEjulS4o&index=6&t=2432s", + }, + { + name: "Secure Federated Execution", + timestamp: "47:57", + url: "https://www.youtube.com/watch?v=afJowM35YHg&list=PL4zzL7roKtfXyKE3k8lOwPub9YEjulS4o&index=6&t=2877s", + }, + { + name: "LF Language Server", + timestamp: "54:07", + url: "https://www.youtube.com/watch?v=afJowM35YHg&list=PL4zzL7roKtfXyKE3k8lOwPub9YEjulS4o&index=6&t=3247s", + }, + ], + }, +]; + +const VideoCard = ({ section }: { section: VideoSection }) => ( +
+
+ {section.title} +
+
+

{section.description}

+ {section.topics.length > 0 && ( +
+ Topics covered: +
    + {section.topics.map((topic, idx) => ( +
  • + + {topic.name} ({topic.timestamp}) + +
  • + ))} +
+
+ )} +
+
+ + Watch Video + +
+
+); + +export default function ESWEEKTutorial() { + return ( + + {/* Hero Section */} +
+
+
Past Event
+ + Lingua Franca Tutorial + +

+ EMSOFT Conference at Embedded Systems Week (ESWEEK) 2021 +

+
+ 📅 October 8, 2021 + 📍 Online +
+
+
+ + {/* Overview Section */} +
+
+
+
+ About This Tutorial +

+ Lingua Franca (LF) is a polyglot coordination language for + concurrent and possibly time-sensitive applications ranging from + low-level embedded code to distributed cloud and edge + applications. This tutorial was offered on October 8, 2021, as + part of the EMSOFT conference at ESWEEK (Embedded Systems Week). +

+

+ The complete tutorial is available as a{" "} + + video playlist on YouTube + + , organized into six segments covering everything from basic + concepts to advanced research topics. +

+ +
+ Quick Links +
    +
  • + + Complete Video Playlist + +
  • +
  • + + Original Tutorial Wiki Page + +
  • +
  • + Current Lingua Franca Documentation +
  • +
+
+
+
+
+
+ + {/* Video Sections */} +
+
+ + Tutorial Videos + +
+
+ {videoSections.map((section, idx) => ( + + ))} +
+
+
+
+ + {/* Call to Action */} +
+
+ Ready to Get Started? +

+ Check out our up-to-date documentation and start building with + Lingua Franca today. +

+
+ + Install Lingua Franca + + + Read the Docs + +
+
+
+
+ ); +} + diff --git a/src/pages/events/event-page.module.css b/src/pages/events/event-page.module.css new file mode 100644 index 000000000..662cbe43b --- /dev/null +++ b/src/pages/events/event-page.module.css @@ -0,0 +1,202 @@ +/** + * Shared styles for individual event pages + */ + +.heroSection { + background: linear-gradient( + 135deg, + var(--ifm-color-primary-darker) 0%, + var(--ifm-color-primary) 100% + ); + color: white; + padding: 80px 0; + text-align: center; +} + +[data-theme="dark"] .heroSection { + background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%); +} + +.heroTitle { + color: white; + margin-bottom: 8px; + font-size: 3rem; +} + +.heroSubtitle { + opacity: 0.95; + max-width: 700px; + margin: 0 auto 24px; + font-size: 1.25rem; +} + +.eventBadge { + display: inline-block; + padding: 4px 16px; + border-radius: 20px; + font-size: 0.85rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.5px; + margin-bottom: 16px; + background-color: rgba(255, 255, 255, 0.2); + color: white; +} + +.eventBadge.upcoming { + background-color: #4caf50; +} + +.eventMeta { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 24px; + margin-top: 24px; + font-size: 1.1rem; +} + +.eventMeta span { + display: flex; + align-items: center; + gap: 6px; +} + +.heroLink { + color: white; + text-decoration: underline; +} + +.heroLink:hover { + color: rgba(255, 255, 255, 0.85); +} + +/* Video card styles */ +.videoCard { + border-left: 4px solid var(--ifm-color-primary); +} + +.topicList { + margin-top: 16px; +} + +.topicList ul { + margin-top: 8px; + margin-bottom: 0; +} + +.topicList li { + margin-bottom: 4px; +} + +/* Resource links */ +.resourceLinks { + margin-top: 32px; + padding: 24px; + background-color: var(--ifm-color-emphasis-100); + border-radius: 8px; +} + +.resourceLinks ul { + margin-bottom: 0; +} + +/* CTA buttons */ +.ctaButtons { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 16px; + margin-top: 24px; +} + +/* Info box for upcoming events */ +.infoBox { + margin-top: 32px; + padding: 24px; + background-color: #e3f2fd; + border-left: 4px solid var(--ifm-color-primary); + border-radius: 4px; +} + +[data-theme="dark"] .infoBox { + background-color: rgba(33, 150, 243, 0.15); +} + +.infoBox h3 { + margin-top: 0; +} + +.infoBox p:last-child { + margin-bottom: 0; +} + +/* Placeholder cards */ +.placeholderCard { + height: 100%; + text-align: center; +} + +.placeholderCard .card__body { + color: var(--ifm-color-emphasis-600); + font-style: italic; +} + +/* Dates list */ +.datesList { + list-style: none; + padding-left: 0; + margin-bottom: 0; +} + +.datesList li { + padding: 12px 0; + border-bottom: 1px solid var(--ifm-color-emphasis-200); +} + +.datesList li:last-child { + border-bottom: none; + padding-bottom: 0; +} + +.datesList li:first-child { + padding-top: 0; +} + +/* Organizers list */ +.organizersList { + list-style: none; + padding-left: 0; + margin-bottom: 0; +} + +.organizersList li { + padding: 8px 0; +} + +/* Responsive adjustments */ +@media (max-width: 768px) { + .heroTitle { + font-size: 2rem; + } + + .heroSubtitle { + font-size: 1rem; + } + + .eventMeta { + flex-direction: column; + gap: 12px; + } + + .ctaButtons { + flex-direction: column; + align-items: center; + } + + .ctaButtons .button { + width: 100%; + max-width: 280px; + } +} + diff --git a/src/pages/events/recps-2026.tsx b/src/pages/events/recps-2026.tsx new file mode 100644 index 000000000..f3dbfad73 --- /dev/null +++ b/src/pages/events/recps-2026.tsx @@ -0,0 +1,278 @@ +import clsx from "clsx"; +import Layout from "@theme/Layout"; +import Heading from "@theme/Heading"; +import Link from "@docusaurus/Link"; + +import styles from "./event-page.module.css"; + +export default function ReCPS2026() { + return ( + + {/* Hero Section */} +
+
+
+ Upcoming Event +
+ + Reactive CPS (ReCPS) + +

+ Workshop on Reactive Cyber-Physical Systems: Design, Simulation, and + Coordination +

+
+ 📅 April 20-22, 2026 + 📍 Verona, Italy + + 🎯 Co-located with{" "} + + DATE 2026 + + +
+
+
+ + {/* About Section */} +
+
+
+
+ About the Workshop +

+ The Reactive CPS (ReCPS) Workshop at{" "} + DATE 2026{" "} + is a new workshop dedicated to the modeling, design, simulation, + analysis, and verification of reactive cyber-physical systems + (CPS). ReCPS emphasizes reactive CPS architectures that + continuously interact with their environment in real time, + leveraging methodologies and tools such as the reactor model of + computation and the{" "} + Lingua Franca coordination language. +

+ + + Tentative Workshop Program + +

The workshop program will feature:

+
    +
  • + Keynote talk by Prof. Edward A. Lee, UC Berkeley +
  • +
  • + Presentations of technical papers +
  • +
  • + Demo sessions +
  • +
+ +
+
+
+
+ + {/* Organizers Section */} +
+
+
+
+ + 👥 Organizers + +
+
+
    +
  • + General Chair: Hokeun Kim (Arizona State + University, United States) +
  • +
  • + Program Chair: Sebastiano Gaiardelli + (University of Verona, Italy) +
  • +
+
+
+
+
+
+
+ + {/* Important Dates Section */} +
+
+
+
+ + 📅 Important Dates + +
+
+
    +
  • + February 16, 2026: Research papers and + demo abstracts submission deadline +
  • +
  • + March 2, 2026: Notification of acceptance +
  • +
  • + April 20-22, 2026: Workshop at DATE 2026, + Verona, Italy +
  • +
+
+
+
+
+
+
+ + {/* Topics Section */} +
+
+
+
+ + 📋 Topics of Interest + +

Scope and topics to be considered include:

+
+
+
+
+
    +
  • Cyber-physical production systems (CPPS)
  • +
  • Safety-critical CPS
  • +
  • Distributed CPS
  • +
  • Real-time scheduling and coordination
  • +
  • Simulation of CPS
  • +
  • Digital twins
  • +
+
+
+
    +
  • Verification and testing of CPS
  • +
  • Predictability and determinism of CPS
  • +
  • Integration and deployment of CPS
  • +
  • AI/ML-driven autonomous CPS
  • +
  • Modeling & simulation of human-in-the-loop CPS
  • +
  • CPS-human interaction via LLMs
  • +
+
+
+
+
+
+
+
+
+ + {/* Submission Section */} +
+
+
+
+ + 📝 Submission Guidelines + +

We invite the following types of contributions:

+ +
+
+ Research Papers +
+
+

+ Original research contributions on topics related to + reactive cyber-physical systems design, simulation, + verification, and deployment. +

+
    +
  • + Page limit: 4 pages (including references) +
  • +
  • + Format: IEEE conference format +
  • +
+
+
+ +
+
+ Demo Abstracts +
+
+

+ Short abstracts describing working prototypes, tools, or + demonstrations related to reactive CPS and the Lingua Franca + ecosystem. +

+
    +
  • + Page limit: 2 pages (including references) +
  • +
  • + Format: IEEE conference format +
  • +
+
+
+ +
+
+ Review Process +
+
+

+ Single blind review (no need to anonymize submissions) by a program committee with acceptance + decisions. +

+

+ Submission system: EasyChair (link coming + soon) +

+
+
+ +
+
+
+
+ + {/* Related Links */} +
+
+ Related Resources +

Learn more about reactive programming and Lingua Franca.

+
+ + DATE 2026 Conference + + + Lingua Franca Docs + + + Research Publications + +
+
+
+
+ ); +}