----------------------------------------------------------------------------- Open the serial port -----------------------------------------------------------------------------
| 74 | // Open the serial port |
| 75 | //----------------------------------------------------------------------------- |
| 76 | bool SerialControllerImpl::Open() |
| 77 | { |
| 78 | Log::Write(LogLevel_Info, "Trying to open serial port %s", m_owner->m_serialControllerName.c_str()); |
| 79 | |
| 80 | try |
| 81 | { |
| 82 | auto selector = SerialDevice::GetDeviceSelector(); |
| 83 | |
| 84 | return create_task(DeviceInformation::FindAllAsync(selector)) |
| 85 | .then([this](DeviceInformationCollection ^ devices) -> IAsyncOperation<SerialDevice ^> ^ |
| 86 | { |
| 87 | wstring ourId(m_owner->m_serialControllerName.begin(), m_owner->m_serialControllerName.end()); |
| 88 | for (auto iterator = devices->First(); iterator->HasCurrent; iterator->MoveNext()) |
| 89 | { |
| 90 | wstring currentId = iterator->Current->Id->Data(); |
| 91 | if (currentId.find(ourId) != wstring::npos) |
| 92 | { |
| 93 | return SerialDevice::FromIdAsync(iterator->Current->Id); |
| 94 | } |
| 95 | } |
| 96 | return create_async([]() -> SerialDevice ^ { return nullptr; }); |
| 97 | |
| 98 | }).then([this](SerialDevice ^ device) -> bool |
| 99 | { |
| 100 | if (device == nullptr) |
| 101 | { |
| 102 | return false; |
| 103 | } |
| 104 | m_serialDevice = device; |
| 105 | |
| 106 | m_serialDevice->BaudRate = m_owner->m_baud; |
| 107 | m_serialDevice->DataBits = 8; |
| 108 | switch (m_owner->m_stopBits) |
| 109 | { |
| 110 | case SerialController::StopBits::StopBits_One: |
| 111 | { |
| 112 | m_serialDevice->StopBits = SerialStopBitCount::One; |
| 113 | break; |
| 114 | } |
| 115 | case SerialController::StopBits::StopBits_OneAndAHalf: |
| 116 | { |
| 117 | m_serialDevice->StopBits = SerialStopBitCount::OnePointFive; |
| 118 | break; |
| 119 | } |
| 120 | case SerialController::StopBits::StopBits_Two: |
| 121 | { |
| 122 | m_serialDevice->StopBits = SerialStopBitCount::Two; |
| 123 | break; |
| 124 | } |
| 125 | } |
| 126 | |
| 127 | switch (m_owner->m_parity) |
| 128 | { |
| 129 | case SerialController::Parity::Parity_Even: |
| 130 | { |
| 131 | m_serialDevice->Parity = SerialParity::Even; |
| 132 | break; |
| 133 | } |