Austin Schuh | db2ed9d | 2022-12-26 14:02:26 -0800 | [diff] [blame] | 1 | #include "absl/strings/str_cat.h" |
| 2 | #include "absl/strings/str_split.h" |
| 3 | #include "aos/events/shm_event_loop.h" |
| 4 | #include "aos/init.h" |
Austin Schuh | 9f164e9 | 2022-12-29 16:15:28 -0800 | [diff] [blame] | 5 | #include "aos/realtime.h" |
Austin Schuh | db2ed9d | 2022-12-26 14:02:26 -0800 | [diff] [blame] | 6 | #include "frc971/vision/media_device.h" |
| 7 | #include "frc971/vision/v4l2_reader.h" |
| 8 | |
| 9 | DEFINE_string(config, "aos_config.json", "Path to the config file to use."); |
Ravago Jones | a0a2e06 | 2023-01-03 21:45:18 -0800 | [diff] [blame^] | 10 | DEFINE_bool(lowlight_camera, false, "Switch to use imx462 image sensor."); |
Austin Schuh | db2ed9d | 2022-12-26 14:02:26 -0800 | [diff] [blame] | 11 | |
Maxwell Henderson | ad31234 | 2023-01-10 12:07:47 -0800 | [diff] [blame] | 12 | namespace y2023 { |
Austin Schuh | db2ed9d | 2022-12-26 14:02:26 -0800 | [diff] [blame] | 13 | namespace vision { |
| 14 | namespace { |
| 15 | |
| 16 | using namespace frc971::vision; |
| 17 | |
Austin Schuh | db2ed9d | 2022-12-26 14:02:26 -0800 | [diff] [blame] | 18 | void CameraReaderMain() { |
| 19 | std::optional<MediaDevice> media_device = FindMediaDevice("platform:rkisp1"); |
| 20 | |
| 21 | if (VLOG_IS_ON(1)) { |
| 22 | media_device->Log(); |
| 23 | } |
| 24 | |
Ravago Jones | a0a2e06 | 2023-01-03 21:45:18 -0800 | [diff] [blame^] | 25 | int width = 1296; |
| 26 | int height = 972; |
| 27 | int color_format = MEDIA_BUS_FMT_SBGGR10_1X10; |
| 28 | std::string camera_device_string = "ov5647 4-0036"; |
| 29 | if (FLAGS_lowlight_camera) { |
| 30 | width = 1920; |
| 31 | height = 1080; |
| 32 | color_format = MEDIA_BUS_FMT_SRGGB10_1X10; |
| 33 | camera_device_string = "imx290 4-0036"; |
| 34 | } |
| 35 | |
Austin Schuh | db2ed9d | 2022-12-26 14:02:26 -0800 | [diff] [blame] | 36 | media_device->Reset(); |
| 37 | |
Ravago Jones | a0a2e06 | 2023-01-03 21:45:18 -0800 | [diff] [blame^] | 38 | Entity *camera = media_device->FindEntity(camera_device_string); |
| 39 | camera->pads()[0]->SetSubdevFormat(width, height, color_format); |
Austin Schuh | db2ed9d | 2022-12-26 14:02:26 -0800 | [diff] [blame] | 40 | |
| 41 | Entity *rkisp1_csi = media_device->FindEntity("rkisp1_csi"); |
Ravago Jones | a0a2e06 | 2023-01-03 21:45:18 -0800 | [diff] [blame^] | 42 | rkisp1_csi->pads()[0]->SetSubdevFormat(width, height, color_format); |
| 43 | rkisp1_csi->pads()[1]->SetSubdevFormat(width, height, color_format); |
Austin Schuh | db2ed9d | 2022-12-26 14:02:26 -0800 | [diff] [blame] | 44 | |
| 45 | // TODO(austin): Should we set this on the link? |
Austin Schuh | db2ed9d | 2022-12-26 14:02:26 -0800 | [diff] [blame] | 46 | Entity *rkisp1_isp = media_device->FindEntity("rkisp1_isp"); |
Ravago Jones | a0a2e06 | 2023-01-03 21:45:18 -0800 | [diff] [blame^] | 47 | rkisp1_isp->pads(0)->SetSubdevFormat(width, height, color_format); |
| 48 | rkisp1_isp->pads(0)->SetSubdevCrop(width, height); |
Austin Schuh | db2ed9d | 2022-12-26 14:02:26 -0800 | [diff] [blame] | 49 | |
Ravago Jones | a0a2e06 | 2023-01-03 21:45:18 -0800 | [diff] [blame^] | 50 | rkisp1_isp->pads(2)->SetSubdevFormat(width, height, MEDIA_BUS_FMT_YUYV8_2X8); |
| 51 | rkisp1_isp->pads(2)->SetSubdevCrop(width, height); |
Austin Schuh | db2ed9d | 2022-12-26 14:02:26 -0800 | [diff] [blame] | 52 | |
| 53 | Entity *rkisp1_resizer_selfpath = |
| 54 | media_device->FindEntity("rkisp1_resizer_selfpath"); |
Ravago Jones | a0a2e06 | 2023-01-03 21:45:18 -0800 | [diff] [blame^] | 55 | rkisp1_resizer_selfpath->pads(0)->SetSubdevFormat(width, height, |
Austin Schuh | db2ed9d | 2022-12-26 14:02:26 -0800 | [diff] [blame] | 56 | MEDIA_BUS_FMT_YUYV8_2X8); |
Ravago Jones | a0a2e06 | 2023-01-03 21:45:18 -0800 | [diff] [blame^] | 57 | rkisp1_resizer_selfpath->pads(1)->SetSubdevFormat(width, height, |
Austin Schuh | db2ed9d | 2022-12-26 14:02:26 -0800 | [diff] [blame] | 58 | MEDIA_BUS_FMT_YUYV8_2X8); |
Ravago Jones | a0a2e06 | 2023-01-03 21:45:18 -0800 | [diff] [blame^] | 59 | rkisp1_resizer_selfpath->pads(0)->SetSubdevCrop(width, height); |
Austin Schuh | db2ed9d | 2022-12-26 14:02:26 -0800 | [diff] [blame] | 60 | |
| 61 | Entity *rkisp1_resizer_mainpath = |
| 62 | media_device->FindEntity("rkisp1_resizer_mainpath"); |
Ravago Jones | a0a2e06 | 2023-01-03 21:45:18 -0800 | [diff] [blame^] | 63 | rkisp1_resizer_mainpath->pads(0)->SetSubdevFormat(width, height, |
Austin Schuh | db2ed9d | 2022-12-26 14:02:26 -0800 | [diff] [blame] | 64 | MEDIA_BUS_FMT_YUYV8_2X8); |
Ravago Jones | 65469be | 2023-01-13 21:28:23 -0800 | [diff] [blame] | 65 | |
Ravago Jones | a0a2e06 | 2023-01-03 21:45:18 -0800 | [diff] [blame^] | 66 | rkisp1_resizer_mainpath->pads(0)->SetSubdevCrop(width, height); |
| 67 | rkisp1_resizer_mainpath->pads(1)->SetSubdevFormat(width / 2, height / 2, |
Austin Schuh | db2ed9d | 2022-12-26 14:02:26 -0800 | [diff] [blame] | 68 | MEDIA_BUS_FMT_YUYV8_2X8); |
Austin Schuh | db2ed9d | 2022-12-26 14:02:26 -0800 | [diff] [blame] | 69 | |
| 70 | Entity *rkisp1_mainpath = media_device->FindEntity("rkisp1_mainpath"); |
Ravago Jones | a0a2e06 | 2023-01-03 21:45:18 -0800 | [diff] [blame^] | 71 | rkisp1_mainpath->SetFormat(width / 2, height / 2, V4L2_PIX_FMT_YUV422P); |
Austin Schuh | db2ed9d | 2022-12-26 14:02:26 -0800 | [diff] [blame] | 72 | |
| 73 | Entity *rkisp1_selfpath = media_device->FindEntity("rkisp1_selfpath"); |
Ravago Jones | a0a2e06 | 2023-01-03 21:45:18 -0800 | [diff] [blame^] | 74 | rkisp1_selfpath->SetFormat(width, height, V4L2_PIX_FMT_YUYV); |
Austin Schuh | db2ed9d | 2022-12-26 14:02:26 -0800 | [diff] [blame] | 75 | |
Ravago Jones | 65469be | 2023-01-13 21:28:23 -0800 | [diff] [blame] | 76 | media_device->Enable( |
Ravago Jones | a0a2e06 | 2023-01-03 21:45:18 -0800 | [diff] [blame^] | 77 | media_device->FindLink(camera_device_string, 0, "rkisp1_csi", 0)); |
Ravago Jones | 65469be | 2023-01-13 21:28:23 -0800 | [diff] [blame] | 78 | media_device->Enable( |
| 79 | media_device->FindLink("rkisp1_csi", 1, "rkisp1_isp", 0)); |
| 80 | media_device->Enable( |
| 81 | media_device->FindLink("rkisp1_isp", 2, "rkisp1_resizer_selfpath", 0)); |
| 82 | media_device->Enable( |
| 83 | media_device->FindLink("rkisp1_isp", 2, "rkisp1_resizer_mainpath", 0)); |
| 84 | |
Austin Schuh | db2ed9d | 2022-12-26 14:02:26 -0800 | [diff] [blame] | 85 | aos::FlatbufferDetachedBuffer<aos::Configuration> config = |
| 86 | aos::configuration::ReadConfig(FLAGS_config); |
| 87 | |
| 88 | aos::ShmEventLoop event_loop(&config.message()); |
| 89 | |
| 90 | event_loop.SetRuntimeRealtimePriority(55); |
Austin Schuh | 9f164e9 | 2022-12-29 16:15:28 -0800 | [diff] [blame] | 91 | event_loop.SetRuntimeAffinity(aos::MakeCpusetFromCpus({2})); |
Austin Schuh | db2ed9d | 2022-12-26 14:02:26 -0800 | [diff] [blame] | 92 | |
Ravago Jones | 65469be | 2023-01-13 21:28:23 -0800 | [diff] [blame] | 93 | RockchipV4L2Reader v4l2_reader(&event_loop, event_loop.epoll(), |
Ravago Jones | a0a2e06 | 2023-01-03 21:45:18 -0800 | [diff] [blame^] | 94 | rkisp1_selfpath->device(), camera->device()); |
Ravago Jones | 65469be | 2023-01-13 21:28:23 -0800 | [diff] [blame] | 95 | |
Ravago Jones | a0a2e06 | 2023-01-03 21:45:18 -0800 | [diff] [blame^] | 96 | if (FLAGS_lowlight_camera) { |
| 97 | v4l2_reader.SetGain(72); |
| 98 | v4l2_reader.SetExposure(30); |
| 99 | v4l2_reader.SetBlanking(2480, 45); |
| 100 | } else { |
| 101 | v4l2_reader.SetGainExt(1000); |
| 102 | v4l2_reader.SetExposure(1000); |
| 103 | } |
Austin Schuh | db2ed9d | 2022-12-26 14:02:26 -0800 | [diff] [blame] | 104 | |
Austin Schuh | db2ed9d | 2022-12-26 14:02:26 -0800 | [diff] [blame] | 105 | event_loop.Run(); |
| 106 | } |
| 107 | |
| 108 | } // namespace |
| 109 | } // namespace vision |
Maxwell Henderson | ad31234 | 2023-01-10 12:07:47 -0800 | [diff] [blame] | 110 | } // namespace y2023 |
Austin Schuh | db2ed9d | 2022-12-26 14:02:26 -0800 | [diff] [blame] | 111 | |
| 112 | int main(int argc, char **argv) { |
| 113 | aos::InitGoogle(&argc, &argv); |
Maxwell Henderson | ad31234 | 2023-01-10 12:07:47 -0800 | [diff] [blame] | 114 | y2023::vision::CameraReaderMain(); |
Austin Schuh | db2ed9d | 2022-12-26 14:02:26 -0800 | [diff] [blame] | 115 | } |